最近使用 Python 写爬虫发现一个问题:请求某个特定网站的时候,总会显示乱码
headers = {
'Host': "test",
'Connection': 'Keep-Alive',
'Cache-Control':'max-age=0',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Referer': 'test',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cookie': 'PHPSESSID=lt1j3ditjb2ld00sb7kcrcdjsp'
}
r = requests.get(url='test', headers=headers, verify=False)
#r.encoding=r.apparent_encoding
#r.encoding = 'UTF-8'
print(r.text)
尝试了各种方法:
r.encoding=r.apparent_encoding
或者
r.encoding='utf-8'#从网页中看编码
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8')
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse response =(HttpWebResponse) request.GetResponse();
返回的结果并无乱码,对比 Python 和 C# 可以发现前者设置了请求头,而后者没有设置
因此编码错误是请求头的问题,在请求头中去掉下面这个即可
'Accept-Encoding': 'gzip, deflate, br',
具体原因为:csdn
这个头信息是告诉服务器客户端所支持的压缩方式,如果没有这行的话,就是告诉服务器,客户端不支持压缩,要求不压缩直接返回文本。因为设置了Accept-Encoding: gzip,deflate所以服务器返回的是压缩后的数据,而本地客户端却没有对这些数据进行解压缩因此得到的便是一堆乱码了。解决方案就是去掉Accept-Encoding: gzip,deflate 直接让服务器返回文本