常见的问题

在爬虫爬取数据过程中直接爬取数据中文字符出现乱码现象
在这里插入图片描述
经过查找资料发现,网页返回的字符集和爬取下来后转换编码不一致,这必然会引起来乱码,当源网页编码和抓取下来后程序直接使用处理编码一致时,则不会出现乱码,此时在进行统一的编码则可以完美的显示。

print(response.encoding)  #查看网页返回的字符集类型
print(response.apparent_encoding) #自动判断字符集类型

在这里插入图片描述

常见的编码

最早的编码是iso8859-1和ascii编码类似,iso8859-1属于单字节编码,最多能表示的字符范围是0-255,仅能应用于英文,无法表示中文。

1981年中国对ascii编码进行了扩充改造,产生了GB2312编码,它可以表示6000多个常用汉字,但是由于汉字的繁多经过演进改造产生了GBK编码,它包括GB2312中的很多编码,同时也进行了扩充。由于中国语言汉字的样式多,很多民族都有自己的语言,为了表示那些汉字继续把GBK编码扩充为GB18030编码。

但是这样出现了问题,每个国家都有了自己的编码,编码形式繁多如果要使用相应的语言必须安装相应的编码,否则就无法进行正常显示。与之ISO创造了一种UNICODE编码,这种编码非常大,可以保存世界上的任何文字和符号。

UNICODE在传输中出现了两个标准UTF-8和UTF-16,分别是每次传输8位和16位,但是UTF-8等编码体积比较大,占用电脑空间内存,如果面向的使用人群大多是是中国人那么GBK编码是可以用的。

字符串是由字符构成的,字符在计算机硬件中通过二进制存储,这种二进制就是编码,如果直接使用“字符串->字符->二进制”进行表示,会增加不同类型编码之间转换的复杂性,所以引入了一个抽象层"字符串->字符->与存储无关的表示->二进制表示",这样可以用一种与存储无关的形式表示字符,不同的编码之间转换时先转到这个抽象层,然后再转为其他的形式,unicode就是与存储无关的形式,utf-8就是二进制表示。

解决方法

方法一:直接指定res.encoding

import requests

url = "http://search.51job.com"
res = requests.get(url)
res.encoding = "gbk"
html = res.text
print(html)

方法二:通过res.apparent_encoding指定

import requests

url = "http://search.51job.com"
res = requests.get(url)
res.encoding = res.apparent_encoding
html = res.text
print(html)

方法三:通过编码、解码的方式

import requests

url = "http://search.51job.com"
res = requests.get(url)
html = res.text.encode('iso-8859-1').decode('gbk')
print(html)

总结

基本思路:确定源网页的编码A和程序通过编码B,对源网页数据进行还原,统一转换字符编码C,一般爬取数据时都需要进行统一编码,方便使用。

with open("a.txt",'w',encoding='utf-8') as f:
    f.write(html)

参考资料
python爬虫的中文乱码问题:https://www.zhihu.com/question/27062410

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