# 安装

采纳 pip 安装Requests分外轻巧

pip install requests

抑或选择 easy_install 安装

easy_install requests

# 获得源码

Requests 一向在Github上被积极的支付着

您能够仿造公共版本库:

git clone git://github.com/kennethreitz/requests.git

下载 源码:

curl -OL https://github.com/kennethreitz/requests/tarball/master

依然下载 zipball:

curl -OL https://github.com/kennethreitz/requests/zipball/master

假如您获得了别本,你就足以轻易的将它放到到你的python包里照旧设置到您的site-packages:

python setup.py install

# 神速上手


## 发送请求

行使Requests发送网络请求万分简单。

1起头要导入Requests模块:

>>> import requests

然后,尝试获得有些网页。本例子中,大家来赢得Github的公物时间线

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

至今,我们有二个名称为 r 的 Response
对象。能够从这些目标中得到具备大家想要的音信。

Requests简便的API意味着全体HTTP请求类型都是醒目的。举例,你能够如此发送2个HTTP
POST请求:

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

白璧无瑕,对吗?那么其他HTTP请求类型:PUT, DELETE,
HEAD以及OPTIONS又是什么样的吗?都是1模同样的简短:

>>> r = requests.put("http://httpbin.org/put")
>>> r = requests.delete("http://httpbin.org/delete")
>>> r = requests.head("http://httpbin.org/get")
>>> r = requests.options("http://httpbin.org/get")

都很准确啊,但那也仅是Requests的冰山一角呢。


## 为U猎豹CS6L传递参数

你可能平日想为U索罗德L的查询字符串(query
string)传递某种数据。如果您是手工业创设U翼虎L,那么数据会以键/值
对的花样置于U汉兰达L中,跟在三个问号的背后。比如, httpbin.org/get?key=val 。
Requests允许你利用 params
关键字参数,以贰个字典来提供那个参数。举个例子来讲,如若你想传递 key一=value一和 key贰=value二 到 httpbin.org/get ,那么你能够使用如下代码:

>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.get("http://httpbin.org/get", params=payload)

通过打字与印刷输出该UTiggoL,你能来看ULANDL已被科学编码:

>>> print(r.url)
http://httpbin.org/get?key2=value2&key1=value1

注意字典里值为 None 的键都不会被增添到 U翼虎L 的询问字符串里。


## 响应内容

大家能读取服务器响应的内容。再度以Github时间线为例:

>>> import requests
>>> r = requests.get('https://github.com/timeline.json')
>>> r.text
u'[{"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 了。

在你必要的情状下,Requests也足以应用定制的编码。假如您创建了和煦的编码,并运用
codecs 模块进行登记,你就足以轻便地利用这么些解码器名称作为 r.encoding
的值, 然后由Requests来为您管理编码。


## 二进制响应内容

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

>>> r.content
b'[{"repository":{"open_issues":0,"url":"https://github.com/...

Requests会活动为你解码 gzipdeflate 传输编码的响应数据。

诸如,以请求再次回到的2进制数据创制一张图片,你可以运用如下代码:

>>> from PIL import Image
>>> from StringIO import StringIO
>>> i = Image.open(StringIO(r.content))

## JSON响应内容

Requests中也有二个置于的JSON解码器,助你管理JSON数据:

