解决爬虫中文数据乱码问题

您所在的位置:网站首页 请问脊柱弯了是什么原因 解决爬虫中文数据乱码问题

解决爬虫中文数据乱码问题

2024-02-14 12:43| 来源: 网络整理| 查看: 265

常见的问题

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

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3