Python爬虫(二):Requests库

所谓的爬虫即是模仿客户端向互联网发送网络请求数量,并按照既定规则解析数据后保存于程序中的技术手段。Python编程中必定离不开的是requests库这一核心组件。
1 简介
对于 Requests 库,官方文档是这么说的:
仅此一个经过基因编辑的Python HTTP库可以让开发者们安心使用。
须知滥用非专业HTTP库可能导致一系列负面问题,
包括以下几点:
- 安全性问题(即安全性缺陷)
- 过度依赖冗余代码的问题(即冗余代码过多)
- 重复造轮子的风险(即重复实现已有的功能)
- 文档阅读障碍问题(即啃文档现象)
- 可能导致情绪低落和身体不适的问题(如抑郁与头疼)
以及极少数情况下可能会有致命风险。
这个介绍相当生动形象地呈现了相关的信息,并不再赘述。按照以下步骤进行安装:打开终端并输入pip install requests。
2 快速上手
2.1 发送请求
导入 Requests 模块:
import requests
获取网页:
r = requests.get('http://xxx.xxx')
现在我们已经获得了响应对象 r,在通过对象 r 我们能够访问所需信息。由于 Requests 提供了直观易懂的 API 设计,在处理 HTTP 请求时无需复杂配置。让我们详细了解通过 get、post、put 和 delete 等常用 HTTP 方法实现功能的具体示例吧。
r = requests.head('http://xxx.xxx/get')r = requests.post('http://xxx.xxx/post', data = {'key':'value'})r = requests.put('http://xxx.xxx/put', data = {'key':'value'})r = requests.delete('http://xxx.xxx/delete')
一般情况下我们配置了请求的时间超限值在 Requests 中我们使用了 timeout 参数来配置超时时间单位为秒如下所示
r = requests.head('http://xxx.xxx/get', timeout=1)
2.2 参数传递
在采用 get 方法发送请求时的情况下,则会在 URL 的问号后方放置键值对形式的参数项(如:http://xxx.xxx/get?key=val)。其中,请注意 Requests 会通过 params 字符串字段来接收这些参数项(如:请参考以下示例)。例如,在发送到 http://xxx.xxx/get 时,请提供两个参数项:key1=value1 和 key2=value2
pms= {'key1': 'val1', 'key2': 'val2'}r = requests.get("http://xxx.xxx/get", params=pms)
Requests 还允许将一个列表作为值传入:
pms= {'key1': 'val1', 'key2': ['val2', 'val3']}
注:字典里值为 None 的键都不会被添加到 URL 的查询字符串里。
2.3 响应内容
我们来获取一下服务器的响应内容,这里地址 https://api.github.com 为例:
import requestsr = requests.get('https://api.github.com')print(r.text)# 输出结果# {"current_user_url":"https://api.github.com/user","current_user...
每当访问 r.text 时
以二进制形式呈现的内容 例如,在我们希望从服务器中获取一张图片时 会采用二进制方式进行响应数据的传输 这种方式具有高效性
from PIL import Imagefrom io import BytesIOi = Image.open(BytesIO(r.content))
在Requests中已集成有JSON解码器功能。由于解析过程相对简便,在实际应用中我们能够轻松地处理JSON数据。举个例子来说:
import requestsr = requests.get('https://api.github.com')r.json()
注:当使用r.json()时,并不意味着请求一定成功返回数据;某些服务端可能会在返回失败信息时嵌入一个JSON对象(例如HTTP 500错误信息)。这时我们就需要检查响应的状态码r.status_code或调用r.raise_for_status();在正常情况下,r.status_code返回200;而该方法返回None。
2.4 自定义请求头
当我们需要向一个请求添加 headers 时
url = 'http://xxx.xxx'hds= {'user-agent': 'xxx'}r = requests.get(url, headers=hds)
注
2.5 重定向与历史
默认情况下, Requests能够自动执行除HEAD之外的所有重定向请求, 可以通过查询响应对象的历史属性来获取有关重定向的信息, 其返回结果是一个包含历史记录的响应对象列表, 这些记录按请求时间从近期到远期排列。
import requestsr = requests.get('http://github.com')print(r.history)# 输出结果# [<Response [301]>]
如果通过设置 allow_redirects 参数可以在 GET/POST 等常用 HTTP 方法中实现无重定向请求功能,则可以实现资源访问而不触发网页框架的渲染机制,默认情况下会触发重定向导致页面刷新的问题。
r = requests.get('http://xxx.xxx', allow_redirects=False)
2.6 错误与异常
在遇到网络问题(包括DNS查询失败和拒绝连接等情况)时,在requests模块中会在ConnectionError异常情况下被触发;当HTTP请求返回非成功状态码时,在Python标准库中的response对象上调用raise_for_status()方法会导致HTTPError异常出现;而当请求发生超时时,在response对象上调用raise_for_status()方法会导致Timeout异常发生;当请求超过预先设置的最大重定向次数后,在response对象上调用raise_for_status()方法会导致TooManyRedirects异常出现;所有requests模块显式抛出的异常都继承自requests.exceptions.RequestException类。
参考:
http://cn.python-requests.org/zh_CN/latest/user/quickstart.html
