【技能树共建】Python requests 模块
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
对象的属性和方法。
获取到的内容如下所示,其中有我们之前案例中常见的一些内容。
如果只将 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.get()
方法中如果传递了 cookie
,那不会被保持住,这两个案例,从正面与反面为我们核心展示的就是,如何使用会话对象保持参数,通过会话对象的属性设置的参数,能被保持,而通过会话对象方法传递的参数,不能被保持。
SSL 证书验证,客户端证书,CA 证书
在爬虫采集数据的过程中,碰到 https
的网站在正常不过,requests
库使用过程中 SSL 验证是默认开启的,如果证书验证失败,即抛出 SSLError
错误。
不过在实战的时候,我们可以通过设置 verify = False
,忽略对 SSL 证书的验证。部分场景无法忽略证书,必须增加相关证书逻辑。
代理
有的网站在采集过程中,会针对 IP 进行限制,此时就需要使用代理进行跳过操作,设置 proxies
参数即可,本部分内容比较简单,后续很多案例还会复用到。
除了 HTTP 代理外, requests 2.10
版本之后,增加了 SOCKS
代理,如果你需要使用,需要通过 pip
安装相应库。
安装完毕,出现新的第三方库 PySocks
,使用方式与 HTTP 代理一致。
Cookie
爬虫采集过程会大量的与 cookie
打交道,获取网站响应的 cookie
,使用 response
对象的 cookies
属性即可。如果希望向服务器传递 cookie
,可以通过 cookies
参数,例如下述代码:
如果你希望对 cookie
有更加细致的操作,重点研究 requests.cookies.RequestsCookieJar
对象即可,简单的代码使用如下所示:
RequestsCookieJar
对象具备更加丰富的接口,适合跨域名跨路径使用,相关接口可在 https://docs.python-requests.org/zh_CN/latest/api.html#requests.cookies.RequestsCookieJar 查询。
requests
非常适合作为 Python 爬虫入门阶段第一选择,其简单的接口与代码封装,能大幅度降低网络请求代码编写难度,让你专注与目标数据的提取,更有基于高级请求的封装作为提高部分,该库完全可以贯穿你的整个爬虫工程师生涯。
提高场景
学习基本使用之后,可以使用 requests
模块实现一些简易爬虫案例,例如参考《Python 爬虫小课》,全部都是基于 requests 模块完成。
requests
模块目前在 Python 爬虫领域的出场率极高,很多简单的接口开发,也会基于它进行实现,因此,该模块十分重要,需要牢牢掌握
版权声明: 本文为 InfoQ 作者【梦想橡皮擦】的原创文章。
原文链接:【http://xie.infoq.cn/article/dfd5c609e50572efd6eba48e5】。文章转载请联系作者。
评论