Python爬虫4requests库使用
requests库介绍和安装
urllib库是python自带的一个库,requests库是第三方的库,需要安装
urllib库用起来很麻烦,比较繁琐
requests库是基于urllib库采用Apache2协议开源的Python HTTP库,号称是为人类准备的HTTP库
下载安装
1 | pip3 install requests |
可以在调用的使用有点可能需要root权限才行
requests请求的方法
requests支持很多种的请求方法,下面的八种请求方法
方法 | 解释 |
---|---|
requests.request() | 构造一个请求,支持以下各种方法 |
requests.get() | 获取html的主要方法 |
requests.head() | 获取html头部信息的主要方法 |
requests.post() | 向html网页提交post请求的方法 |
requests.put() | 向html网页提交put请求的方法 |
requests.patch() | 向html提交局部修改的请求 |
requests.delete() | 向html提交删除请求 |
这个网站可以验证请求http://httpbin.org/会吧你请求的数据给返回回来
下面演示一下GET请求
打开GET
他会给你一个URL
我们访问他看一下
他会叫请求的内容给返回回来
Response响应属性
下面我常用的
属性 | 作用 |
---|---|
r.text | 响应回字符串数据,比如网站源代码 |
r.status_code | 响应的状态码 |
r.content | 二进制响应回去的内容,比如照片视频 |
r.url | 获取请求地址 |
r.cookies | 获取请求后的cookies信息 |
r.cookies.get_dict() | 获取返回的cookies信息 |
r.request | 获取请求方式 |
r.encoding | 进行Response对象编码,就是编码 |
r.json() | 内置的json解码器 |
r.headers | 叫请求的全部的头部变成字典,字典键不区分大小写 |
r.history | 属性得到请求历史 |
GET请求
HTTP 中最常见的请求之一就是 GET 请求
基本实例
代码
1 | import requests |
结果
1 | { |
图
get()方法的参数
格式
1 | requests.get('url',参数,修改头) |
下面是演示
get请求参数
直接添加参数是不灵活的例如
1 | import requests |
我们可以用字典的方式进行参数添加
1 | import requests |
结果
1 | { |
图
修改get请求头
1 | import requests |
POST 请求
POST请求很简单
1 | import requests |
结果
1 | { |
请求的数据包
JSON解码
下面的就是用的AJAX实现的
JSON和XML差不多用来保存数据的
下面这个就是JSON数据
JSON–就是键值对
地址是https://image.baidu.com/search/acjson?tn=resultjson_com&logid=6350051297420797401&ipn=rj&ct=201326592&is=&fp=result&queryWord=a&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=&z=&ic=&hd=&latest=©right=&word=a&s=&se=&tab=&width=&height=&face=&istype=&qc=&nc=1&fr=&expermode=&force=&pn=30&rn=30&gsm=1e&1614416309835=
我们就可以用响应属性json()属性来解析他
1 | import requests |
结果
1 | [{u'repository': {u'open_issues': 0, u'url': '......太多了 |
抓取二进制数据
抓取二进制的的比如图片、音频、视频等文件,我们就可以用响应属性content属性
下面就抓取这个照片我的头像嘻嘻地址https://zssnp-1301606049.cos.ap-nanjing.myqcloud.com/img/avatar.png
我们先看一下输出的二进制
1 | import requests |
结果什么也看不懂
1 | H-�@��9��[��]K��/H�H��Tԃ7/�/����.�5�؊�X��EMES��^�O���q�TQՓ �8�Lٙ�Y#�JБ�L՚�ٞ�ٟڠ=��; |
我们可以叫他直接保存上图像,要是保存文件是二进制要wb
这样写入文件必然不行
代码
1 | import requests |
结果可以看见没有问题,也可以获取音频和视频文件
响应头判断
状态码常用来判断请求是否成功,而 requests 还提供了一个内置的状态码查询对象requests.codes
1 | # 信息性状态码 |
我就演示一下
我们就可以利用这个对象进行判断网站是否请求成功
代码
1 | import requests |
结果
1 | 请求成功 |
文件上传
这个环境我用的是upload-labs-master
靶场
Cookies
下面我测试的都是DVWA的靶场测试的,看一下他的Cookies
我们简单看一下他的类型
1 | import requests |
他是一个RequestCookieJar
类型的数据
我们可以用items()
方法将其转化为元组组成的列表
代码
1 | #-*- coding: UTF-8 -*- |
结果
1 | <RequestsCookieJar[<Cookie PHPSESSID=cakg0rbnm1tpoeqoup5ihcmcg4 for 192.168.31.122/>, <Cookie security=low for 192.168.31.122/>]> |
图示
上面这个理解可能有点难看一下下面的照片就知道了
可以看见他俩是一样的
用Cookies进行登录
下面这个DVWA登录进入我直接就Cookies给复制出来
内容是PHPSESSID=6sthdjb3suu0obt57lds55ah95; security=low
代码
1 | #-*- coding: UTF-8 -*- |
结果
图
我叫Cookie故意写错看看他就不会登录
可以看见严重失败
构建RequestCookieJar
对象登录
RequestsCookieJar
对象发送请求头,这相对烦琐
书上写的是下面这样
1 | #-- coding:UTF-8 -- |
结果
1 | [(' security', 'low'), ('PHPSESSID', '6sthdjb3suu0obt57lds55ah95')] |
上面的代码分析主要分析12行往下的
第12行,可以看一下他的分割的结果,split()方法可以在我以前写的博客上有介绍https://www.zssnp.top/2020/05/01/python
1 | #-- coding:UTF-8 -- |
结果可以看见他遇到;
就会分割
1 | ['PHPSESSID=6sthdjb3suu0obt57lds55ah95', ' security=low'] |
第14行叫分割的二个参数都给key,value
代码分析,应为上面的用了in
他只会提取第一个列表,下面我这个就直接用指定列表来演示
1 | #-- coding:UTF-8 -- |
结果
1 | ['PHPSESSID=6sthdjb3suu0obt57lds55ah95', ' security=low'] |
图
第16行叫key,value变量给了构建RequestCookieJar
对象
代码介绍
1 | #-- coding:UTF-8 -- |
结果,应为是他是列表
1 | ['PHPSESSID=6sthdjb3suu0obt57lds55ah95', ' security=low'] |
图
会话维持
如果我们用同二个请求,也就是说相当于你用了两个浏览器打开了不同的页面
我在两次请求时设置一样的 cookies
不就行了这样比较繁琐
我们就可以用Session
对象,就不用担心 cookies
的问题了,下面的测试用的环境是DVWA
我直接请求二次查看他的返回结果
1 | #-- coding:UTF-8 -- |
结果,可以看见他两都返回cookies都不一样
1 | [('PHPSESSID', 'qkmn8nij18qn0di5pskt4feoq2'), ('security', 'low')] |
图
用Session
对象维持会话
演示
代码
1 | #-- coding:UTF-8 -- |
结果,应为你已经有了请求cookies头,所以第二次就不返回给你cookies了,他已经维持了会话
1 | [('PHPSESSID', 'brn2jv2jlik22i9vohlnp6qvp2'), ('security', 'low')] |
图
SSL 证书验证
这个我就不想找没有认证的ca证书的网站了,下面ca都是我复制书上的
requests 还提供了证书验证的功能,可以使用 verify
参数控制是否检查此证书,默认他是True
现在我们用 requests 来测试一下
1 | import requests |
运行结果如下:
1 | requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)",) |
这里提示一个错误 SSLError
,表示证书验证错误。所以,如果请求一个 HTTPS 站点,但是证书验证错误的页面时,就会报这样的错误,那么如何避免这个错误呢?很简单,把 verify
参数设置为 False
即可
1 | import requests |
结果
1 | /usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py:852: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings |
不过我们发现报了一个警告,它建议我们给它指定证书。我们可以通过设置忽略警告的方式来屏蔽这个警告:
1 | import requests |
或者通过捕获警告到日志的方式忽略警告:
1 | import logging |
当然,我们也可以指定一个本地证书用作客户端证书,这可以是单个文件(包含密钥和证书)或一个包含两个文件路径的元组:
1 | import requests |
当然,上面的代码是演示实例,我们需要有 crt 和 key 文件,并且指定它们的路径。注意,本地私有证书的 key
必须是解密状态,加密状态的 key
是不支持的
代理设置
我们爬网站的时候可能和被目标网站屏蔽,我们就可以用代理
可以用proxies
参数
HTTP代理
下面用的我用的机场来演示的
演示
1 | #-- coding:UTF-8 -- |
结果
1 | 200 |
图
如果带验证的话可以这样写
1 | #-- coding:UTF-8 -- |
SOCKS代理
安装SOCKS代理命令pip3 install 'requests[socks]'
下面用的我用的机场来演示的
演示
1 | #-- coding:UTF-8 -- |
结果
1 | 200 |
超时设置
有的时候网页不好我们就可以用这个超时参数来设置超时时间
代码 ,下面我时间我
1 | import requests |
结果
1 | requests.exceptions.ConnectTimeout: HTTPSConnectionPool(host='www.baidu.com', port=443): Max retries exceeded with url: / (Caused by ConnectTimeoutError(<urllib3.connection.HTTPSConnection object at 0x7f8435c35990>, 'Connection to www.baidu.com timed out. (connect timeout=0.1)')) |
我设置3秒就不会报错了
1 | import requests |
结果
1 | 200 |
如果想永久等待,可以直接将 timeout 设置为 None,或者什么都不加
1 | r = requests.get('https://www.taobao.com', timeout=None) |
1 | r = requests.get('https://www.taobao.com') |
身份认证
下面的内容是我复制的书上的应为我没有这个环境
在访问网站时,我们可能会遇到这样的认证页面,如图 3-9 所示。
图 3-9 认证页面
此时可以使用 requests 自带的身份认证功能,示例如下:
1 | import requests |
如果用户名和密码正确的话,请求时就会自动认证成功,会返回 200 状态码,如果认证失败,则返回 401 状态码。
当然,如果参数都传一个 HTTPBasicAuth
类,就显得有点烦琐了,所以 requests 提供了一个更简单的写法,可以直接传一个元组,它会默认使用 HTTPBasicAuth
这个类来认证。
所以上面的代码可以直接简写如下:
1 | import requests |
此外,requests 还提供了其他认证方式,如 OAuth 认证,不过此时需要安装 oauth 包,安装命令如下:
1 | pip3 install requests_oauthlib |
使用 OAuth1 认证的方法如下:
1 | import requests |
更多详细的功能可以参考 requests_oauthlib 的官方文档 https://requests-oauthlib.readthedocs.org/,在此不再赘述了
数据结构
数据结构发送,这个数据结构就叫 Prepared Request。
1 | #-- coding:UTF-8 -- |
结果
1 | { |
更多在官方文档里面http://docs.python-requests.org/
实战登录网页
我就登录一下靶场DVWA
我们先查看一下他的POST的参数,我故意密码输入错误
下面这个就是POST的请求参数
内容是username=admin&password=a&Login=Login&user_token=b5ac2d72b51b99c325a33189b8858922