Python武器库开发-常用模块之requests模块(十三)

news/2024/11/26 19:47:43/

常用模块之requests模块(十三)

requests模块是一个很实用的Python HTTP客户端库,爬虫和测试服务器响应数据时经常会用到,它是python语言的第三方的库,专门用于发送HTTP请求,使用起来比urllib更简洁也更强大。

使用以下的命令安装request模块

pip install requests

我们可以使用以下语句,导入requests模块

import requests

requests模块常用的方法如下表:

序号方法描述
1requests.request(url)构造一个请求,支持以下各种方法
2requests.get()发送一个Get请求
3requests.post()发送一个Post请求
4requests.head()获取HTML的头部信息
5requests.put()发送Put请求
6requests.patch()提交局部修改的请求
7requests.delete()提交删除请求

其中最常用的方法为get()和post(),分别用于发送Get请求和Post请求

requests模块常用的属性如下表:

序号属性或方法描述
1response.status_code响应状态码
2response.content把response对象转换为二进制数据
3response.text把response对象转换为字符串数据
4response.encoding定义response对象的编码
5response.cookie获取请求后的cookie
6response.url获取请求网址
7response.json()内置的JSON解码器
8Response.headers以字典对象存储服务器响应头,字典键不区分大小写

发送请求

比如我们想要向某个网站发送一个请求:

#使用requests库前都要导入requests库
import requests#发送GET,POST,PUT,DELETE,HEAD 以及 OPTIONS 请求
r = requests.get('https://www.baidu.com')
r = requests.post('https://www.baidu.com')
r = requests.put('https://www.baidu.com')
r = requests.delete('https://www.baidu.com')
r = requests.head('https://www.baidu.com')

响应状态码、响应头、响应体

当请求返回后,我们如何查看响应对象的内容

import requests
respone = requests.get("http://www.baidu.com")
# 查看响应状态码
respone.status_code
# 查看响应头
respone.headers
# 查看响应体,未进行解码
respone.content
# 查看响应体,解码之后的
respone.text
# 查看当前的 encoding
respone.encoding

实列代码输出如下:

在这里插入图片描述

Json

手动将 json 格式的响应体转换为字典

import json
import requests# 这里请求 postman 提供的地址,他会返回一个 json 格式的响应体
url = 'https://postman-echo.com/ip'
resp = requests.get(url)# 获取响应头
headers = resp.headers# 获取响应头 Content-Type ;这个头告诉客户端响应体的格式
content_type = headers.get('Content-Type','no [Content-Type] header')# 判断是否是 json 格式的响应体
if 'application/json' in content_type:# 获取响应体content = resp.content# 通过 json.loads 解析为字典dict_data = json.loads(content)# 查看 dict_dataprint(type(dict_data))
else:print(f'响应体格式是:{content_type} ,不是 json 格式的')

通过 响应对象的 json 方法

import requests# 这里请求 postman 提供的地址,他会返回一个 json 格式的响应体
url = 'https://postman-echo.com/ip'
resp = requests.get(url)# 通过响应对象的 json 方法获取 json 数据
print(resp.json())
# {'ip': '140.206.149.83'}

如果 JSON 解码失败, r.json() 就会抛出一个异常。例如,响应内容是 html 格式的,尝试访问 r.json() 将会抛出异常。

import requests# 这里请求百度首页
url = 'http://www.baidu.com'# 请求 baidu 的首页,这里会获得 html
resp = requests.get(url)# 响应体不是 json 类型,会抛出异常
print(resp.json())# 抛出异常
# ......
# JSONDecodeError: Expecting value: line 1 column 1 (char 0)

传递URL参数

import requests# 这个接口会把我们传递的 url 参数,通过响应体返回
url = 'https://postman-echo.com/get'# GET请求时传递参数
payload = {'key1': 'value1', 'key2': 'value2', 'key3': ['value3', 'valua4']}# 通过 params 参数传递 url 参数
resp = requests.get(url, params=payload)# 查看发起请求的的完整 url
print(resp.url)# 查看响应体
print(resp.json())# 手动拼接参数
url = 'https://postman-echo.com/get?key1=value1&key2=value2&key3=value3&key3=value4'
resp = requests.get(url)# 查看响应体 json
print(resp.json())

定制请求头

import requests# 这个接口会把我们携带的请求头通过响应体返回
url = 'https://postman-echo.com/headers'# 定义请求头字典
headers = {'test-header': 'my-accept'}# 通过 headers 参数传递自定义请求头
resp = requests.get(url, headers=headers)# 查看响应体 json
print(resp.json())

