开发爬虫过程中遇到过非常头痛的问题就是编码问题,如果编码使用不正确最后保存下来的文本就会有问题。在开发过程中,我们可能会遇到各种编码比如ios8859-1,Windows-1252,GBK,GB2313,GB18030等。首先让我们看看如果使用错误的编码解码下载的内容会发生什么情况吧。注意,即使都是乱码,使用不同错误的错误编码解码的效果特征也是不同的。
什么是编码
对于编码解码不太理解的同学可以从数据类型的角度去思考这个问题。默认情况下在应用程序或者python代码中,字符都是以string(str)类型存在内存中的。当需要网络传输或者保存在文件、数据库中就需要编码成bytes类型。这一过程叫做编码(encoding)。
什么是解码
我们从网上下载内容都是编码后的二进制类型存在的,无论是电影(MP4),音乐(MP3),还是文本(Txt)。本文就以文本为例说明一下为什么用错了编码就会看到乱码。
解码出错导致乱码
正常情况下网页一般都用UTF-8编码,一些中文网站可能会用GB2312,GBK编码,GB18030用的很少,但却很有用,我们后面在讲。爬虫开发中取数流程一般是下载->数据提取/清洗/处理/格式化->保存;不同的环节,数据存在的形式,或者说数据类型是不同的。大致可以分为以下几种:
- 下载:数据在下载过程中通常是二进制形式(bytes类型)
- 数据提取/清洗/处理/格式化:这个过程数据被解码成字符串(string类型)
- 保存:数据被编码后保存写入文件或者数据库
一般我们看到乱码,主要是在下载后的解码环节用错了字符编码。例如下载的文件本来是gbk编码的,结果我们用utf-8解码了。此时在内存中的字符串数据已经出错,后面再用utf-8编码后存入数据库看到的就是乱码。
因此,如果我们知道源数据、源文件的正确编码类型,我们可以通过反向操作修复已经保存的乱码文件。
因此,整个流程中至关重要的是要知道源文件(数据源)使用的是什么编码。以下是几种发现数据源编码的途径。
#1. HTTP Headers
#2. HTML Meta charset
#3. Requests Encoding和apparent_encoding
介于篇幅问题,这里就不展开说明以上三种途径具体是什么了,有问题的朋友可以留言。

扫码联系船长