Python公开课 - Requests基本功能

前言

Python自带的库也可以进行网络访问,但是有很多不方便的地方,相比而言requests在这个方面非常强大,有了它,Cookies、登录验证、代理设置等操作都不是事儿。

发送请求

见示例:

>>> import requests
>>> r = requests.get('http://www.xtuz.net/')
>>> r = requests.post('http://www.xtuz.net/', data = {'key':'value'})
>>> r = requests.put('http://www.xtuz.net/', data = {'key':'value'})
>>> r = requests.delete('http://www.xtuz.net/')
>>> r = requests.head('http://www.xtuz.net/')
>>> r = requests.options('http://www.xtuz.net/')

可见,http的请求,requests已经做了非常友好的封装。

GET请求传递URL参数

在GET请求中,可以通过URL的查询字符串(query string)来传递数据。如果是手工构建 URL,那么数据会以键/值对的形式置于 URL 中,跟在一个问号的后面。如果你想传递 key1=value1 和 key2=value2 到 http://www.xtuz.net ,那么在requests中可以使用如下代码

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

自定义请求头

如果你想为请求添加 HTTP 头部,只要简单地传递一个 dict 给 headers 参数就可以了。

>>> url = 'http://www.xtuz.net'
>>> headers = {'user-agent': 'my-app/0.0.1'}
>>> r = requests.get(url, headers=headers)

响应状态码

我们可以通过返回的status_code来获取服务端的响应状态码

>>> r = requests.get('http://www.xtuz.net')
>>> r.status_code
200

响应头

我们可以查看以一个 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'
}

服务端响应文本内容

Requests 会自动解码来自服务器的内容。大多数 unicode 字符集都能被无缝地解码。

请求发出后,Requests 会基于 HTTP 头部对响应的编码作出有根据的推测。当你访问 r.text 之时,Requests 会使用其推测的文本编码。但是你也可以使用 r.encoding 属性来改变它。

>>> import requests
>>> r = requests.get('http://www.xtuz.net')
>>> r.text
>>> r.encoding

输出:
'utf-8'

服务端响应二进制内容

对于服务端返回二进制内容,可以使用下面的方式来获取数据

>>> r.content

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

服务端响应JSON内容

requests 中内置了JSON解码器,助你处理JSON数据

>>> import requests
>>> r = requests.get('http://www.xtuz.net')
>>> r.json()

服务端原始响应内容

在某些情况下,可能需要处理原始的数据,当然在爬虫中可不常见,但是如果你有这样的需求,那么可以这样处理

>>> r = requests.get('http://www.xtuz.net', stream=True)
>>> r.raw

相关阅读