python中requests库一些注意事项


前言

最近在开发工具使用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 导致了中文乱码。

正确的解码方法

如下代码:

import requests

rsp = requests.get("https://www.baidu.com/")
rsp.encoding = rsp.apparent_encoding if rsp.encoding == 'ISO-8859-1' else rsp.encoding
print(rsp.encoding)
print(rsp.headers)
print(rsp.content.decode(rsp.encoding))

apparent_encoding会从网页的内容中分析网页编码的方式,所以apparent_encodingencoding更加准确。我们可用使用apparent_encoding 方法解码,便能获取到更加准确的结果

Https请求问题

Requests会为HTTPS请求验证SSL证书,参数为verify默认为True。如果一些网站SSL证书验证不通过,或者不信任服务器的安全证书,则会报出SSLError。如果我们直接请求会报一个SSLError错误

这时候我们需要把 verify 设置为 False 就可以正常请求了但是还是触发警告

requests 的底层实现其实就是 urllib3我们可以在开头添加如下代码把警告给关了。

import urllib3
urllib3.disable_warnings()

最终效果:

stream参数

在测试Finger的时候发现当请求类似下载app等资源的网站的时候会严重拖慢Finger的扫描速度。原因也非常简单requests库默认会把所有response数据包给下载下来,因为数据包比正常网站大太多了所以拖累了扫描的速度。

解决方法也很简单:在requests请求中追加了stream=True参数,此时仅有响应头被下载下来了,连接保持打开状态,当满足了我们的要求int(response.headers.get("content-length",default=1000)) < 100000: 才会访问响应包资源,可根据自身需求修改该阀值。

Finger修改后的源码如下:


文章作者: EASY
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 EASY !
 上一篇
一些渗透实战记录 一些渗透实战记录
前言简单记录最近几个实战渗透的站点。 第一个站点sql注入收到Xray的sql注入告警。 简单测试了一下确实存在数字型注入,但是存在waf检测到sql注入一些关键词直接403 经过测试只是检测关键词,这个时候我们可以考虑 使用生僻函数
2021-04-29 EASY
下一篇 
数据采集工具-Gather 数据采集工具-Gather
前言Gather是一个数据采集工具,使用python3编写,使用的时候请确保运行环境为python3.6以上。Gather支持Fofa,钟馗之眼(Zoomeye),Shodan的数据采集。 使用说明Gather极力避免各种繁杂的参数,使用-
2021-04-14 EASY
  目录