python爬虫之requests请求库

一、requests的安装:

1、可直接通过pip的方式来安装,执行命令如下:

pip3 install requests

二、requests的使用:

1、request中通过get()方法来请求网页(get方式),例如:

上图中使用get()方法,得到一个response对象,然后输出类型、状态码、内容以及cookies,通过返回结果可以看到返回类型是request.models.Response,响应体类型为str,Cookies类型是RequestCookieJar

2、get请求:

http中最常见的请求之一就是get请求,下面构造一个简单的get请求,并返回信息,如图:

代码执行结果如下:

从上图中可以看出,返回的结果中,包含请求头、IP、URL

对于Get请求,如果要添加两个参数,其中name是germey,age是22,要构造这个请求,可以通过字典来存储数据,然后利用params参数来构造,如图:

代码执行结果如下:

从上图中可以看出,url后面已经将参数构造进去,上图中返回类型实际上是str类型,json格式的,如果要得到一个字典格式的,可以调用json()方法,如图:

代码执行结果如下,得到了字典类型的返回结果,如图:

抓取二进制文件:

图片、视频、音频,实质都是二进制码组成,要想抓取,需要先获取对应的二进制码

下面的例子表示获取百度的logo,如图:

上图中open()方法表示已二进制的方式打开目标图片,并通过wirte()方法写入数据,如果不用open()方法而是直接使用下面注释的Print命令,打印结果将是乱码,运行结束后,可以在文件夹中看到对应的图片文件,content为response对象属性,表示返回内容为二进制类型

添加headers

添加请求头的目的为模仿浏览器实现请求,有些网站不加请求头无法实现访问,会被认为是爬虫,因此需要添加headers

例如:爬取知乎–发现页面,如图:

headers请求头获取方式:打开知乎发现页面后,按F12,选择network–export–headers,如图:

找到下方的Requests headers 下面的User-Agent,复制后面的内容即可,如图:

3、post请求:

使用requests实现post请求同样简单,如图:

代码执行结果如下:

上图中的form部分就是提交的数据,证明post请求成功

requests的高级用法

1、文件上传:

上面的例子我们通过get方式获取并保存了图标,现在将此图片用来模拟实现文件上传,如图:

通过open()方法,以二进制只读方式打开文件,并通过post请求,提交数据,代码执行结果如下:内容过长,截图两段显示

从上图可以看出,files字段有内容,form字段是空的,说明文件上传会单独有一个file字段来标识

2、Cookies:

通过如下命令网页的cookies,如图:

代码运行结果如下:

首先调用cookies属性即可成功得到cookies,它是RequestCookieJar类型,需要用items()方法将其转换为元组组成的列表,然后通过for循环遍历解析

注意:上图中获取的cookies是无登陆状态的cookies信息

也可以直接用登陆后的cookies来维持登陆状态,以知乎为例,首先登陆知乎,按f12进入开发者模式,将headers中的cookies信息复制出来,然后添加到请求头中,如图:

执行代码后,将显示登陆之后的页面信息。

3、会话维持:

在requests中,直接使用get()或者post()方法虽然可以做到模拟网页的请求,但是实际上相当于不同的会话,相当于用了两个浏览器打开了不同的页面。那么怎么保持一个会话呢?也就是相当于打开一个浏览器的选项卡而不是重新打开一个浏览器,也不用每次设置cookies,此时可以使用session对象

例如:下面表示没有使用Session对象时的请求,如图:

上图首先通过get()请求,并设置cookies的名称为number,内容为123456,然后再次通过get()方法获取cookies的值,打印结果如下:

从上图中可以看出,获得的值为空,因此上面的设置和获取过程是两个会话

下面利用Session对象来维持会话,如图

上图中,首先创建一个Session对象,然后通过get()方法设置cookies的值,再次通过此对象获取cookies的值,代码执行结果如下:

4、ssl证书验证:

requests还提供了检查证书的功能,当发送Http请求的时候,会检查ssl证书,可以使用verify参数控制是否检查证书,如果不加verify参数,默认为True,会检查证书

例如:下面的例子表示获取12306页面信息时不检查ssl证书,如图:

如果输出结果中包含告警信息,此时可以通过urllib3来实现告警忽略,如图:

5、代理设置:

对于一些网站,当大规模爬取并且频繁的请求,网站可能弹出验证码或者登陆认证界面,此时可以通过设置代理的方式解决此问题,需要用到proxies参数

下面的例子表示通过代理的方式请求数据,代理地址根据实际需要填写,如图:

如果代理需要通过HTTP Basic Auth认证,可以使用语法:http://user:password@host:port方式来设置,如图:

除了基本的Http代理外,requests还支持SOCKS协议代理,首先安装socks这个库,执行命令如下:

pip install ‘requests[socks]’

然后可以配置代理了,如图:

6、超时设置:

默认情况下,通过get()方式请求时,无论服务器响应时间长短,请求都会一直在等待,直到服务器返回结果,如果要设置超时时间,可以通过timeout来设置

例如:设置超时时间为5s,如果服务器5s没有响应那么将返回错误,如图:

如果timout设置为None或者不写timeout,那么表示不限制时长,会一直等待

7、身份认证:

在访问网站的时候,可能会遇到需要登陆的认证页面,此时可以通过requests自带的认证功能,在get()方法中,传入一个元组,它默认使用HTTPBasicAuth类来进行认证,如图:

此外,requests还支持其他认证方式,如OAuth认证,此时需要安装oauth包,可通过如下命令安装,如图:

pip3 istall requests_oauthlib

使用OAuth1认证方法如下:

当要获取需要登陆的接口数据时,此时可以通过身份验证方法来实现

8、Prepared Request

在requests中,我们可以将请求都表示为数据结构,这个数据结构叫做Prepared Request,如图:

标签