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