一、先上原始代码
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'
}