前言
使用这个库之前,最好能掌握http协议相关知识。本文总结requests库常用的一些方法,以及我在实际开发相关工具时遇到的问题。
Requests库介绍
如果需要了解更多详细内容和用法,请点击这里,查看官方API文档。
Requests是一个非常强大的基于http协议的python库(package)。到目前为止,主要应用在以下几个方面:
- 简单爬虫工具,构造http get报文向指定网站api接口请求数据。然后对数据进行处理,得到我们需要的有价值的数据。(项目:网评分析工具)
- 通过对产品接口进行自动化配置。公司产品基于web界面提供用户配置界面。配置信息通过http post报文写入产品后台。可以通过构造post报文,实现通过产品的接口对产品进行配置。(项目:产品的自动化配置)
- 接口测试和白盒测试。当前公司产品接口和白盒测试能力构建较少,所以这一块目前我实际项目经验也不多。
安装
1 | pip3 install requests |
快速上手
get请求报文
通过get方法获取某个网页。以下代码r为网站响应的response对象。
1 | import requests |
查看url链接
1 | r.url |
查看http响应码
1 | r.status_code |
查看服务器响应的头部,r.headers返回的数据类型为字典类型
1 | r.headers |
读取服务器响应的内容
1 | r.text |
查看响应文本的编码格式
1 | r.encoding = 'utf-8' |
二进制响应内容
1 | r.content |
json响应内容,如果处理失败,则会跑出异常
1 | r.json() |
原始响应内容
1 | 'https://api.github.com/events', stream=True) r = requests.get( |
传递url参数
1 | 'key1':'value','key2':'value2'} payload = { |
异常状态响应码,抛出异常方法
1 | 'http://httpbin.org/status/404') r = requests.get( |
定制请求报头
1 | 'https://api.github.com/some/endpoint' url = |
所有的 header 值必须是 string
、bytestring 或者 unicode。
post请求报文
1 | 'key1':'value1','key2':'value2'} payload = { |
超时设置
timeout参数给出服务器应答的超时时间,建议在实际生产代码中应用。
如果超过超时时间,服务器没有响应。将抛出异常。
1 | 'http://github.com', timeout=0.001) r = requests.get( |
关于重定向
Requests会自动处理所有重定向。
当然你可以禁用重定向功能,allow_redirects参数赋值为False即可禁用。
1 | 'http://github.com', allow_redirects=False) r = requests.get( |
cookie
Cookie是解决HTTP无状态性的有效手段,服务器可以设置或读取Cookie中所包含的信息。当用户登录后,服务器会发送包含登录凭据的Cookie到用户浏览器客户端,而浏览器对该Cookie进行某种形式的存储(内存或硬盘)。用户再次访问该网站时,浏览器会发送该Cookie(Cookie未到期时)到服务器,服务器对该凭据进行验证,合法时使用户不必输入用户名和密码就可以直接登录。
高级用法
构建session
会话对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持 cookie。
1 | s = requests.Session() |
但是就算使用会话对象后,方法级别的参数也不会被跨请求保持。
1 | s = requests.Session() |
问题总结
这里主要总结一下,使用requests库可能会遇到的一些问题以及给出解决方案。
1、response对象的内容,注意几个方法读取内容的数据类型。
1 | # 二进制,eg:b'test' |
2、网络连接问题,将抛出connectionError错误。
解决办法:通过浏览器手动访问,检测网络连接是否通畅
3、超时问题,TimeOut异常。
解决办法:服务器响应超时,增加timeout参数,并给定参数值。
4、请求过于频繁,无法建立更多连接,抛出异常。
原因分析:发出的网络请求比较频繁,requests内置的urllibs3不能及时的为我们断开连接,于是就有了以上报错。
解决办法:a、stream 设置为 False 或直接读取 Response 对象的 content 属性。b、在代码中手动关闭连接。
1 | response = requests.post(url, data=data, headers=headers,stream=False) |