使用Python开发网络相关程序,可以使用自带的urllib3。requests是第三方库,但功能覆盖全且使用简单,因此,绝大多数场景,使用requests就好。
requests本质上只实现了一个方法——request,requests.get()相当于request(method='get'),其他方法类似。
1.实现方法
方法 | 说明 |
get | 请求资源 |
head | 请求头部资源 |
post | 向url指定的资源后附加资源 |
put | 覆盖原资源 |
patch | 修改局部资源 |
delete | 删除资源 |
options | 预请求(正式请求前试探性请求) |
requests实现的这些方法并不是开发者冥想得来的,而是基于HTTP协议。这里需要补充一个概念——url,全称Uniform Resource Locator,翻译过来就是统一资源定位,如www.vedio.com/ooxx.mp4。我觉得理解这个url就可以对比你本地存放的任意文件的路径,如D:/视频/ooxx.mp4。都是资源查找路径,只不过一个在本地一个在互联网上。
那么对于一个本地资源,我们可以对其进行查看、修改、删除等操作,对一个网络资源,我们同样可以有这些操作。因此有了上面表格列出的这些方法。
# 这个就相当于你打开浏览器,输入百度的地址
from requests import request
res = request(method='get', url='https://www.baidu.com')
print(res.status_code)
# 输出
200
实际上,有些网站或接口的开发者,为了让使用者更方便,并没有完全遵循这样的协议。即get方法除了可以实现请求资源,也可以实现修改、删除。那他是怎么通过一个get方法实现实现其他不同的请求的呢?有一种方法就是将真正的请求放在url里。如,我要使用get方法删除一个资源:requests.get('www.vedio.com/ooxx.mp4/delete'),新增、修改等操作也是类似。
2.超参数
要完成一次有效的网络请求,少不了提供一些参数。比如,上面请求百度网站,因为没有提供搜索关键词,因此没有返回什么实质内容。requests方法提供的超参数如下
参数名 | 说明 |
params | 字典、包含字节或元组的列表,查询参数 |
data | 字典、列表、字节,要发送的数据,在body里 |
json | 序列化后的对象,在body里 |
header | 请求头 |
cookies | 认证许可 |
files | 字典或元组,要传递的文件 |
timeout | 等待超时 |
proxies | 代理 |
(1)示例1,通过接口修改线上表单指定字段的值
from requests import request
import json
headers = {
# 认证
'Authorization': "Token nJCQ0oj5jinK1huS3G",
# 传文件时,不指定这个参数
'Content-Type': "application/json",
'charset': 'utf8',
'User-Agent': "PostmanRuntime/7.20.1",
# 接受的文档类型
'Accept': "*/*",
# 缓存控制
'Cache-Control': "no-cache",
# 访问的主机
'Host': "api.xx.com",
'Accept-Encoding': "gzip, deflate",
'Content-Length': "246",
'Connection': "keep-alive",
}
# 这个格式就是将实际操作包含在url里
url = 'htttps://api.xx.com/table/001/update'
data = {
"data_id": '123456abcd',
# 把指定的某条数据的name值改成张三
"data": {
"_name": {"value": '张三'}
}
response = request("POST", url, headers=headers, data=json.dumps(data))
(2)示例2,上传一个文件
data = {
'file_token': 'xxoo'
}
url = "https://upload.xx.com"
f_name = 'ooxx.mp4'
f_dir = 'D:/视频/ooxx.mp4'
# 文件类型
tp = 'mp4'
files = [('file', (f_name, open(f_dir, 'rb'), tp))]
response = request("POST", url, data=data, files=files)
3.响应
发起一个请求后,不管请求是否成功(除非遇到连接错误),都会返回一些信息。通过返回的信息我们可以进一步提取数据或者找到请求失败的原因。
状态码 | 含义 |
200 | 请求成功 |
201 | 更新成功 |
204 | 删除成功 |
301,302 | 重定向 |
400 | 请求参数错误 |
401 | 未授权 |
403 | 禁止访问 |
404 | 没有相关资源 |
500 | 服务器错误 |
通过response.status_code即可获知请求是否成功,如果想要进一步获取响应信息,可通过以下字段:
字段 | 含义 |
r.status_code | 状态码 |
r.text | 请求页面的内容 |
r.encoding | hearder中定义的编码方式,默认ISO-8859-1 |
r.apparent_encoding | 根据实际内容分析出来的编码方式 |
r.request_url | 实际请求的url(有可能被重定向) |
r.content | 内容的二进制行式 |
res = request("get", 'https://www.baidu.com',
data={'wd': 'python'})
if res.status_code != 200:
print('请求失败,错误码是{}'.format(res.status_code))
else:
print('请求成功,返回信息是{}'.format(res.text))