Requests是Python HTTP 库。在我这里认为,它是最优秀的第三方的HTTP库,使用范围广,通常用于接口测试、爬虫、web后台服务调用外部服务等。
Requests 完全满足今日 web 的需求。
Keep-Alive & 连接池
国际化域名和 URL
带持久 Cookie 的会话
浏览器式的 SSL 认证
自动内容解码
基本/摘要式的身份认证
优雅的 key/value Cookie
自动解压
Unicode 响应体
HTTP(S) 代理支持
文件分块上传
流下载
连接超时
分块请求
支持 .netrc
这么优秀的http库,如何安装使用呢
pip install requests
如何获取源码呢,可以通过如下的方式获取
git clone git://github.com/kennethreitz/requests.git
发送请求
使用 Requests 发送网络请求非常简单。
一开始要导入 Requests 模块:
import requests
然后,尝试获取某个网页。本例子中,我们如何通过requests来获取GET的网络请求呢,看下下面的例子:
r = requests.get('https://api.leizi.com/events')
现在,我们有一个名为 r 的 Response 对象。我们可以从这个对象中获取所有我们想要的信息。
Requests 简便的 API 意味着所有 HTTP 请求类型都是显而易见的。例如,你可以这样发送一个 HTTP POST 请求:
r = requests.post('http://api.leizi.com/post', data = {'key':'value'})
漂亮,对吧?那么其他 HTTP 请求类型:PUT,DELETE,HEAD 以及 OPTIONS 又是如何的呢?都是一样的简单:
r = requests.put('http://api.leizi.com/put', data = {'key':'value'})r = requests.delete('http://api.leizi.com/delete')r = requests.head('http://api.leizi.com/get')r = requests.options('http://api.leizi.com/get')
都很不错吧。其实 requests进行网络请求很简单的。那么我们看看如何带参数呢?
传递 URL 参数
你也许经常想为 URL 的查询字符串(query string)传递某种数据。如果你是手工构建 URL,那么数据会以键/值对的形式置于 URL 中,跟在一个问号的后面。例如, httpbin.org/get?key=val。Requests 允许你使用 params 关键字参数,以一个字符串字典来提供这些参数。举例来说,如果你想传递 key1=value1 和 key2=value2 到 httpbin.org/get ,那么你可以使用如下代码:
payload = {'key1': 'value1', 'key2': 'value2'}r = requests.get("http://httpbin.org/get", params=payload)
通过打印输出该 URL,你能看到 URL 已被正确编码:
print(r.url)http://leizi.org/get?key2=value2&key1=value1
注意字典里值为 None 的键都不会被添加到 URL 的查询字符串里。
你还可以将一个列表作为值传入:
>>> payload = {'key1': 'value1', 'key2': ['value2', 'value3']}>>> r = requests.get('http://leizi.org/get', params=payload)>>> print(r.url)http://leizi.org/get?key1=value1&key2=value2&key2=value3
reuqests库带参数还是很简单的。
响应内容
我们能读取服务器响应的内容。我们可以找一个请求:
>>> import requests>>> r = requests.get('https://api.github.com/events')>>> r.textu'[{"repository":{"open_issues":0,"url":"https://github.com/...
Requests 会自动解码来自服务器的内容。大多数 unicode 字符集都能被解码。
请求发出后,Requests 会基于 HTTP 头部对响应的编码作出有根据的推测。当你访问 r.text 之时,Requests 会使用其推测的文本编码。你可以找出 Requests 使用了什么编码,并且能够使用 r.encoding 属性来改变它:
>>> r.encoding'utf-8'>>> r.encoding = 'ISO-8859-1'
如果你改变了编码,每当你访问 r.text ,Request 都将会使用 r.encoding 的新值。你可能希望在使用特殊逻辑计算出文本的编码的情况下来修改编码。比如 HTTP 和 XML 自身可以指定编码。这样的话,你应该使用 r.content 来找到编码,然后设置 r.encoding 为相应的编码。这样就能使用正确的编码解析 r.text 了。
二进制响应内容
你也能以字节的方式访问请求响应体,对于非文本请求:
>>> r.contentb'[{"repository":{"open_issues":0,"url":"https://github.com/...
Requests 会自动为你解码 gzip 和 deflate 传输编码的响应数据。
例如,以请求返回的二进制数据创建一张图片,你可以使用如下代码:
>>> from PIL import Image>>> from io import BytesIO>>> i = Image.open(BytesIO(r.content))
如果感觉文章有用,请点亮在看。