# 安装

运用 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发送网络要异常简单。

一如既往最先如导入Requests模块:

>>> import requests

然后,尝试拿到有网页。本例子中,我们来取得Github的公时间线

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

现今,大家出一个称也 r 的 Response
对象。能够由夫指标中取得具有我们记念要之音讯。

Requests简便的API意味着有HTTP请求类型且是彰着的。例如,你可如此发送一个HTTP
POST请求:

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

美妙,对吧?那么任何HTTP请求类型:PUT, DELETE,
HEAD以及OPTIONS又是怎样的呢?都是同样的大概:

>>> 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的冰山一角呢。


## 为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://httpbin.org/get?key2=value2&key1=value1

注意字典里值为 None 的键都无碰面让补充加至 URL 的询问字符串里。


## 响应内容

咱会读取服务器响应的情。再一次以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 传输编码的应数据。

比如,以告重回的二进制数据创设同张图片,你得用如下代码:

>>> 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 就碰面扔来一个好。例如,相应内容是 401
(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
不得不处理的。 当流下载时,上边是先行推荐的收获内容措施。


## 定制请求头

苟您想吧呼吁添加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请求

平凡,你想假诺发送一些编码为表单形式之数—非常像一个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 v3领编码为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 文档 来询问下方法。

每当一个请求被发送多文本参考 高级用法 一节.


## 响应状态码

我们得检测响应状态码:

>>> 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头部而大的。依照 RFC 2616 ,
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会舍弃来一个
ConnectionError 异常。

欣逢罕见的失效HTTP响应时,Requests则会扔来一个 HTTPError 异常。

若果要过,则委来一个 Timeout 异常。

倘若要过了设定的优良丰盛重定向次数,则会丢掉来一个 TooManyRedirects
异常。

有着Requests显式抛出的这一个且持续自
requests.exceptions.RequestException

相关文章

网站地图xml地图