requests模块方法总结

Posted by FanHao on 2019-08-12

前言

使用这个库之前,最好能掌握http协议相关知识。本文总结requests库常用的一些方法,以及我在实际开发相关工具时遇到的问题。

Requests库介绍

如果需要了解更多详细内容和用法,请点击这里,查看官方API文档。

Requests是一个非常强大的基于http协议的python库(package)。到目前为止,主要应用在以下几个方面:

  • 简单爬虫工具,构造http get报文向指定网站api接口请求数据。然后对数据进行处理,得到我们需要的有价值的数据。(项目:网评分析工具)
  • 通过对产品接口进行自动化配置。公司产品基于web界面提供用户配置界面。配置信息通过http post报文写入产品后台。可以通过构造post报文,实现通过产品的接口对产品进行配置。(项目:产品的自动化配置)
  • 接口测试和白盒测试。当前公司产品接口和白盒测试能力构建较少,所以这一块目前我实际项目经验也不多。

安装

1
pip3 install requests

快速上手

get请求报文

通过get方法获取某个网页。以下代码r为网站响应的response对象。

1
2
3
import requests

r = requests.get('https://api.github.com/events')

查看url链接

1
r.url

查看http响应码

1
r.status_code

查看服务器响应的头部,r.headers返回的数据类型为字典类型

1
2
3
4
>>> r.headers
>>> r.headers['content-type']
'application/json; charset=utf-8'
>>> r.headers.get('content-type')

读取服务器响应的内容

1
r.text

查看响应文本的编码格式

1
r.encoding = 'utf-8'

二进制响应内容

1
r.content

json响应内容,如果处理失败,则会跑出异常

1
r.json()

原始响应内容

1
2
3
4
5
>>> 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参数

1
2
3
4
5
>>> 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

异常状态响应码,抛出异常方法

1
2
3
4
>>> r = requests.get('http://httpbin.org/status/404')
>>> r.status_code
404
>>> r.raise_for_status()
定制请求报头
1
2
3
>>> 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请求报文
1
2
>>> payload = {'key1':'value1','key2':'value2'}
>>> r = requests.post("http://httpbin.org/post", data=payload)
超时设置

timeout参数给出服务器应答的超时时间,建议在实际生产代码中应用。

如果超过超时时间,服务器没有响应。将抛出异常。

1
>>> r = requests.get('http://github.com', timeout=0.001)
关于重定向

Requests会自动处理所有重定向。

当然你可以禁用重定向功能,allow_redirects参数赋值为False即可禁用。

1
>>> r = requests.get('http://github.com', allow_redirects=False)

Cookie是解决HTTP无状态性的有效手段,服务器可以设置或读取Cookie中所包含的信息。当用户登录后,服务器会发送包含登录凭据的Cookie到用户浏览器客户端,而浏览器对该Cookie进行某种形式的存储(内存或硬盘)。用户再次访问该网站时,浏览器会发送该Cookie(Cookie未到期时)到服务器,服务器对该凭据进行验证,合法时使用户不必输入用户名和密码就可以直接登录。

高级用法

构建session

会话对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持 cookie。

1
2
3
4
>>> s = requests.Session()
>>> s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
>>> r = s.get("http://httpbin.org/cookies")
>>> r.text

但是就算使用会话对象后,方法级别的参数也不会被跨请求保持。

1
2
3
4
5
6
7
>>> 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对象的内容,注意几个方法读取内容的数据类型。

1
2
3
4
5
6
7
8
# 二进制,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、在代码中手动关闭连接。

1
response = requests.post(url, data=data, headers=headers,stream=False)