Requests 模块方法总结
使用这个库之前,最好能掌握 http 协议相关知识。本文总结 requests 库常用的一些方法,以及我在实际开发相关工具时遇到的问题。
Requests 库介绍
如果需要了解更多详细内容和用法,请点击 这里 ,查看官方 API 文档。
Requests 是一个非常强大的基于 http 协议的 python 库(package)。到目前为止,主要应用在以下几个方面:
- 简单爬虫工具,构造 http get 报文向指定网站 api 接口请求数据。然后对数据进行处理,得到我们需要的有价值的数据。(项目:网评分析工具)
- 通过对产品接口进行自动化配置。公司产品基于 web 界面提供用户配置界面。配置信息通过 http post 报文写入产品后台。可以通过构造 post 报文,实现通过产品的接口对产品进行配置。(项目:产品的自动化配置)
- 接口测试和白盒测试。当前公司产品接口和白盒测试能力构建较少,所以这一块目前我实际项目经验也不多。
安装
pip3 install requests
快速上手
get 请求报文
通过 get 方法获取某个网页。以下代码 r 为网站响应的 response 对象。
import requests r = requests.get('https://api.github.com/events')
查看 url 链接
r.url
查看 http 响应码
r.status_code
查看服务器响应的头部,r.headers 返回的数据类型为字典类型
>>> r.headers >>> r.headers['content-type'] 'application/json; charset=utf-8' >>> r.headers.get('content-type')
读取服务器响应的内容
r.text
查看响应文本的编码格式
r.encoding = 'utf-8'
二进制响应内容
r.content
json 响应内容,如果处理失败,则会跑出异常
r.json()
原始响应内容
>>> r = requests.get('https://api.github.com/events', stream=True) >>> r.raw <requests.packages.urllib3.response.HTTPResponse object at 0x101194810> >>> r.raw.read(10) '\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'
传递 url 参数
>>> payload = {'key1':'value','key2':'value2'} urllib.urlencode(payload) == >>> r = requests.get('http://httpbin.org/get', params=payload) >>> r.url http://httpbin.org/get?key1=value1&key2=value2
异常状态响应码,抛出异常方法
>>> r = requests.get('http://httpbin.org/status/404') >>> r.status_code 404 >>> r.raise_for_status()
定制请求报头
>>> url = 'https://api.github.com/some/endpoint' >>> headers = {'user-agent': 'my-app/0.0.1'} >>> r = requests.get(url, headers=headers)
所有的 header 值必须是 string
、bytestring 或者 unicode。
post 请求报文
>>> payload = {'key1':'value1','key2':'value2'} >>> r = requests.post("http://httpbin.org/post", data=payload)
超时设置
timeout 参数给出服务器应答的超时时间,建议在实际生产代码中应用。
如果超过超时时间,服务器没有响应。将抛出异常。
>>> r = requests.get('http://github.com', timeout=0.001)
关于重定向
Requests 会自动处理所有重定向。
当然你可以禁用重定向功能,allow_redirects 参数赋值为 False 即可禁用。
>>> r = requests.get('http://github.com', allow_redirects=False)
cookie
Cookie 是解决 HTTP 无状态性的有效手段,服务器可以设置或读取 Cookie 中所包含的信息。当用户登录后,服务器会发送包含登录凭据的 Cookie 到用户浏览器客户端,而浏览器对该 Cookie 进行某种形式的存储(内存或硬盘)。用户再次访问该网站时,浏览器会发送该 Cookie(Cookie 未到期时)到服务器,服务器对该凭据进行验证,合法时使用户不必输入用户名和密码就可以直接登录。
高级用法
构建 session
会话对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持 cookie。
>>> s = requests.Session() >>> s.get('http://httpbin.org/cookies/set/sessioncookie/123456789') >>> r = s.get("http://httpbin.org/cookies") >>> r.text
但是就算使用会话对象后,方法级别的参数也不会被跨请求保持。
>>> s = requests.Session() >>> r = s.get('http://httpbin.org/cookies', cookies={'from-my': 'browser'}) >>> print(r.text) # '{"cookies": {"from-my": "browser"}}' >>> r = s.get('http://httpbin.org/cookies') >>> print(r.text)
问题总结
这里主要总结一下,使用 requests 库可能会遇到的一些问题以及给出解决方案。
1、response 对象的内容,注意几个方法读取内容的数据类型。
# 二进制,eg:b'test' r.content # 字符,eg:'test' r.text # json 格式 r.json() # raw,原始套接字响应数据,参数设置 stream=True r.raw
2、网络连接问题,将抛出 connectionError 错误。
解决办法:通过浏览器手动访问,检测网络连接是否通畅
3、超时问题,TimeOut 异常。
解决办法:服务器响应超时,增加 timeout 参数,并给定参数值。
4、请求过于频繁,无法建立更多连接,抛出异常。
原因分析:发出的网络请求比较频繁,requests 内置的 urllibs3 不能及时的为我们断开连接,于是就有了以上报错。
解决办法:a、stream 设置为 False 或直接读取 Response 对象的 content 属性。b、在代码中手动关闭连接。
response = requests.post(url, data=data, headers=headers,stream=False)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: MySQL 数据库基本知识
下一篇: 彻底找到 Tomcat 启动速度慢的元凶
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论