1.requests
该库可以发起http协议的请求,比python原生的urllib更加方便,所以经常会用在爬虫、测试等方向
1.1 安装
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
1.2 请求方式
请求方式包括,get、post、put、patch、delete、options、header
。使用的时候可以requests.方法名(),例如requests.get()发起GET请求。当然,也可以使用request()方法传入method参数确定请求方式
以下是发起get请求,其他请求方式一样
import requests
# 方法1:请求方式对应的方法名
req = requests.get(url="https://postman-echo.com/ip")
# 方法2:使用request()方法指定method参数
req = requests.request(method="get", url="https://postman-echo.com/ip")
print(req.content) # 打印原始未解码数据(二进制)
1.3 常用的请求参数
requests.请求方式(url, **kwargs)
参数 | 请求方式 | 说明 |
---|---|---|
url | 请求的url | |
params | get | 字典,发起get请求,查询字符串参数,也可以直接在url后面用?号拼接 |
headers | 字典,请求头参数 | |
cookies | 字典,指定发起请求携带的cookies | |
json | post | 字典,发起post请求,请求体是json格式 |
files | post | 字典,请求的文件 |
data | post | 字典,请求体,即表单数据 |
timeout | 超时时间,单位是秒 | |
proxies | 字典,代理,键为http或https |
- get请求
import requests
# 请求url
url = 'https://postman-echo.com/get'
# 请求参数
params = {
"name": "pan"
}
# 发起GET请求
req = requests.get(url=url, params=params)
print(req.text)
- post请求
import requests
import json
url = "http://www.test.com/regist/"
# 表单数据
data = {
"name": "pan",
"password": "12345"
}
# json数据
json = json.dumps({'name': 'pan', 'password': '12345'}) # 将python对象转换成json数据
# 指定要上传的文件
files = {'file': open('C://test.txt', 'rb')}
# r = requests.post(url=url, json=data, files=files) # 以json发送数据
r = requests.post(url=url, data=data, files=files) # 以表单发送数据
- headers请求
import requests
# 请求url
url = 'https://postman-echo.com/headers'
# 请求头
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0"
}
# 发起GET请求
req = requests.get(url=url, headers=headers)
print(req.text)
- 携带cookies的get请求
import requests
# 请求url
url = 'https://postman-echo.com/cookies'
# 请求cookies
cookies = {
"username": "pan"
}
# 发起GET请求
req = requests.get(url=url, cookies=cookies)
print(req.text)
2.Response
当我们成功发起请求之后应该会得到一个响应,我们再处理响应数据,该响应是一个Response类型
2.1 常用属性
属性 | 说明 |
---|---|
status_code | 响应码,200表示成功 |
text | 响应体解码数据,可能会出现乱码,可以手动更改 |
content | 响应体原始数据(二进制) |
headers | 响应头 |
encoding | 网页编码 |
cookies | 服务器返回的cookies |
request | 请求方式 |
import requests
url = "https://postman-echo.com/ip"
req = requests.get(url=url)
print("type:", type(req))
print("status_code", req.status_code)
print("encoding", req.encoding)
req.encoding = "utf-8" # 如果内容出现乱码,可以手动指定正确的编码
print("headers", req.headers)
print("cookies ", req.cookies)
print(req.text)
2.2 Response.json()
如果返回值是json格式,我们完全可以直接使用json()方法将返回的字符串转换成python对象而不需要手动导入json库再转换
req = requests.get(url=url)
print(req.text)
print(type(req.text))
print(req.json())
print(type(req.json()))
"""
# 输出:
{"ip":"116.30.198.222"}
<class 'str'>
{'ip': '116.30.198.222'}
<class 'dict'>
"""
注意:如果返回的数据非json数据则会报错
3.requests.Session
因为http协议是无状态请求,所以会通过cookie与服务器验证身份。requests.get()等方法不会保持状态,但requests库提供了一个Session类,可以保持会话状态
import requests
url = 'http://127.0.0.1:8000/login/'
info = {
"username":"mike123",
"password":"12345",
"remembered":True
}
session = requests.Session()
resp = session.post(url, json=info)
print(resp.json())
resp = session.get('http://127.0.0.1:8000/info/')
print(resp.json())