写给朋友的Python知识点,Python requests 模块 Y16
Python requests 模块是什么
Python 爬虫或网络请求时,最先接触的第三方库就是 requests
,该库开源地址为:https://github.com/psf/requests
,
官方的 solgan 为 Requests is a simple, yet elegant, HTTP library
。
我们在日常编码的过程中,经常执行的一个操作就是查询手册,
requests
库提供了中文手册 - https://docs.python-requests.org/zh_CN/latest/
,因此大幅度降低了学习的难度。
不过中文翻译夹带了不少翻译者的情绪化文字,阅读的时候忽略即可。
怎么用
请求参数以及请求方法
导入 requests
库之后,你首先学习到的就是 requests.get()
方法,下面首先从 get
方法的参数开始学习,
下述内容在官方手册没有呈现清单,学习的时候可以直接查阅 requests
模块最新版的源码。
除 url 参数外,其余都为可选参数,即非必选。
url
:请求地址;params
:要发送的查询字符串,可以为字典,列表,元组,字节;data
:body 对象中要传递的参数,可以为字段,列表,元组,字节或者文件对象;json
:JSON 序列化对象;headers
:请求头,字典格式;cookies
:传递 cookie,字段或CookieJar
类型;files
:最复杂的一个参数,一般出现在POST
请求中,格式举例"name":文件对象
或者{'name':文件对象}
,还可以在一个请求中发送多个文件,不过一般爬虫场景不会用到;auth
:指定身份验证机制;timeout
:服务器等待响应时间,在源码中检索到可以为元组类型,这个之前没有使用过,即(connect timeout, read timeout)
;allow_redirects
:是否允许重定向;proxies
:代理;verify
:SSL 验证;stream
:流式请求,主要对接流式 API;cert
:证书。
以上内容就是 GET
请求中可以配置的参数,除了 GET
请求外,requests
还内置了其他的服务器请求方式,
这些方法需要的参数与上述清单一致。
GET
, OPTIONS
, HEAD
, POST
, PUT
, PATCH
, DELETE
在 Python 爬虫的实战当中,主要以 GET
与 POST
为主,
常用的参数为:url
,params
,data
,headers
,cookies
,timeout
,proxies
,verify
。
响应对象的属性与方法
使用 requests
库请求之后,会得到一个 Response
对象,掌握该对象的技巧就是了解其属性与方法,
通过 dir()
函数可以获取 Response
对象的属性和方法。
help(res)
print(dir(res))
获取到的内容如下所示,其中有我们之前案例中常见的一些内容。
['__attrs__', '__bool__', '__class__', '__delattr__', '__dict__', '__dir__', '其余内容自行查询']
如果只将 requests
库应用在爬虫采集领域,那上述属性与方法中,比较常用的有:
属性 property
ok
:只要状态码status_code
小于 400,都会返回 True;is_redirect
:重定向属性;content
:响应内容,字节类型;text
:响应内容,Unicode 类型;status_code
:响应状态码;url
:响应的最终 URL 位置;encoding
:当访问r.text
时的编码;
方法
json()
:将响应结果序列化为 JSON;
会话对象
在本专栏前面的文章中,存在一个被忽略的 requests
高级特性,即会话对象,
该对象能够在跨域请求的时候,保持住某些参数,尤其是 cookie
,如果你想向同一主机发送多个请求,
使用会话对象可以将底层的 TCP 连接进行重用,从而带来显著的性能提升。
会话对象使用非常简单,在发起 requests
对象之前,增加如下所示代码即可。
# 建立会话对象
s = requests.Session()
# 后续都使用会话对象进行进行,而不是直接使用 requests 对象
s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
r = s.get("http://httpbin.org/cookies")
print(r.text)
由于专栏前面并未涉及相关案例,故直接引入官方手册案例说明。
下述代码演示的是 会话也可用来为请求方法提供缺省数据,顾名思义就是直接给会话对象增加的请求参数,
在后续代码中默认可用。
import requests
s = requests.Session()
s.auth = ('user', 'pass')
s.headers.update({'x-test': 'true'})
# both 'x-test' and 'x-test2' are sent
r = s.get('http://httpbin.org/headers', headers={'x-test2': 'true'})
print(r.text)
接下来官网案例还展示了 方法级别的参数也不会被跨请求保持,即在 s.get()
方法中如果传递了 cookie
,那不会被保持住,
这两个案例,从正面与反面为我们核心展示的就是,如何使用会话对象保持参数,
通过会话对象的属性设置的参数,能被保持,而通过会话对象方法传递的参数,不能被保持。
SSL 证书验证,客户端证书,CA 证书
在爬虫采集数据的过程中,碰到 https
的网站在正常不过,requests
库使用过程中 SSL 验证是默认开启的,
如果证书验证失败,即抛出 SSLError
错误。
不过在实战的时候,我们可以通过设置 verify = False
,忽略对 SSL 证书的验证。
部分场景无法忽略证书,必须增加相关证书逻辑。
代理
有的网站在采集过程中,会针对 IP 进行限制,此时就需要使用代理进行跳过操作,设置 proxies
参数即可,
本部分内容比较简单,后续很多案例还会复用到。
除了 HTTP 代理外, requests 2.10
版本之后,增加了 SOCKS
代理,如果你需要使用,需要通过 pip
安装相应库。
pip install requests[socks]
安装完毕,出现新的第三方库 PySocks
,使用方式与 HTTP 代理一致。
Cookie
爬虫采集过程会大量的与 cookie
打交道,获取网站响应的 cookie
,使用 response
对象的 cookies
属性即可。
如果希望向服务器传递 cookie
,可以通过 cookies
参数,例如下述代码:
url = 'http://httpbin.org/cookies'
cookies = dict(cookies_are='working')
r = requests.get(url, cookies=cookies)
如果你希望对 cookie
有更加细致的操作,重点研究 requests.cookies.RequestsCookieJar
对象即可,
简单的代码使用如下所示:
jar = requests.cookies.RequestsCookieJar()
jar.set('tasty_cookie', 'yum', domain='httpbin.org', path='/cookies')
jar.set('gross_cookie', 'blech', domain='httpbin.org', path='/elsewhere')
url = 'http://httpbin.org/cookies'
r = requests.get(url, cookies=jar)
print(r.text)
RequestsCookieJar
对象具备更加丰富的接口,适合跨域名跨路径使用,相关接口可在 https://docs.python-requests.org/zh_CN/latest/api.html#requests.cookies.RequestsCookieJar 查询。
requests
非常适合作为 Python 爬虫入门阶段第一选择,其简单的接口与代码封装,能大幅度降低网络请求代码编写难度,
让你专注与目标数据的提取,更有基于高级请求的封装作为提高部分,该库完全可以贯穿你的整个爬虫工程师生涯。
requests
模块目前在 Python 爬虫领域的出场率极高,很多简单的接口开发,也会基于它进行实现,
因此,该模块十分重要,需要牢牢掌握
- 点赞
- 收藏
- 关注作者
评论(0)