注意: 所有的 header 值必须是 string、bytestring 或者 unicode。尽管传递 unicode header 也是允许的,但不建议这样做

Cookie

快速访问响应的cookie

import requests# 访问这个接口时,服务器会返回一个 cookie
url = 'https://postman-echo.com/cookies'resp = requests.get(url)# 通过响应对象的 cookies 属性查看服务器返回的 cookie
print(resp.cookies)#  <RequestsCookieJar[<Cookie sails.sid=s%3AXnK01xxH1XlWurud4tQ4vHaYyyBZtl0U.1EHKamEv2C%2BiZ7C%2Fo9xhWWBNWOPVCOYgAMgn7tPH97Y for postman-echo.com/>]

从 http 协议的角度来说,服务返回的 cookie 是通过响应头的 set-cookie 返回的,requests 包会自动解析 set-cookie 响应头,将解析的 cookies 放到响应对象的 cookies 属性中,所以我们也可以通过 resp.headers 查看 cookie 的响应头。

发送cookies到服务器

import requests# 这个接口会把我们携带的cookies通过响应体返回
url = 'https://postman-echo.com/cookies'# 构建 cookie
cookies = {'foo1':'foo1','foo2':'foo2'
}# 通过 cookies 参数发送 cookies
resp = requests.get(url, cookies=cookies)# 查看响应体 json
print(resp.json())

把 Cookie Jar 传到 Requests 中:

import requests# 新建 RequestsCookieJar 对象
jar = requests.cookies.RequestsCookieJar()# 通过 set 方法添加 cookie
jar.set('foo1', 'f001')
jar.set('foo2', 'f0002')# 这个接口会把我们携带的cookies通过响应体返回
url = 'https://postman-echo.com/cookies'# 通过 cookies 参数传递 cookiejar 对象
resp = requests.get(url, cookies=jar)# 查看响应体 json
print(resp.json())

POST 发送 json 数据

除了 get 请求方法之外,我们常用的还有 post 方法,使用 requests可以方便的发送 json 数据给服务器。我们把 python 的字典传递给 post 方法的 json 参数即可。

import requestsauth = {"username":"admin","password":"admin1234"
}
# 调用登录接口
url = 'http://localhost:8000/login/'
# 将 auth 传递给 json
resp = requests.post(url, json=auth)
# 查看响应体 json
print(resp.json())

Session

我们通过浏览器进行登录操作时,服务器会返回cookie,浏览器会把这些 cookie 存储下来,下次发起请求就把之前保存的 cookie 携带着发送给服务器,从而实现了状态保持。

我们通过 requests.[get|post|…] 进行登录操作或者其他操作,服务器返回了 cookie,下次再通过 requests.[get|post|…] 发起其他请求时,requests 并不会把前面请求的 cookie 携带着发送给服务器,也就是说我们通过 requests.[get|post|…] 是无法自动实现状态保持的。

我们可以通过 requests.Session 来实现状态保持,我们通过 Session 对象的 [get|post|…] 方法发起请求,session 对象会自动保存响应的 cookie,并且下次发起请求时自动携带着这些 cookie。session.cookies 可以查看 session 中保存的所有 cookie。

需求:获取用户信息。获取用户信息必须先调用进行用户登录接口,在调用获取用户信息接口。

requests 方式

from requests import Requestauth = {"username":"admin","password":"admin1234"
}
# 调用登录接口
login_url = 'http://localhost:8000/login/'# 将 auth 传递给 json
resp = requests.post(login_url, json=auth)print(resp.json())# 调用用户信息接口
info_url = 'http://localhost:8000/info/'resp = requests.get(info_url)print(resp.json())

session 方式

from requests import Request, Session# 新建 session 对象
session = Session()# 查看 session 中的 cookie
print(session.cookies)auth = {"username":"admin","password":"admin1234"
}
# 调用登录接口
login_url = 'http://localhost:8000/login/'# 通过 session 发起请求
resp = session.post(login_url, json=auth)# 通过 resp.cookies 查看
print(session.cookies)print(resp.json())# 调用用户信息接口
info_url = 'http://localhost:8000/info/'resp = session.get(info_url)print(resp.json())

session.cookies 操作

session.cookies 对象类似于字典,我们可以通过操作字典的方式操作 cookies

from requests import Sessionsession = Session()print(session.cookies)# 添加 cookie
session.cookies['cookie-1']='value-1'
print(session.cookies)# 修改 cookie
session.cookies['cookie-1']='value-1-updated'
print(session.cookies)# 查看 cookie
print(session.cookies['cookie-1'])
print(session.cookies.get('cookie-1'))# 删除
del session.cookies['cookie-1']
print(session.cookies)

