使用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)

测试效果如下:


 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值