浅谈 Requests包

Posted 陈严肃

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈 Requests包相关的知识,希望对你有一定的参考价值。

浅谈 Requests包

 

 

一:Requests包是做什么的?

简单地说,是用python处理HTTP的一个包。
它的标志也非常有气质,是一个双蛇杖,按照官方的说法,一条蛇代表client,一条代表server。
当然,它过去的标志是个给人一种很慢的错觉的王八这件事我就没必要说出来了,大家自己找图吧。
总之,是一个非常简单但是强大的HTTP处理包。对于我这种爬虫学习者来说,它和BeautifulSoup,Selenium构成了手工写爬虫的灵魂。
另外两个我会单独介绍。

 

二: 如何安装Requests?
pip install requests

 

 

三: 速查

1. 基本方法
(1) HTTP的方法
方法         说明      支持的 HTTP 协议版本
GET        获取资源           1.0、1.1
POST        传输实体主体         1.0、1.1
PUT        传输文件           1.0、1.1
HEAD          获得报文首部         1.0、1.1
DELETE      删除文件           1.0、1.1
OPTIONS   询问支持的方法           1.1
TRACE       追踪路径           1.1
CONNECT       要求用隧道协议连接代理    1.1
LINK                建立和资源之间的联系        1.0
UNLINE           断开连接关系           1.0

(2)对应的Requests方法

r = requests.get()
r = requests.post()
r = requests.put()
r = requests.delete()
r = requests.head()
r = requests.options()
示例: r = requests.get(“http://www.baidu.com”)

 

2. 参数

关键字参数    params=
HTTP头部     headers=
表单         data=
文件         file=
cookies              cookies=
重定向处理   allow_redirects=False/True
超时      timeout=
证书验证            verify=False/True
工作流(延迟下载) stream=False/True
事件挂钩    hooks=dict(response=)
response           为从一个请求产生的响应
身份验证            auth=
代理                   proxies=

3. 方法

url         .url
text       .text
编码        .encoding .encoding=
响应内容      .content
json解码器           .json
原始套接字响应   .raw .raw.read() (需要开启stream=True)
检测响应状态码   .status_code
历史响应代码       .history
抛出异常      .raise_for_status()
查看服务器响应头 .headers
        .headers.get()/.headers[]
查看cookie      .cookies
        .cookies[]
身份验证      .auth=
更新          .update()
解析连接字头    .links[]

 

 

四: 专题介绍

1. 关于cookie

(1)cookie的文件类型与转化
cookie的文件类型为cookiejar,cookiejar可以和字典相互转化。
关于这样的转化,我们有三个函数可以使用
requests.utils.dict_from_cookiejar(cj)
(同样效果的还有dict(cj)函数和.get_dict()方法)
requests.utils.cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True)
requests.utils.add_dict_to_cookiejar(cj, cookie_dict)

(2)用session类跳过繁复的cookies处理
会话( session)对象(调用 requests.Session() 获取)会持续跟踪会话信息,像 cookie、 header, 甚至包括运行 HTTP 协议的信息,比如 HTTPAdapter(为 HTTP和 HTTPS 的链接会话提供统一接口)
主要分两步
-1- 从Session类中取得实例:session =requests.Session()
-2- 将所有的requests基本方法的requests置换为session.
例如 s = session.post()


2. 响应处理

获取响应 r = requests.get(url)

(1)普通响应内容处理:
显示r.text
查看编码:r.encoding
更改编码:r.encoding=
(2)二进制响应内容
Requests 会自动为你解码 gzip 和 deflate 传输编码的响应数据
r.content
(3)JSON 响应内容
r.json()
(4)原始响应内容(极少使用)
-1- 开启stream=True: r = requests.get(url, stream=True)
-2- r.raw.read(10)
(5)响应状态码
获取状态码:r.status_code
状态码查询对象:r.status_code == requests.codes.ok
抛出异常:r.raise_for_status()
(6)响应头
获取响应头:r.headers
访问响应头字段(大小写不敏感):
r.headers[]
r.headers.get()

 

3. 请求处理

请求响应 r = requests.get(url)

