记录一次由br引起的乱码问题

一、先上原始代码

import requests,time,json
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

_headers = {
'accept':'application/json, text/javascript, */*; q=0.01',
'accept-encoding':'gzip, deflate, br',
'accept-language':'zh-CN,zh;q=0.9',
'content-type':'application/x-www-form-urlencoded; charset=UTF-8',
'origin':'https://tool.lu',
'referer':'https://tool.lu/ip/',
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36',
'x-requested-with':'XMLHttpRequest',
}
data = {
    'ip':'39.137.69.7',
}

response = requests.post(url="https://tool.lu/ip/ajax.html",data=data,headers=_headers)
print(response.text)

感觉很好,所有头部信息都是使用Fiddler抓下来的,很简单的几行代码吗。。。然后

$ IJ����.��e�_����Em	�Ԣ,���#��N���d�x������YH����dP�b���pQ*L�]d`��Z��(n,<�GF�q����H�	g74)^[roJȞwK�c�0�9��5_����dr��u��

二、咱也不知道这是个啥,不知道咋回事那就用Fiddler监测一下看看

修改部分代码:

proxy = '127.0.0.1:8889' # 这个是你在Fiddler中设置的端口,记得启动Fiddler
proxies = {
    'http':'http://' + proxy,
    'https': 'https://' + proxy
}
response = requests.post(url="https://tool.lu/ip/ajax.html",data=data,verify=False,headers=_headers,proxies=proxies)

然后在Fiddler中看返回结果,没问题啊!!

三、最后在网上找到了一个也是抓这个网站的代码,请求头如下:

headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
    }

然后没啥毛病,返回很正常,So???

我开始对每一个请求头中的数据进行注释处理,最后发现是

'accept-encoding':'gzip, deflate, br',

他的锅,

四、分析

据百度百科:Accept-Encoding,HTTP Header中Accept-Encoding 是浏览器发给服务器,声明浏览器支持的编码类型

没啥问题,在分析,然后删掉其中的 ‘br’ 结果返回正常,所以问题就在于‘br’上!

response.content #字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩 类型:bytes
reponse.text #字符串方式的响应体,会自动根据响应头部的字符编码进行解码。类型:str

但是这里是默认是不支持解码br的

br 指的是 Brotli,是一种全新的数据格式,无损压缩,压缩比极高(比gzip高的)
Brotli具体介绍:https://www.cnblogs.com/Leo_wl/p/9170390.html
Brotli优势:https://www.cnblogs.com/upyun/p/7871959.html

鉴于这种形势,所以还是学一下br相关解码方法

python3 对于解压br数据使用的是brotli包(PyPi:Brotli)

使用:

brotli.decompress(response.content).decode('utf-8')

注意:当网站使用的是br压缩法时,会在'Content-Encoding'中标明

{
'Server': 'nginx', 
'Date': 'Wed, 14 Aug 2019 09:09:07 GMT',
'Content-Type': 'application/json', 
'Transfer-Encoding': 'chunked', 
'Connection': 'keep-alive', 
'Vary': 'Accept-Encoding',
'X-UA-Compatible': 'IE=Edge', 
'Content-Encoding': 'br'
}

 

你可能感兴趣的:(爬虫)