网络爬虫中的编码问题

一颗蔬菜 2019-05-30 PM 73℃ 0条

大多数情况下requests能按照正确的解码方式解码服务器返回的response对象的内容,但当requests的解码方式和服务器响应时的编码方式不同时就会出现中文乱码的情况,这种情况下,开发者可以先通过response.content获取response对象的二进制(字节)格式的内容,再通过decode(‘解码方式’)指定用哪种编码方式来解码;也可以指定response.encoding属性来指定用哪种方式解码。

综上所述,requests端的解码方式和服务器端的编码方式不同时,开发者爬取到的中文字符就会乱码,解决办法是获取到服务器端的编码方式,再指定requests端的解码方式和它一致。通过response.apparent_encoding属性可以获取该网站的真实编码。

# 方式一
import requests
res = requests.get("http://dict.baidu.com/s",params = {'wd':'python'})
res.encoding = 'utf-8'
print(res.text)
# 方式二
import requests
res = requests.get("http://dict.baidu.com/s",params = {'wd':'python'})
print(res.content.decode('utf-8'))
# 打印网站的真实编码
import requests
res = requests.get("http://dict.baidu.com/s",params = {'wd':'python'})
print(res.apparent_encoding)

实例:电影天堂的网站编码是GB2312,直接输出response.text会中文乱码,因此需要开发者在爬虫程序中指定解码方式。

import requests

res = requests.get("https://www.dytt8.net/")
print(res.apparent_encoding) # GB2312
res.encoding = 'gb2312'
print(res.headers)
print(res.status_code)
print(res.text)

参考文献:深入浅出web请求响应中的编码问题-IBM社区

标签: 爬虫

非特殊说明,本博所有文章均为博主原创。