(1)定制头部
传递一个 dict 给 headers 参数即可:
-1- headers={}
-2- r = requests.get(url, headers=headers)
(2)重定向
默认情况下,除了 HEAD, Requests 会自动处理所有重定向。
通过 allow_redirects 参数控制重定向处理
r = requests.get(url, allow_redirects=False)
r = requests.head(url, allow_redirects=True)
(3)请求历史
r.history
(4)超时
timeout 参数设定的秒数时间之后停止等待响应
r = requests.get(url, timeout=)
timeout 值将会用作 connect 和 read 二者的 timeout。如果要分别制定,就传入一个元组timeout=(3.05, 27)。
建议设为比 3 的倍数略大的一个数值,因为 TCP 数据包重传窗口 (TCP packet retransmission window) 的默认大小是 3
也可以传入一个None,让其永远等待。

 

4. 定制Post请求

r = requests.post(url, )

(1)发送一些表单形式的数据
data 参数可以接收一个字典,在发出请求时会自动编码为表单形式
r = requests.post(url, data=)
也可以使用json 参数直接传递
r = requests.post(url, json=)
(2)POST一个多部分编码
r = requests.post(url, files=)
示例:
files = {‘file‘: open(‘report.xls‘, ‘rb‘)}
r = requests.post(url, files=files)


5. 高级用法

(1)证书验证:
通过控制verify=True/False参数进行SSL证书验证.
(2)流式上传
允许你发送大的数据流或文件而无需先把它们读入内存
with open(‘‘) as f:
    requests.post(url, data=f)
(3)流式请求
使用 iter_lines() 对相应进行迭代
示例:
r = requests.get(‘http://httpbin.org/stream/20‘, stream=True)
for line in r.iter_lines():
    if line:
        print(json.loads(line))
(4)事件挂钩
设置方式:用hooks参数
可用的钩子:response
钩子的制作:hooks=dict(response=somefunction)
示例:
def print_url(r, *args, **kwargs):
    print(r.url)
requests.get(‘http://httpbin.org‘, hooks=dict(response=print_url))
(5)响应头链接字段
直接上示例:
>>> url = ‘https://api.github.com/users/kennethreitz/repos?page=1&per_page=10‘
>>> r = requests.head(url=url)
>>> r.headers[‘link‘]
‘<https://api.github.com/users/kennethreitz/repos?page=2&per_page=10>; rel="next", <https://api.github.com/users/kennethreitz/repos?page=6&per_page=10>; rel="last"‘
>>> r.links["next"]
{‘url‘: ‘https://api.github.com/users/kennethreitz/repos?page=2&per_page=10‘, ‘rel‘: ‘next‘}

>>> r.links["last"]
{‘url‘: ‘https://api.github.com/users/kennethreitz/repos?page=7&per_page=10‘, ‘rel‘: ‘last‘}


6. requests的一些特性:

(1)从字典参数中移除一个值
有时你会想省略字典参数中一些会话层的键。要做到这一点,你只需简单地在方法层参数中将那个键的值设置为 None ,那个键就会被自动省略掉。
(2)流式操作的建议
强烈建议用二进制模式(binary mode)打开文件。这是因为 requests 可能会为你提供header 中的 Content-Length,在这种情况下该值会被设为文件的字节数。如果你用文本模式打开文件,就可能碰到错误。
(3)阻塞和非阻塞
使用默认的传输适配器,Requests 不提供任何形式的非阻塞 IO。 Response.content 属性会阻塞,直到整个响应下载完成。如果你需要更多精细控制,该库的数据流功能(见 流式请求) 允许你每次接受少量的一部分响应,不过这些调用依然是阻塞式的。
如果你对于阻塞式 IO 有所顾虑,还有很多项目可以供你使用,它们结合了 Requests 和 Python 的某个异步框架。典型的优秀例子是 grequests 和 requests-futures。
(4)保持活动状态(持久连接)
归功于 urllib3,同一会话内的持久连接是完全自动处理的!同一会话内你发出的任何请求都会自动复用恰当的连接!
(5)证书
如果系统中装了 certifi 包,Requests 会试图使用它里边的 证书。这样用户就可以在不修改代码的情况下更新他们的可信任证书。

 

 


参考资料:http://www.python-requests.org/en/master/

 

以上是关于浅谈 Requests包的主要内容,如果未能解决你的问题,请参考以下文章

python requests 包 使用

python-requests包

python requests包用法

python导入requests包

Python Requests 包:处理 xml 响应

python--requests包