使用Request请求库抓取网页时,出现中文乱码的解决方案

在写爬虫时出现中文乱码的几种解决方法,测试代码如下:

import requests
headers ={
"Accept": "text/plain, */*; q=0.01" ,
"Accept-Encoding": "gzip, deflate, br,",
"Accept-Language": "zh-CN,zh;q=0.9",
"Connection": "keep-alive",
"Host": "www.douban.com",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"
}
res = requests.get("https://www.douban.com/group/topic/157797102",headers=headers)
res.encoding ="UTF-8"
print(res.text)

开发环境:Pycharm

Python版本:3.7.2

操作系统:win10 64位

记录时间:2020年6月12日21:36

问题重现:

尝试解决方法如下:

第一种:请求网页后,编码设置不对

这种一般很好解决,自己手动指定编码,或者使用chardet模块进行编码,使用方式如下:(此方法对下述代码无效)

import requests
import chardet

headers ={
"Accept": "text/plain, */*; q=0.01" ,
"Accept-Encoding": "gzip, deflate, br,",
"Accept-Language": "zh-CN,zh;q=0.9",
"Connection": "keep-alive",
"Host": "www.douban.com",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"
}

res = requests.get("https://www.douban.com/group/topic/157797102",headers=headers)

rqg.encoding =chardet.detect(rqg.content)[’encoding’]  #指定编码
print(res.text)

第二种:删除请求头中的"Accept-Encoding": "gzip, deflate, br,",

‘Accept-Encoding’:是浏览器发给服务器,声明浏览器支持的编码类型。一般有gzip,deflate,br 等等。
python3中的 requests包中response.text 和 response.content

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

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

所以可以删掉"Accept-Encoding": "gzip, deflate, br,",从而实现正确编码

import requests

headers ={
"Accept": "text/plain, */*; q=0.01" ,
"Accept-Language": "zh-CN,zh;q=0.9",
"Connection": "keep-alive",
"Host": "www.douban.com",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"
}

res = requests.get("https://www.douban.com/group/topic/157797102",headers=headers)

print(res.text)

测试效果如下:

第三种:删除请求头中的"Accept-Encoding"中的br,

br 指的是 Brotli,是一种全新的数据格式,无损压缩,压缩比极高(比gzip高的)

这样接受的网页页面就是没有压缩的或者是默认可解析的了。可以使之正常编码,但是既然有br这种编码了,所以不删除应该也可以解决!

import requests

headers ={
"Accept": "text/plain, */*; q=0.01" ,
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9",
"Connection": "keep-alive",
"Host": "www.douban.com",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"
}

res = requests.get("https://www.douban.com/group/topic/157797102",headers=headers)

rqg.encoding =chardet.detect(rqg.content)[’encoding’]  #指定编码
print(res.text)

测试效果如下:

第四种:安装brotli模块

pip install brotli

然后就可以正常进行编码

import requests


headers ={
"Accept": "text/plain, */*; q=0.01" ,
"Accept-Encoding": "gzip, deflate, br,",
"Accept-Language": "zh-CN,zh;q=0.9",
"Connection": "keep-alive",
"Host": "www.douban.com",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"
}

res = requests.get("https://www.douban.com/group/topic/157797102",headers=headers)

print(res.text)

测试效果如下:


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章