本笔记用于记录整理requests库的一些基本知识,内容会根据博主自己的认知作增添或压缩。
其实自己看了下之前写的urllib库笔记,觉得那么写万字长文并不妥当,没有起到快速查阅的笔记作用,所以这次做了点改变。
另外就是requests库的官方文档的中文味儿太冲了,比如
Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用。
警告:非专业使用其他 HTTP 库会导致危险的副作用,包括:安全缺陷症、冗余代码症、重新发明轮子症、啃文档症、抑郁、头疼、甚至死亡。
看吧,这就是 Requests 的威力:…………
Requests 允许你发送纯天然,植物饲养的 HTTP/1.1 请求,无需手工劳动。你不需要手动为 URL 添加查询字串,也不需要对 POST 数据进行表单编码。Keep-alive 和 HTTP 连接池的功能是 100% 自动化的,一切动力都来自于根植在 Requests 内部的 urllib。
所以我参考的是英文版,如有不妥请不吝赐教。
requests不是python内置库,安装指令:pip3 install requests
需要在python调用requests库内容,首先需要导入:import requests
requests可以非常方便地用一些请求方式:
r = requests.head(url, **kwargs)
r = requests.get(url, params=None, **kwargs)
r = requests.post(url, data=None, json=None, **kwargs)
r = requests.put(url, data=None, **kwargs)
r = requests.patch(url, data=None, **kwargs)
r = requests.delete(url, **kwargs)
创建的对象r
是requests.models.Response
对象,即Response
(响应)对象。
url
参数是需要请求的连接。
*args
参数是一些附加的参数,不是必须的参数。下面是一些常见的参数的简介:
**kwargs |
作用及传入方法 | 可以接受的传入 |
---|---|---|
params |
常用于GET请求中URL附带的[?query]参数 | 字典或字节 |
headers |
用于添加请求头的参数 | 字典 |
data |
常用于POST请求中需要上传的表单数据 | 字典或元组列表、字节以及文件 |
json |
上传json格式的数据 | 字典 |
files |
用于上传文件的POST请求 | 字典 |
cookies |
用于上传Cookie | CookieJar对象 |
timeout |
超时设置 | 单个数字(浮点)或两个值的元组 |
auth |
用于身份认证登录 | 两个字符串构成元组 |
verify |
控制是否启用SSL证书验证 | 布尔值,默认为True,即允许 |
proxies |
用于设定代理 | 字典,键为协议,值为地址 |
allow_redirects |
是否允许重定向 | 布尔值,默认为True,即允许 |
cert |
指定本地证书用作客户端证书 | 字符串元组(‘.crt’,‘.key’) |
字节类型数据要用bytes()方法将字符串转化为字节。语法如下:
class bytes([source[, encoding[, errors]]])
打印的时候遇见b''
的内容,即字符串前面有一个b
标记,意思是这是个字节类型对象。
files参数是一个字典,其中键是名称,值是一个文件对象,也可以是一个2元组、3元组或4元组。
字典表示的方法:
.'name': file-like-objects #('名称','文件对象')
{'name': file-tuple} #('名称','元组')
file-tuple(元组)的内容:
('filename', fileobj)
('filename', fileobj, 'content_type')
('filename', fileobj, 'content_type', custom_headers)
'filename'
是文件名,fileobj
是文件类型,'content-type
定义文件类型,是字符串,custom_headers
是要为文件添加的其他标头的类似字典的对象。
一般直接用一个{'name',fileobject}
来打开文件并上传。
Cookie设置除了可以给cookies
参数,也可以直接写入headers
的字典内。如果直接写入headers
,直接从浏览器把对应的内容复制过来即可;但是如果给cookies
参数,则需要额外处理成CookieJar
对象。
参考方法:使用字符串方法split()
对cookie字符串处理
timeout
参数如果传入一个浮点数,则代表的是发出请求到服务器返回响应的时间,单位为s(秒)对象。
如果传入一个2元组,则将timeout
分为两个阶段:connect
(链接)和read
(读取),这样可以分别设定链接和读取的超时时间。
上面传入一个浮点数,timeout
计算的就是这两个阶段的时间总和。
如果目标URL的SSL证书是无效的(如SSL证书设置错误或没有CA机构认证),则直接用requests库请求会发生SSLError
错误。
解决方法有多种:
将verify
参数设置为False,虽然可以正常得到响应,但是这样仍然会出现警告。可以通过requests.packages.urllib3.disable_warnings()
方法来设置忽略警告,也可以通过捕获日志来忽略警告:logging.captureWarnings(True)
(需要提前import logging
)
利用cert
参数将本地证书用作客户端证书。
进行两次请求,但是保持同一个session
会话,需要用上session
对象。
创建session
对象:sessionname = requests.session()
然后就可以对这个对象调用请求方法,即可在保持session的基础上进行多次请求。
如进行一次get请求:Responsename = sessionname.get(url, params ,**kwargs)
使用这个对象请求时,可以像浏览器打开新的选项卡一样保存登录信息,而不是每次请求都打开一个新浏览器。
查看响应对象的属性,可以看到响应对象的内容和信息:
属性 | 说明 | 属性类型 |
---|---|---|
status_code |
响应状态码 | int |
headers |
响应头 | requests.structures.CaseInsensitiveDict |
cookies |
Cookie | requests.cookies.RequestsCookiejar |
url |
URL地址 | str |
history |
请求历史 | list |
content |
响应内容 | bytes |
encoding |
编码格式 | str |
text |
响应内容 | str |
响应状态码指的是网站的响应状态,详细的状态码表不一一列举,仅列举博主认为比较重要的部分:HTTP 应答状态码
HTTP状态码 | 描述 | 查询条件(部分) |
---|---|---|
200 | 请求成功 | 'ok' ,'okay' ,\\o/ |
301 | 永久重定向 | 'moved' ,'\\o-' |
403 | 拒绝请求 | 'forbidden' |
404 | 请求资源不存在 | 'not_found' ,-o- |
500 | 服务器错误 | 'server_error' ,/o\\ |
状态码查询对象:requests.codes
常见的状态码查询对象属性见上表的查询条件,使用方法:
用“正常”的状态码requests.codes.ok
将得到200
需要更详细的使用方法,可以在IDLE内输入
rco = requests.codes
,然后查看rco
的内容即可。
requests
通过构建PrepareRequest
对象,再将其发送出去,从而实现请求。当然也可以直接构造PrepareRequest
对象。
具体的实现方式如下:先构建一个Request实例,然后使用prepare
方法转成PrepareRequest
对象,然后创建一个session
对象,调用其send
方法实现发送请求。
>>> import requests
>>> req = requests.Request('GET', 'http://httpbin.org/get')
<Request [GET]>
>>> r = req.prepare()
<PreparedRequest [GET]>
>>> s = requests.Session()
>>> s.send(r)
<Response [200]>
使用这种方法可以灵活地实现各种请求的调度和各种操作。
requests库用法比较简单,但是深究内部还有很多方法没有展示。需要注意的地方也没有urllib库那么多,以下简单罗列:
timeout
参数包含两个部分,connect
(链接)和read
(读取)。
想要维持session
,需要先创建session
对象再请求。
可以直接利用属性status_code
判断网站是否请求成功,也可以通过requests.codes
对象的指定属性和status_code
属性的比较判断是否