requests是一个较为简单易用的HTTP请求库,是python中编写爬虫程序最基础常用的一个库。
 而【中文乱码】问题,是最常遇到的问题,对于初学者来说,是很困恼的。
 本文将详细说明,python中使用requests库编写爬虫程序时,出现【中文乱码】的原因,及常见3种解决办法。
一、【中文乱码】情况及出现原因
(一)【中文乱码】举例
首先,本文的【中文乱码】情况,指的是原网页中的中文内容在使用requests获取后,中文完全无法识别的情况,区别于\x、\u等编码情况。如下图中的例子:
 
 注:requests.get()方法,返回一个response对象,其存储了服务器响应的内容。
(二)出现【中文乱码】原因
导致上图中【中文乱码】的原因:
 使用requests库时,选择使用的文本响应方法不合适,且没有在代码中添加设置合适的编码,以致于使用【response.text】自动获取到的网页编码,与实际网页的编码不一致,进而产生【中文乱码】。
 使用requests库时,可能已经形成了一个习惯,常用【response.text】进行文本响应,而【response.content】常用于图片、视频等。
 这两者,最大的一个区别就是:
 1、【response.text】会自动根据HTTP头部去推测网页的编码,解码并返回解码后的文本。
 2、【response.content】不会解码,直接以二进制形式返回。
 两种文本响应方法,如下表:
| 方法 | 释义 | 
|---|---|
| response.text | 服务器响应的内容,会自动根据响应头部的字符编码进行解码。根据HTTP头部对响应的编码做出有根据的推测,推测文本编码。返回类型:str;常用于:响应文本 | 
| response.content | 字节方式的响应体,不会根据HTTP头部对响应的编码做出有根据的推测。返回类型:bytes(二进制);常用于:图片、视频 | 
二、3种处理【中文乱码】的方法
(一)修改网页文本获取的方法
据上,已知原因是获取文本的方法不对,显然最简单、直接的方法就是:
 直接将response.text换成response.content
 
(二)手动指定网页编码、再提取文本
据上,已知使用【response.text】时,会解码返回,但解码又与原网页编码不一致,而导致【中文乱码】。
 鉴于response也提供了【response.encoding】,来指定返回后的网页编码。
 所以解决方法可以是:
 手动指定网页编码,使之得到正常的文本
 该方法的较第一种,相对麻烦一点:
 首先,需要确认原网页的实际编码,然后根据网页实际编码做出修改。
 具体步骤如下:
 1、查看网页编码
 查看网页编码,有以下两种方式:
 (1)直接打开网页源码(html)【Ctr+U】,查看编码:【charset】的值。
 
 (2)使用response的encoding、apparent_encoding,得到网页编码。
 encoding、apparent_encoding两者最大的区别:
 encoding是从header中去提取,而apparent_encoding是从网页源码去解析,apparent_encoding得到的结果更准确。
 详细如下表:
| 属性 | 释义 | 
|---|---|
| response.encoding | 从网页响应的header中,提取charset字段中的编码。若header中没有charset字段,则默认为ISO-8859-1编码模式,ISO-8859-1编码无法解析中文,这也是中文乱码的原因。 | 
| response.apparent_encoding | 从网页的内容中(html源码)中分析网页编码的方式。所以apparent_encoding比encoding更加准确,获取到的才是原网页的实际编码。 | 
以(1)中网址为例,网页的真实编码为【GB2312】。
 使用encoding、apparent_encoding两种方法,所得的结果是不一致的,apparent_encoding才是原网页实际编码。如下图:
 
 2、手动指定文本编码
 根据上述方法,获得原网页的实际编码后,手动在代码中指定文本编码格式,即可解决【中文乱码】问题。
 写法有2种,可任选其一,如下图:
 
(三)在文本获取后对【中文乱码】进行转码
除了以上2种解决办法外,还可以使用pyhton自带的编码方法,把【中文乱码】的内容再次进行转码,转换为成网页实际的编码格式即可。
 转码方式:encode(‘iso-8859-1’).decode(‘编码格式’)
 如上面例子中,网页编码实际为“gb2312”,代码可修改为:
 
 以上就python使用requests库编写爬虫时,出现【中文乱码】的原因,及常见的三种处理方法,可供参考。
-end














![[PyTorch][chapter 44][RNN]](https://img-blog.csdnimg.cn/5c9ce532a7874142a72ff4c348583dc2.png)




