前言
最近在开发工具使用requests库的时候发现了一些以前自已没有注意到的问题,这里记录一下。
爬虫乱码问题
.text方法的缺陷
首先我们思考一下Python-requests中的.content和.text方法的区别。
- .text 返回的是Beautifulsoup根据猜测的编码方式将content内容编码成字符串。
- .content 返回的是bytes字节码
注意.text
是根据 Content-Type中的charset
字段自动获取编码的。如下图
但是如果不存在Content-Type
头则默认为ISO-8859-1
这就解释了为什么爬取某些页面使用.text
获取结果会返回中文乱码的问题。例如百度首页的爬虫请求如下,如果不加user-agent
头不会放回正确的 Content-Type
头使用了默认的编码方式ISO-8859-1
导致了中文乱码。
正确的解码方法
如下代码:
1 | import requests |
apparent_encoding
会从网页的内容中分析网页编码的方式,所以apparent_encoding
比encoding
更加准确。我们可用使用apparent_encoding
方法解码,便能获取到更加准确的结果
Https请求问题
Requests会为HTTPS请求验证SSL证书,参数为verify默认为True。如果一些网站SSL证书验证不通过,或者不信任服务器的安全证书,则会报出SSLError。如果我们直接请求会报一个SSLError
错误
这时候我们需要把 verify 设置为 False 就可以正常请求了但是还是触发警告
requests 的底层实现其实就是 urllib3我们可以在开头添加如下代码把警告给关了。
1 | import urllib3 |
最终效果:
stream参数
在测试Finger的时候发现当请求类似下载app等资源的网站的时候会严重拖慢Finger的扫描速度。原因也非常简单requests库默认会把所有response数据包给下载下来,因为数据包比正常网站大太多了所以拖累了扫描的速度。
**解决方法也很简单:**在requests请求中追加了stream=True
参数,此时仅有响应头被下载下来了,连接保持打开状态,当满足了我们的要求int(response.headers.get("content-length",default=1000)) < 100000:
才会访问响应包资源,可根据自身需求修改该阀值。
Finger修改后的源码如下:
- 本文作者: EASY
- 本文链接: http://example.com/2021/04/18/python中requests库使用注意指南/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!