Requests库使用方法简介

292 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第23天,点击查看活动详情

Requests库

Requests 是使用Apache2 Licensed 许可证的HTTP库。用Python 编写。

Requests 使用的是 urllib3,因此继承了它的所有特性。Requests 支持 HTTP 连接保持和连接池,支持 使用 cookie 保持会话,支持文件上传,支持自动确定响应内容的编码,支持国际化的 URL和POST 数据 自动编码。现代、国际化、人性化。

Requests 是以PEP 20的习语为中心开发的

1、Beautiful is better than ugly.(美丽优于丑陋)

2、Explicit is better than implicit.(清楚优于含糊)

3、Simple is better than complex.(简单优于复杂)

4、Complex is better than complicated.(复杂优于繁琐)

5、Readability counts.(重要的是可读性)

官方网站:http://docs.python-requests.org/en/master/

中文文档:http://cn.python-requests.org/zh CN/latest/

安装

通过pip 安装: Python Shell

python3 - m pip install requests

Requests一直在Github上被积极的开发着,你可以在此获得代码。你也可以克隆公共版本库:

第一个例子 Python Shell

image.png

此乃 Requests 官方所提供的第一个例子,不过,要想尝试执行这个例子,前提是你得有个github账号。

发送请求

使用Requests 发送网络请求非常简单。 一开始要导入 Requests 模块:

import requests

然后,尝试获取某个网页。本例子中,我们来获取Github的公共时间线 Python Shell

import requests

requests.get('https://github.com/timeline.json')

现在,我们有一个名为r的Response对象。可以从这个对象中获取所有我们想要的信息。

Requests 简便的API意味着所有HTTP请求类型都是显而易见的。例如,你可以这样发送一个HTTP POST 请求:

import requests

r = requests.post("http://httpbin.org/post")

漂亮,对吧?那么其他HTTP 请求类型:PUT,DELETE,HEAD以及OPTIONS又是如何的呢?都是一样 的简单:

import requests

r = requests.put("http://httpbin.org/put")

requests.delete("http://httpbin.org/delete")

r=requests.head("http://httpbin.org/get")

r=requests.options("http://httpbin.org/get")

都很不错吧,但这也仅是Requests的冰山一角呢。

为URL传递参数

你也许经常想为URL的查询字符串(query string)

传递某种数据。如果你是手工构建URL,那么数据会以键 /值对的形式置于URL中,跟在一个问号的后面。例如,httpbin.org/get?key=val。Requests 允许你使用params关 键字参数,以一个字典来提供这些参数。举例来说,如果你想传递key1=value1和key2=value2到httpbin.org/get,那么你可以使用如下代码:

import requests

payload = {'key1': 'valuel', 'key2': 'value2'}

r = requests.get ("http://httpbin.org/get", params=payload)

通过打印输出该URL,你能看到URL 已被正确编码

import requests

payload = {'key1': 'valuel', 'key2': 'value2'}

r = requests.get ("http://httpbin.org/get", params=payload)


print(r.url)

image.png 注意字典里值为None的键都不会被添加到URL的查询字符串里。

响应内容

我们能读取服务器响应的内容。再次以Github时间线为例:

import requests

r = requests.get('https://giithub.com/timeline.json')
print(r.text)

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了。

在你需要的情况下,Requests也可以使用定制的编码。如果你创建了自己的编码,并使用codecs模块进 行注册,你就可以轻松地使用这个解码器名称作为r.encoding的值,然后由Requests来为你处理编码。

二进制响应内容

你也能以字节的方式访问请求响应体,对于非文本请求:

image.png

Requests会自动为你解码gzip和deflate 传输编码的响应数据。

例如,以请求返回的二进制数据创建一张图片,你可以使用如下代码

>>> from PIL import Image

>>> from StringIO import StringIo 

>>> i = Image.open(StringI0(r.content))

JSON响应内容

equests中也有一个内置的JSON解码器,助你处理JSON数据

image.png

如果JSON解码失败,r.json就会抛出一个异常。例如,相应内容是401(Unauthorized),尝试访问r.json将会抛出 ValueError:No JSON object could be decoded 异常。

原始响应内容

在罕见的情况下你可能想获取来自服务器的原始套接字响应,那么你可以访问r.raw。如果你确实想这么干,那请你确保在初始请求中设置了stream=True。具体的你可以这么做:

image.png

但一般情况下,你应该下面的模式将文本流保存到文件:

with open(filename, 'wb') as fd:

    for chunk in r.iter_content (chunk_size):

        fd.write(chunk)

使用Response.iter_content将会处理大量你直接使用Response.raw不得不处理的。当流下载时,上面是 优先推荐的获取内容方式。

定制请求头

如果你想为请求添加HTTP头部,只要简单地传递一个dict给headers参数就可以了。例如,在前一个示例中我们没有指定 content—type:

import json

import requests

url ='https://api.github.com/some/endpoint' 

payload={'some': 'data'}

headers = {'content-type': 'application/json'}

r=requests.post(url, data=json.dumps (payload),headers=headers)