session 请求头

使用 cookie 的状态保持本身有一些缺陷,因为浏览器发起请求时会自动携带 cookie,攻击者利用这一点进行跨域攻击 CSRF。为了避免这种情况发生,有一种解决方案是: 将认证信息添加到自定义的请求头中,由于是自定义的请求头,浏览器也就无法自动携带该请求头,我们需要在发起 ajax 请求的时候,手动添加该请求头。

在 session 中我们可以通过把 自定义的请求头 放入 session.headers 中,那么每次通过 session 对象发起请求的时候,就会自动携带者该请求头,不用每次都通过 headers 参数来携带。

session.headers 和 cookies 类似,也是字典格式的对象。

from requests import Session# 这个接口会把我们携带的请求头通过响应体返回
url = 'https://postman-echo.com/headers'# 新建 session 对象
session = Session()# 打印 session.headers 的默认值
print(session.headers)# 添加自定义请求头
session.headers['Auth-Token'] = 'some token xxxxx'resp = session.get(url)# 查看响应体 json
print(resp.json())# 如果添加了 headers 参数,那么会和 session.headers 合并
resp = session.get(url,headers={'my-header':'header-value'})
print(resp.json())# headers 参数不会被保存到 session.headers 中,只对当请求有效
print(session.headers)

http://www.ppmy.cn/news/1192379.html

相关文章

C++中abs()函数的坑

问题描述&#xff1a;如下C代码&#xff0c; #include <iostream>using namespace std;int main() {uint64_t a 1, b 2;if (abs(a - b) > 1) {cout << "差值大于1&#xff01;" << endl;} else {cout << "差值小于等于1&#xff…

微信自动回复有什么好处?怎么设置?

微信自动回复有什么好处&#xff1f; 首先&#xff0c;它可以帮助我们节省时间和精力。当我们无法立即回复消息时&#xff0c;自动回复可以及时告知对方我们的状况&#xff0c;避免对方的焦虑和不便。 其次&#xff0c;自动回复可以增强沟通效率。无论是工作还是个人生活中&a…

生成独立运行的QT程序

前言 使用windeployqt程序生成独立运行的QT程序。 方法 1.在QT Creator使用release构建运行一下代码&#xff0c;不使用debug模式&#xff0c;将release文件夹中生成的***.exe文件复制到一个新的文件夹下。 2.打开 Qt 5.14.2(MinGW 7.3.0 64-bit) 进入exe文件所在的目录执…

ZYNQ实验---IQ调制实现SSB PART2

一、前言 本文实验在ZYNQ实验—IQ调制实现SSB PART1的基础上进行优化完善。 下图为IQ调制实现SSB PART1中设想实现设计框图 该图设计存在的几个问题&#xff1a; PC-PS的UDP传输存在丢包中断控制发包实际不适合流数据的传输采用的BRAM模块可以存储的空间较小&#xff0c;PC…

1022 Digital Library(30分)

题目翻译&#xff1a; 接下来包含这 N 本书的具体信息&#xff0c;每本书的相关信息占 6 行&#xff1a; 第一行&#xff1a;书的 ID&#xff0c;一个 7 位数字。 第二行&#xff1a;书名&#xff0c;一个长度不超过 80 的字符串。 第三行&#xff1a;作者&#xff0c;一个长…

html代码,无法替换,《\n》,字符串,解决方法:test.replace(/\\n/g, “<br/>“)

html代码&#xff0c;无法替换&#xff0c;《\n》&#xff0c;字符串&#xff0c;解决方法&#xff1a;test.replace(/\\n/g, "<br/>")

深度强化学习中的神经网络部分的作用是什么?一般如何选择合适的神经网络呢?

在深度强化学习中&#xff0c;神经网络部分通常用于实现值函数近似或策略近似&#xff0c;以帮助智能体学习如何在一个环境中做出决策以获得最大的累积奖励。这些神经网络在深度强化学习中扮演着重要的角色&#xff0c;具体作用如下&#xff1a; 1.值函数近似&#xff08;Valu…

Spring MVC (Next-1)

1.Restful请求 restFul是符合rest架构风格的网络API接口,完全承认Http是用于标识资源。restFul URL是面向资源的&#xff0c;可以唯一标识和定位资源。 对于该URL标识的资源做何种操作是由Http方法决定的。 rest请求方法有4种&#xff0c;包括get,post,put,delete.分别对应获取…