解决python爬虫乱码问题
本帖最后由 l2430478 于 2021-1-10 20:48 编辑上一个帖子已经“爬出虫”了,这一贴是我是摸索修改,为了不混淆,导致小白看不明白,特新开一贴。
代码非我原创,我总结后展示给大家。
问题类型一:
我尝试把上个帖子中代码改为www.baidu.com,alt+回车后,果然爬出不少东西,但出来的东西乱七八糟。我尝试用其他代码爬虫。
import requests
url="http://www.baidu.com"
html=requests.get(url).text
print(html)
结果出来一堆乱码,以前看过视频教程,这样的乱码,是编码问题。
我们可以通过如下编码来查找问题。
import requests
import sys
#输出我们编译器所用的编码
print(sys.getdefaultencoding())
url="http://www.baidu.com"
html=requests.get(url)
#输出百度的编码
print(html.encoding)
发现输入输出不一致,情况如下:
utf-8ISO-8859-1
继续找原因,我们打开检查,按图所示,可以看到是压缩模式。接下来我们就进行编码转化
import requests
url="http://www.baidu.com"
html=requests.get(url).text
#encode编码,将ISO-8859-1编码成unicode
html=html.encode("ISO-8859-1")
#decode解码,将unicode解码成utf-8
html=html.decode("utf-8")
print(html)
许多代码可以用来借鉴,为我们所用即可,好的代码请保存起来备用,很多代码思路不错的。
问题类型二:
以https://chengdu.chashebao.com/yanglao/19077.html为例。
#!usr/bin/python
#coding: UTF-8
import requests
link = "https://chengdu.chashebao.com/yanglao/19077.html"
headers = { 'User-Agent': 'Mozilla/5.0 (Windows;U; Windows NT6.1;en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
r = requests.get(link,headers = headers)
print (r.text)
用刚的方法发现是乱码
右键点击查看网页源代码,不是检查,然后查看网页源代码的head部分的编码:
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">,charset后面就是网页编码类型,发现网页编码为gbk类型
网页编码通常有2种类型:
utf-8可以支持大多数国家字符,属于国际编码,也就是即使在外国浏览国内的网站,也不会出现乱码。它的英文占用一个字节,中文占用三个字节,对于英文字符较多的网站来说,utf-8节省空间,不过uft-8占用的数据库比gbk要大。
gbk包含全部中文字符,属于国家编码,如果在IE没有安装支持简体中文的电脑上浏览时,中文会变成乱码;使用双字节来表示,不论中、英文字符易使用双字节来表,但通用性比utf-8差。
下面我们利用requests库的方法查看默认输出的编码类型
import requests
import sys
print(sys.getdefaultencoding())
url="https://chengdu.chashebao.com/yanglao/19077.html"
html=requests.get(url)
print(html.encoding)
输出结果为编码ISO-8859-1,并不是原网页的编码类型。
我们可以利用requests库改变输出结果的编码
import requests
url = 'https://chengdu.chashebao.com/yanglao/19077.html'
response = requests.get(url)
response.encoding = 'gbk'
print(response.encoding)
输出结果为编码gbk,与原网页保持一致。基于以上三个步骤,即可解决爬虫中文乱码问题。
import requests
def get_html(url):
try:
response = requests.get(url)
response.encoding = 'gbk'# 改变编码
print(response.encoding)
html = response.text
return html
except:
print('请求网址出错')
url = 'https://chengdu.chashebao.com/yanglao/19077.html'
html = get_html(url)
print(html)
问题完美解决。
-----------------------------
解决爬虫中文乱码的步骤 网址编码为utf-8对于有些网页编码为utf-8的网址,输出事发现中文为乱码,此时我们需要进行两次重编码。response = requests.get(url, headers=headers)
response.encoding = 'GBK'
response.encoding = 'utf-8'
解决爬虫中文乱码的步骤 网址编码为gb2312
response.encoding = 'GBK'
以下为转载
爬虫最常见的问题是返回的数据中文乱码,对于爬虫小白来说这样的问题几乎不可避免,不过别担心,我这里有好几种解决中文乱码的方法,总有一款适合你。
方法一:采用我这里代码里的这种方法,先在代码头设置编码方式为 " UTF-8" ,UTF-8 是保存中文字符的通用代码。然后,添加如下代码,一般都能解决中文乱码问题。#如果目标网页编码与本地不一致,修改本地默认编码方式(防止输出中文乱码)
if sys.getdefaultencoding() != resp.encoding: #resp.encoing用于查询网页所采用的编码格式
reload(sys)
sys.setdefaultencoding(resp.encoding) #设置本地编码格式与网页的编码格式相同
方法二:这里先补充几个知识点:
[*]decode -----把当前字符解码成Unicode编码
[*]encode-----把Unicode编码格式的字符编码成其他格式的编码
[*]Python默认使用Unicode字符集,做编码转换时,要把Unicode作为中间编码,先decode(解码)成Unicode编码,再encode(编码)成其他编码。
[*]非Unicode编码不能直接encode成其他编码,否则会报错。
[*]用requests模块获得response对象,已经预先对于网页的编码格式(通过网页的Head头里的charset =XXX)做出判断,用resp.text得到的内容是解码之后的内容,不需要再次解码。
[*]而用resp.content 得到的内容是未解码的二进制字节流,要先decode(解码),再encode(编码)
#text输出的数据由request自动解码(把bytes型数据变成Unicode字符),只需要把Unicode编码成utf-8输出就行
respText1= resp.text.encode('utf-8','ignore')
#content的内容需要手动解码成unicode再编码成utf-8等其他编码
respText2 = resp.content.decode('utf-8','ignore').encode('GBK','ignore')
方法三:如果是在Pycharm中编程可以把图中圈起来的地方全部改成UTF-8,简单粗暴。
方法四
网上有个代码在decode中加了第二个参数’ignore’,尝试了下竟然成功了,原来是文本中有不属于gbk的编码,之前遇到时就会报错,但其实那些地方无关紧要,需要的信息正确就好。
content = urllib2.urlopen(url).read().decode('gbk','ignore').encode('utf-8')
另附:判断文本真实编码的代码:
import chardet
print chardet.detect(content)['encoding']
沙发,谢谢,这个学习型。关注楼主了 不错,感谢分享 感谢分享 感谢分享 楼主,能不能帮我爬一下这七个视频,谢谢! 擦,我在学Python基础,几十行都费脑 感谢楼主,目前正在琢磨这些问题谢谢谢谢 学习了。不错的分享! 来学习一下,感谢分享
页:
[1]
2