本人代码实际测试
通过 request 的 get 请求某目标页面,发现中文全部乱码
网页显示:
命令行显示:
来查看一下网页返回的字符集类型
老硬币了,这里显示 utf8
通过 request 返回的属性来看
print(resp.encoding) #查看网页返回的字符集类型
print(resp.apparent_encoding) #自动判断字符集类型
发现问题!
接下来的我们就进行编码解码来搞他
def get(url, transform):
resp = requests.get(url, timeout=10)
print(resp.url, resp.status_code)
print(resp.encoding) #查看网页返回的字符集类型 这里返回ISO-8859
print(resp.apparent_encoding) #自动判断字符集类型 发现这里返回 GB2312! 我们进行转换gbk
html = resp.text.encode('iso-8859-1').decode('gbk')
print('html: ', html)
搞定,可以继续爬虫了.
乱码问题的由来
关于网络爬虫的乱码处理。注意,这里不仅是中文乱码,还包括一些如日文、韩文 、俄文、藏文之类的乱码处理,因为他们的解决方式 是一致的,故在此统一说明。
一、乱码问题的出现
就以爬取 51job 网站举例,讲讲为何会出现 “乱码” 问题,如何解决它以及其背后的机制。
代码示例:
import requests
url = “http://search.51job.com"
res = requests.get(url)
print(res.text)
显示结果:
打印 res.text 时,发现了什么?中文乱码!!!不过发现,网页的字符集类型采用的 gbk 编码格式。
我们知道 Requests 会基于 HTTP 头部对响应的编码作出有根据的推测。当你访问 r.text 之时,Requests 会使用其推测的文本编码。你可以找出 Requests 使用了什么编码,并且能够使用 r.encoding 属性来改变它。
接下来,我们一起通过 resquests 的一些用法,来看看 Requests 会基于 HTTP 头部对响应的编码方式。
print (res.encoding) #查看网页返回的字符集类型
print (res.apparent_encoding) #自动判断字符集类型
输出结果为:
可以发现 Requests 推测的文本编码(也就是网页返回即爬取下来后的编码转换)与源网页编码不一致,由此可知其正是导致乱码原因。
乱码背后的奥秘
当源网页编码和爬取下来后的编码转换不一致时,如源网页为 gbk 编码的字节流,而我们抓取下后程序直接使用 utf-8 进行编码并输出到存储文件中,这必然会引起乱码,即当源网页编码和抓取下来后程序直接使用处理编码一致时,则不会出现乱码,此时再进行统一的字符编码也就不会出现乱码了。最终爬取的所有网页无论何种编码格式,都转化为 utf-8 格式进行存储。
注意:区分源网编码 A-gbk、程序直接使用的编码 B-ISO-8859-1、统一转换字符的编码 C-utf-8。