>>> import requests
>>> r = requests.get('https://github.com/timeline.json')
>>> r.json()
[{u'repository': {u'open_issues': 0, u'url': 'https://github.com/...

举例JSON解码战败, r.json 就会抛出2个十分。举例,相应内容是 40一(Unauthorized) ,尝试访问 r.json 将会抛出 ValueError: No JSON object
could be decoded 相当。


## 原始响应内容

在荒山野岭的情状下您恐怕想获取来自服务器的原始套接字响应,那么您能够访问
r.raw 。 如若你实在想那样干,那请您担保在初阶请求中设置了
stream=True 。具体的您能够这么做:

>>> r = requests.get('https://github.com/timeline.json', 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'

但貌似情状下,你应当以上边包车型客车格局将文本流保存到文件:

with open(filename, 'wb') as fd:
    for chunk in r.iter_content(chunk_size):
        fd.write(chunk)

使用 Response.iter_content 将会管理大批量您一向动用 Response.raw
不得不管理的。 当流下载时,上面是事先推荐的拿走内容措施。


## 定制请求头

1旦您想为请求增加HTTP尾部,只要轻易地传递贰个 dict 给 headers
参数就足以了。

譬如,在前贰个示范中大家一贯不点名content-type:

>>> import json
>>> 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)

## 越发扑朔迷离的POST请求

平凡,你想要发送一些编码为表单情势的数据—万分像2个HTML表单。
要促成这么些,只需轻便地传递三个字典给 data 参数。你的多寡字典
在发出请求时会自动编码为表单形式:

>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.post("http://httpbin.org/post", data=payload)
>>> print r.text
{
  ...
  "form": {
    "key2": "value2",
    "key1": "value1"
  },
  ...
}

多数时候你想要发送的数码毫无编码为表单情势的。假如你传递多个 string
而不是二个 dict ,那么数量会被平素表露出来。

譬如,Github API v三接受编码为JSON的POST/PATCH数据:

>>> import json
>>> url = 'https://api.github.com/some/endpoint'
>>> payload = {'some': 'data'}

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

## POST多个多一些编码(Multipart-Encoded)的文书

Requests使得上传多部分编码文件变得非常粗大略:

>>> url = 'http://httpbin.org/post'
>>> files = {'file': open('report.xls', 'rb')}

>>> r = requests.post(url, files=files)
>>> r.text
{
  ...
  "files": {
    "file": "<censored...binary...data>"
  },
  ...
}

您能够显式地安装文件名,文件类型和请求头:

>>> url = 'http://httpbin.org/post'
>>> files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}

>>> r = requests.post(url, files=files)
>>> r.text
{
  ...
  "files": {
    "file": "<censored...binary...data>"
  },
  ...
}

若是您想,你也能够发送作为文件来接收的字符串:

>>> url = 'http://httpbin.org/post'
>>> files = {'file': ('report.csv', 'some,data,to,send\nanother,row,to,send\n')}

>>> r = requests.post(url, files=files)
>>> r.text
{
  ...
  "files": {
    "file": "some,data,to,send\\nanother,row,to,send\\n"
  },
  ...
}

比方你发送贰个可怜大的文书作为 multipart/form-data
请求,你或然希望流请求(?)。默许下 requests 不援救, 但有个第二方包帮衬 –
requests-toolbelt. 你能够阅读 toolbelt 文书档案 来打探使用方法。

在三个呼吁中发送多文本参考 高端用法 1节.


## 响应状态码

我们得以检测响应状态码:

>>> r = requests.get('http://httpbin.org/get')
>>> r.status_code
200

为便宜引用,Requests还捎带了贰个放置的状态码查询对象:

>>> r.status_code == requests.codes.ok
True

倘使发送了八个波折请求(非200响应),大家能够透过
Response.raise_for_status() 来抛出十三分:

>>> bad_r = requests.get('http://httpbin.org/status/404')
>>> bad_r.status_code
404

>>> bad_r.raise_for_status()
Traceback (most recent call last):
  File "requests/models.py", line 832, in raise_for_status
    raise http_error
requests.exceptions.HTTPError: 404 Client Error

可是,由于大家的例子中 r 的 status_code 是 200 ,当大家调用
raise_for_status() 时,获得的是:

>>> r.raise_for_status()
None

方方面面都挺和煦哈。


## 响应头

大家得以查看以一个Python字典格局显得的服务器响应头:

>>> r.headers
{
    'content-encoding': 'gzip',
    'transfer-encoding': 'chunked',
    'connection': 'close',
    'server': 'nginx/1.0.4',
    'x-runtime': '148ms',
    'etag': '"e1ca502697e5c9317743dc078f67693f"',
    'content-type': 'application/json'
}

而是这些字典相比分外:它是仅为HTTP底部而生的。依据 奇骏FC 261陆 ,
HTTP头部是深浅写不灵敏的。

于是,我们能够行使任性大写方式来访问那个响应头字段:

>>> r.headers['Content-Type']
'application/json'

>>> r.headers.get('content-type')
'application/json'

## Cookies

比方有个别响应中含有部分Cookie,你能够快捷访问它们:

>>> url = 'http://example.com/some/cookie/setting/url'
>>> r = requests.get(url)

>>> r.cookies['example_cookie_name']
'example_cookie_value'

要想发送你的cookies到服务器,能够选择 cookies 参数:

>>> url = 'http://httpbin.org/cookies'
>>> cookies = dict(cookies_are='working')

>>> r = requests.get(url, cookies=cookies)
>>> r.text
'{"cookies": {"cookies_are": "working"}}'

## 重定向与请求历史

默许意况下,除了 HEAD, Requests会自行管理全数重定向。

能够使用响应对象的 history 方法来追踪重定向。

Response.history 是一个:class:Response<requests.Response>
对象的列表,为了产生请求而创制了这么些目的。那么些目标列表依据从最老到近年来的伏乞进行排序。

举例,Github将持有的HTTP请求重定向到HTTPS。:

>>> r = requests.get('http://github.com')
>>> r.url
'https://github.com/'
>>> r.status_code
200
>>> r.history
[<Response [301]>]

假定您使用的是GET, OPTIONS, POST, PUT, PATCH 或许DELETE,,那么你能够透过 allow_redirects 参数禁止使用重定向管理:

>>> r = requests.get('http://github.com', allow_redirects=False)
>>> r.status_code
301
>>> r.history
[]

只要您使用的是HEAD,你也得以启用重定向:

>>> r = requests.head('http://github.com', allow_redirects=True)
>>> r.url
'https://github.com/'
>>> r.history
[<Response [301]>]

## 超时

您能够告知requests在通过以 timeout 参数设定的秒数时间今后甘休等待响应:

>>> requests.get('http://github.com', timeout=0.001)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
requests.exceptions.Timeout: HTTPConnectionPool(host='github.com', port=80): Request timed out. (timeout=0.001)

注::
timeout
仅对连接进度中用,与响应体的下载非亲非故。timeout并不是整套下载响应的小时限定,而是只要服务器在timeout秒内未有应答,将会吸引三个不行(更加精确地说,是在timeout秒内并未有从基础套接字上抽出到其余字节的数据时)


## 错误与充裕

欣逢互联网难题(如:DNS查询败北、拒绝连接等)时,Requests会抛出3个
ConnectionError 异常。

相见罕见的不算HTTP响应时,Requests则会抛出二个 HTTPError 异常。

json,若请求超时,则抛出2个 Timeout 异常。

若请求超过了设定的最大重定向次数,则会抛出二个 TooManyRedirects
异常。

享有Requests显式抛出的不得了都延续自
requests.exceptions.RequestException

相关文章

网站地图xml地图