初识 requests
在网络编程中,最最基本的任务包含:
发送请求
登录
获取数据
解析数据
反序列化打印内容
我们以 GitHub 为例,先看一下使用 urllib2 要怎么做。为了把事情弄简单点,我们假设实现已经知道,GET 请求 https://api.kuihua.com/ 返回的内容是个 JSON 格式的数据(实际上通过 content-type 也能判断)。
import urllib2
import json
gh_url = 'https://api.github.com'
cs_user = 'user'
cs_psw = 'password'
req = urllib2.Request(gh_url)
password_manager = urllib2.HTTPPasswordMgrWithDefaultRealm()
password_manager.add_password(None, gh_url, cs_user, cs_psw)
auth_manager = urllib2.HTTPBasicAuthHandler(password_manager)
opener = urllib2.build_opener(auth_manager)
urllib2.install_opener(opener)
handler = urllib2.urlopen(req)
if handler.getcode() == requests.codes.ok:
text = handler.read()
d_text = json.loads(text)
for k, v in d_text.items():
print k, v
如果运行正确,那么代码应该返回:
issues_url https://api.github.com/issues
current_user_repositories_url https://api.github.com/user/repos{?type,page,per_page,sort}
rate_limit_url https://api.github.com/rate_limit
repository_url https://api.github.com/repos/{owner}/{repo}
...
user_repositories_url https://api.github.com/users/{user}/repos{?type,page,per_page,sort}
team_url https://api.github.com/teams
同样的效果,用 requests 库则有如下代码:
import requests
cs_url = 'https://api.github.com'
cs_user = 'user'
cs_psw = 'password'
r = requests.get(cs_url, auth=(cs_user, cs_psw))
if r.status_code == requests.codes.ok
for k, v in r.json().items():
print k, v
溢美之词就不用说了,读到这里的你心里肯定只有一声「卧槽,这才是 Python 该有的样子」。那么,接下来我们看看 requests 都有哪些黑魔法。
安装
最推荐的方式,是直接安装推荐过的 Anaconda。
如果你不想安装 Anaconda,那么建议你使用 pip
安装;只需在命令行下执行:
pip install requests
基本用法
requests 的基本用法,呃,真是不能再基本了。最基本的操作,就是以某种 HTTP 方法向远端服务器发送一个请求而已;而 requests 库就是这么做的
import requests
cs_url = 'http://httpbin.org'
r = requests.get("%s/%s" % (cs_url, 'get'))
r = requests.post("%s/%s" % (cs_url, 'post'))
r = requests.put("%s/%s" % (cs_url, 'put'))
r = requests.delete("%s/%s" % (cs_url, 'delete'))
r = requests.patch("%s/%s" % (cs_url, 'patch'))
r = requests.options("%s/%s" % (cs_url, 'get'))
从语法上看,requests 库设计的非常自然。所谓 requests.get,就是以 GET 方式发送一个 REQUEST,得到一个 Response 类的结果,保存为 r。
你可以在 r 中取得所有你想得到的和 HTTP 有关的信息。下面,我们以 GET 方法为例,依次介绍。
URL 传参 / 获取请求的 URL
如果你经常上网(废话,看到这里的都上过网吧……),一定见过类似下面的链接:
https://www.kuihua.com/search?q=hello
即:
<协议>://<域名>/<接口>?<键1>=<值1>&<键2>=<值2>
requests
库提供的 HTTP 方法,都提供了名为 params
的参数。这个参数可以接受一个 Python 字典,并自动格式化为上述格式。
import requests
cs_url = 'http://www.kuihua.com/s'
param = {'ie':'utf-8', 'q':'query'}
r = requests.get (cs_url, params = param)
print r.url
运行将得到:
http://www.kuihua.com/s?q=query&ie=utf-8
HTTP 状态码 / 重定向跳转
requests 库定义的 Response 类可以方便地获取请求的 HTTP 状态码和重定向状态。
import requests
cs_url = 'http://www.so.com/s'
param = {'ie':'utf-8', 'q':'query'}
r = requests.get (cs_url, params = param)
print r.url, r.status_code
cs_url = 'http://www.kuihua.com/s'
r = requests.get (cs_url, params = param)
print r.url, r.status_code, r.history
结果是:
http://www.kuihua.com/s?q=query&ie=utf-8 200
http://www.kuihua.com/s?q=query&ie=utf-8 200 [<Response [302]>]
我们发现,requests 默认自动地处理了 302 跳转。在经过跳转的请求中,返回的 URL 和状态码都是跳转之后的信息;唯独在 history 中,用 Python 列表记录了跳转情况。
大多数情况下,自动处理是挺好的。不过,有时候我们也想单步追踪页面跳转情况。此时,可以给请求加上 allow_redirects = False 参数。