爬虫爬取数据出现乱码的解决方法



1.网站源代码中英文全部乱码


可能的解决方法:


1)可能是编码格式不同造成的 在调用get方法后,返回的对象中有两个属性值,分别为:

encodingapparent_encoding,当二者不同时,可能出现乱码,解决办法是encoding的值优先于apparent_encoding,即令:encoding=apparent_encoding

python 爬取的中文乱码 爬取的数据是乱码_html


2)可能是反爬策略调用get方法中的header参数设置问题,比如加入了反爬头部关键字:Accept-Encoding: gzip, deflate, br,则可能出现全局乱码,只需删除这一关键字即可。

python 爬取的中文乱码 爬取的数据是乱码_python 爬取的中文乱码_02


具体原因可能是服务器端在响应请求数据时采用了相应的编码格式(比如:gzip、br)将数据进行压缩后再进行发送,然后浏览器端我们调用的requests方法时会自动帮助我们解压(gzip压缩的等)网页内容,如果这时候我们在params强行加入header头部参数模拟浏览器时,可能会导致解压数据时格式不正确,得到的数据出现乱码

2.出现类似b/x204/ds234/4353类似的乱码文件
可能是由于网站本身数据被压缩为gzip格式的文件,解决方式是在python中引入gzip库,并通过调用decompress(待解压对象).encode(‘utf-8’)将原始数据进行解压后再进行使用

3.只出现中文乱码

可能是编码格式不匹配导致

解决方法1:进入网站界面,查看html源代码,找到head头部中的charset属性,并将其值复制下来,eg:

python 爬取的中文乱码 爬取的数据是乱码_爬虫_03

然后再将该值赋值给r.encoding,即r为调用requests中的get 方法返回的对象,比如:r.encoding =‘gb2312’

解决方法2:直接令r.encoding = r.apparent_encoding

ps:

charset 查看网页中的源代码的编码格式

使用方法:引入import chardet

调用chardet.detect(html)

eg:`在这里插入代码片

from urllib import request
import chardet
import gzip
if __name__ == '__main__':

    url = 'https://jobs.zhaopin.com/CC375882789J00033399409.html'

    rsp = request.urlopen(url)
    # 按住Ctrl键不送,同时点击urlopen,可以查看文档,有函数的具体参数和使用方法

    html = rsp.read()
    cs = chardet.detect(html)
    print(html)
    print("cs的类型:{0}".format(type(cs)))
    print("监测到的cs数据:{0}".format(cs))
    html = html.decode("utf-8")
    # 意思是监测到就使用监测到的,监测不到就使用utf-8

    print("HTML页面为:\n%s" % html)

`