最近有粉丝找我咨询。在抓取网站时,网页的源代码看起来像是中文乱码。之前有很多粉丝对乱码爬虫的各种质疑。今天总结一下web爬虫的乱码处理。注意这里不仅仅是中文乱码,还有一些日文、韩文、俄文、藏文等乱码。,因为它们的解是一样的,所以在这里统一解释。
第一,乱码问题的出现
以爬行51job网站为例,谈谈为什么会出现“乱码”,如何解决,以及背后的机制。
代码示例:
import requestsurl = "http://search.51job.com"res = requests.get(url)print(res.text)显示结果:
可以发现Requests推测的文本编码(即网页返回或爬下后的编码转换)与源网页编码不一致,是导致代码乱码的原因。
二、乱码背后的神秘
当源网页编码与抓取后的代码转换不一致时,比如源网页是gbk编码的字节流,程序抓取后直接使用utf-8编码输出到存储文件,必然会造成乱码,即当源网页编码与程序抓取后直接使用的代码一致时,就不会出现乱码,统一字符编码时也不会出现乱码。无论什么编码格式,所有抓取的网页都转换成utf-8格式存储。
注意:区分源网络代码A-gbk,程序直接使用的代码B-ISO-8859-1,统一转换字符的代码C-utf-8。
在这里,我们将扩展unicode、ISO-8859-1、gbk2312、gbk、utf-8等之间的区别。,大致如下:
最早的编码是iso8859-1,类似于ascii编码。然而,为了方便地表达各种语言,许多标准代码逐渐出现。Iso8859-1属于单字节编码,能表达的字符最大范围为0-255,应用于英文系列。显然iso8859-1编码的字符范围比较窄,不能代表汉字。
1981年,中国人通过对中文ASCII码的扩展和转换,产生了GB2312码,可以代表6000多个常用汉字。但是汉字太多了,包括繁体字和各种各样的字,于是产生了GBK码,其中包括了GB2312中的码,扩展了很多。中国也是一个多民族国家,几乎所有的民族都有自己独立的语言体系。为了表达这些字符,我们继续将GBK代码扩展到GB18030代码。每个国家和中国一样,都有自己的语言编码,所以有各种各样的代码。如果不安装相应的代码,就无法解释相应的代码想要表达什么。最后,一个叫ISO的组织再也受不了了。他们一起创建了一个UNICODE代码,它非常大,可以容纳世界上任何单词和符号。所以只要电脑上有UNICODE编码系统,不管世界上是什么样的字符,只需要保存文件,保存为UNICODE代码,其他电脑就可以正常解释。UNICODE在网络传输中,有两种标准UTF-8和UTF-16,分别传输8位和16位。那么有人会问,既然UTF-8能保存这么多字符和符号,为什么中国还有这么多人用GBK等代码?因为UTF-8等码比较大,占电脑数量很大空,如果大部分用户是中国人,用GBK等码也可以。
也可以这样理解:字符串由字符组成,字符以二进制形式存储在计算机硬件中,这就是代码。如果直接使用“字符串的二进制表示(编码)”,会增加不同类型编码之间转换的复杂度。所以引入了一个抽象层,“独立于存储的字符串的二进制表示(编码)”,使得字符可以以一种独立于存储的形式表达,不同的编码可以先转换到这个抽象层,再转换到其他编码形式。这里,unicode是“独立于存储的表示”,UTF-8是“二进制表示”。
第三,乱码的解决方案
根据原因找到解决办法很简单。
方法1:直接指定res.encoding
import requestsurl = "http://search.51job.com"res = requests.get(url)res.encoding = "gbk"html = res.textprint(html)方法2:通过res .表观编码属性指定
import requestsurl = "http://search.51job.com"res = requests.get(url)res.encoding = res.apparent_encodinghtml = res.textprint(html)方法3:通过编码和解码
import requestsurl = "http://search.51job.com"res = requests.get(url)html = res.text.encode('iso-8859-1').decode('gbk')print(html)输出结果:
基本思路由三个步骤组成:确定源网页编码A - gbk,程序通过编码B-ISO-8859-1还原源网页数据,统一转换字符编码C-utf-8。至于为什么有统一的转码步骤?网络爬虫系统中有很多数据源。如果无法使用数据,它将被转换为其原始数据,如果这样做是浪费的。所以一般爬虫系统要对抓取的结果进行统一编码,做到一致,使用方便。
比如我们要说网页数据保存了,会转换成utf-8,代码如下:
with open("a.txt",'w',encoding='utf-8') as f:f.write(html)四.总结
对于web爬虫的乱码,本文不仅给出了解决方案,还深入探讨了其原理,引出了很多有趣的问题,比如,utf-8、gbk、gb2312的编码方式是什么?为什么这种转化可以解决问题?
最后,多动脑筋,多思考,多总结,给每一个码农!
本文转自公众号:恋习Python(ID:sldata2017)本文版权归原作者所有,内容为作者个人观点,转载目的在于传递更多信息,如涉及作品内容、版权等问题,可联系本站删除,谢谢。更多交流咨询:18080942131(带微信加好友备注:搜狐)。
1.《乱码怎么办 浅入深出 | 网站爬取时出现乱码该怎么办》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《乱码怎么办 浅入深出 | 网站爬取时出现乱码该怎么办》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/junshi/1041469.html