Requests官网:http://docs.python-requests.org/zh_CN/latest/user/quickstart.html
1.Requests 中也有一个内置的 JSON 解码器,助你处理 JSON 数据:
>>> import requests >>> r = requests.get('https://api.github.com/events') >>> r.json()
2.通常,你想要发送一些编码为表单形式的数据——非常像一个 HTML 表单。要实现这个,只需简单地传递一个字典给 data 参数。你的数据字典在发出请求时会自动编码为表单形式:
3.错误与异常
>遇到网络问题(如:DNS 查询失败、拒绝连接等)时,Requests 会抛出一个 ConnectionError
异常。
>如果 HTTP 请求返回了不成功的状态码, Response.raise_for_status()
会抛出一个 HTTPError
异常。
>若请求超时,则抛出一个 Timeout
异常。
>若请求超过了设定的最大重定向次数,则会抛出一个 TooManyRedirects
异常。
>所有Requests显式抛出的异常都继承自 requests.exceptions.RequestException
。
4.会话对象
会话对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持 cookie, 期间使用 urllib3
的 connection pooling 功能。所以如果你向同一主机发送多个请求,底层的 TCP 连接将会被重用,从而带来显著的性能提升
会话对象具有主要的 Requests API 的所有方法。
我们来跨请求保持一些 cookie:
5.定制动词
有时候你会碰到一些服务器,处于某些原因,它们允许或者要求用户使用上述 HTTP 动词之外的定制动词。比如说 WEBDAV 服务器会要求你使用 MKCOL 方法。别担心,Requests 一样可以搞定它们。你可以使用内建的 .request
方法,例如:
>>> r = requests.request('MKCOL', url, data=data) >>> r.status_code 200 # Assuming your call was correct
6.代理¶
如果需要使用代理,你可以通过为任意请求方法提供 proxies
参数来配置单个请求:
import requests proxies = { "http": "http://10.10.1.10:3128", "https": "http://10.10.1.10:1080", } requests.get("http://example.org", proxies=proxies)
你也可以通过环境变量 HTTP_PROXY
和 HTTPS_PROXY
来配置代理。
$ export HTTP_PROXY="http://10.10.1.10:3128" $ export HTTPS_PROXY="http://10.10.1.10:1080" $ python >>> import requests >>> requests.get("http://example.org")
若你的代理需要使用HTTP Basic Auth,可以使用 http://user:password@host/ 语法:
proxies = { "http": "http://user:[email protected]:3128/", }
要为某个特定的连接方式或者主机设置代理,使用 scheme://hostname 作为 key, 它会针对指定的主机和连接方式进行匹配。
proxies = {'http://10.20.1.128': 'http://10.10.1.10:5323'}
注意,代理 URL 必须包含连接方式。
7. 自定义身份验证¶
Requests 允许你使用自己指定的身份验证机制。
任何传递给请求方法的 auth
参数的可调用对象,在请求发出之前都有机会修改请求。
自定义的身份验证机制是作为 requests.auth.AuthBase
的子类来实现的,也非常容易定义。Requests 在 requests.auth
中提供了两种常见的的身份验证方案: HTTPBasicAuth
和 HTTPDigestAuth
。
假设我们有一个web服务,仅在 X-Pizza
头被设置为一个密码值的情况下才会有响应。虽然这不太可能,但就以它为例好了。
from requests.auth import AuthBase class PizzaAuth(AuthBase): """Attaches HTTP Pizza Authentication to the given Request object.""" def __init__(self, username): # setup any auth-related data here self.username = username def __call__(self, r): # modify and return the request r.headers['X-Pizza'] = self.username return r
然后就可以使用我们的PizzaAuth来进行网络请求:
>>> requests.get('http://pizzabin.org/admin', auth=PizzaAuth('kenneth')) <Response [200]>
8. 事件挂钩¶
Requests有一个钩子系统,你可以用来操控部分请求过程,或信号事件处理。
可用的钩子:
response
:
从一个请求产生的响应
你可以通过传递一个 {hook_name: callback_function}
字典给 hooks
请求参数为每个请求分配一个钩子函数:
hooks=dict(response=print_url)
callback_function
会接受一个数据块作为它的第一个参数。
def print_url(r, *args, **kwargs): print(r.url)
若执行你的回调函数期间发生错误,系统会给出一个警告。
若回调函数返回一个值,默认以该值替换传进来的数据。若函数未返回任何东西,也没有什么其他的影响。
我们来在运行期间打印一些请求方法的参数:
>>> requests.get('http://httpbin.org', hooks=dict(response=print_url)) http://httpbin.org <Response [200]>