所谓爬虫就是模拟客户端发送网络请求,获取网络响应,并按照必定的规则解析获取的数据并保存的程序。要说 Python 的爬虫必然绕不过 Requests 库。html
对于 Requests 库,官方文档是这么说的:python
Requests 惟一的一个非转基因的 Python HTTP 库,人类能够安全享用。
警告:非专业使用其余 HTTP 库会致使危险的反作用,包括:安全缺陷症、冗余代码症、从新发明轮子症、啃文档症、抑郁、头疼、甚至死亡。git
这个介绍仍是比较生动形象的,便再也不多说。安装使用终端命令 pip install requests
。github
导入 Requests 模块:web
import requests
获取网页:json
r = requests.get('http://xxx.xxx')
此时,咱们获取了 Response 对象 r,咱们能够经过 r 获取所需信息。Requests 简便的 API 意味着全部 HTTP 请求类型都是显而易见的,咱们来看一下使用常见 HTTP 请求类型 get、post、put、delete
的示例:api
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)
在使用 get 方式发送请求时,咱们会将键值对形式参数放在 URL 中问号的后面,如:http://xxx.xxx/get?key=val
,Requests 经过 params 关键字,以一个字符串字典来提供这些参数。好比要传 key1=val1
和 key2=val2
到 http://xxx.xxx/get
,示例以下:服务器
pms= {'key1': 'val1', 'key2': 'val2'} r = requests.get("http://xxx.xxx/get", params=pms)
Requests 还容许将一个列表做为值传入:网络
pms= {'key1': 'val1', 'key2': ['val2', 'val3']}
注
:字典里值为 None 的键都不会被添加到 URL 的查询字符串里。
咱们来获取一下服务器的响应内容,这里地址 https://api.github.com
为例:
import requests r = requests.get('https://api.github.com') print(r.text) # 输出结果 # {"current_user_url":"https://api.github.com/user","current_user...
当访问 r.text
之时,Requests 会使用其推测的文本编码,咱们可使用 r.encoding
查看其编码,也能够修改编码,如:r.encoding = 'GBK'
,当改变了编码,再次访问 r.text
时,Request 都将会使用 r.encoding
的新值。
1)二进制响应内容
好比当咱们要获取一张图片的数据,会以二进制的方式获取响应数据,示例以下:
from PIL import Image from io import BytesIO i = Image.open(BytesIO(r.content))
2)JSON响应内容
Requests 中已经内置了 JSON 解码器,所以咱们能够很容易的对 JSON 数据进行解析,示例以下:
import requests r = requests.get('https://api.github.com') r.json()
注
:成功调用 r.json() 并不必定响应成功,有的服务器会在失败的响应中包含一个 JSON 对象(好比 HTTP 500 的错误细节),这时咱们就须要查看响应的状态码了 r.status_code
或 r.raise_for_status()
,成功调用时 r.status_code
为 200,r.raise_for_status()
为 None。
当咱们要给请求添加 headers 时,只需给 headers
参数传递一个字典便可,示例以下:
url = 'http://xxx.xxx' hds= {'user-agent': 'xxx'} r = requests.get(url, headers=hds)
注
:自定义 headers 优先级是低于一些特定的信息的,如:在 .netrc
中设置了用户认证信息,使用 headers 设置的受权就不会生效,而当设置了 auth
参数,.netrc
的设置会无效。全部的 headers 值必须是 string、bytestring 或者 unicode,一般不建议使用 unicode。
默认状况下,Requests 会自动处理除了 HEAD 之外的全部重定向,可使用响应对象的 history
属性来追踪重定向,其返回为响应对象列表,这个列表是按照请求由晚到早进行排序的,看一下示例:
import requests r = requests.get('http://github.com') print(r.history) # 输出结果 # [<Response [301]>]
若是使用的是 get、post、put、delete、options、patch
可使用 allow_redirects
参数禁用重定向。示例以下:
r = requests.get('http://xxx.xxx', allow_redirects=False)
当遇到网络问题(如:DNS 查询失败、拒绝链接等)时,Requests 会抛出 ConnectionError 异常;在 HTTP 请求返回了不成功的状态码时, Response.raise_for_status() 会抛出 HTTPError 异常;请求超时,会抛出 Timeout 异常;请求超过了设定的最大重定向次数,会抛出 TooManyRedirects 异常。全部 Requests 显式抛出的异常都继承自 requests.exceptions.RequestException。
参考:
http://cn.python-requests.org/zh_CN/latest/user/quickstart.html
欢迎关注文末公众号,免费领取海量学习资料!