Python+requests 爬取网站遇到中文乱码怎么办?

分类: Python/Ruby

最近刚开始使用python来做爬虫爬取相关数据,使用了python自带的urllib和第三方库requests,解析html使用了beautifulsoup以及lxml
    这里说下lxml,lxml是python的一个html、xml解析库,lxml使用XPath能快速,简单的定位元素并获取信息。下面进入正题

1. 遇到的中文乱码问题
1.1 简单的开始
    使用requests来拔取网站内容十分方便,一个最简单的代码段只需要2-3行代码就行。

点击(此处)折叠或打开

  1. url = ‘http//www.pythonscraping.com/‘
  2. req = requests.get(url)
  3. print(req.text)
  4. tree = html.fromstring(req.text)
  5. print(tree.xpath("//h1[@class=‘title‘]/text()"))

上面的代码段起作用的也就3行(2,4,5)代码就获取到我们想要的内容。当然还要导入一系列的包,比如说requests、lxml、html等。当然由于http//www.pythonscraping.com/是英文网站,不存在中文乱码问题。
1.2 麻烦的开始
    本来当时的想法是写一些基础模块,方便之后开发的时候调用,减少重复性工作。为了保证代码在任何情况下都不会出现bug,所以想着用同样的代码爬取中文网站获取里面的文字
    修改上面代码中的两行代码:

点击(此处)折叠或打开

  1. url = ‘http://sports.sina.com.cn/g/premierleague/index.shtml‘
  2. print(tree.xpath("//span[@class=‘sec_blk_title‘]/text()"))

运行程序可以发现,在语句print(req.text)输出的内容中,中文字体已经是乱码了。最后的结果输出是[‘??????è§\x86é?\x91‘, ‘??\x80?\x9c\x9f?\x9b\x9eé??‘]
2 乱码解决办法
2.1 试错
    由于之前爬取csdn上一个网页没有出现乱码问题,但是在sina体育网站上出现了乱码,所以当时以为不是编码问题,以为是文档压缩问题。因为csdn获取的页面header里没有“Content-Encodings”属性,但是sina体育获取的页面header有“Content-Encodings”属性--“Content-Encoding: gzip”。
    在网上查看了多个相关问题的解决方案:
    1. http://stackoverflow.com/questions/3122145/zlib-error-error-3-while-decompressing-incorrect-header-check
    2. http://blog.csdn.net/pxf1234567/article/details/42006697
    3. http://blog.csdn.net/bytxl/article/details/21278249

总结:参考上述文献,结果还是没有解决问题,但是就考虑是不是方向错了。不过这部分工作也没有白做,很多网站返回数据都会有压缩问题,之后的工作中也能用上。

2.2 乱码终极解决办法
    后来查阅官方文档中response-content相关内容,说明了Requests会自动解码来自服务器的内容。Requests会基于HTTP头部对响应的编码作出有根据的推测,前提是响应文档的HTTP headers里面没有相关字符集说明。官方文档还说明了,如果你创建了自己的编码,并使用codecs 模块进行注册,你就可以轻松地使用这个解码器名称作为 r.encoding 的值, 然后由Requests来为你处理编码。(自己没有使用codecs模块,所以这里不贴代码了,不过按官方的说法使用codecs模块是最简单的一种方式。)
    另一份官方文档片段明确说了reponse编码处理方式:
        Requests遵循RFC标准,编码使用ISO-8859-1 。
        只有当HTTP头部不存在明确指定的字符集,并且 Content-Type 头部字段包含 text 值之时, Requests才不去猜测编码方式。

现在直接上实验结果,在原始代码中添加以下代码片段:

点击(此处)折叠或打开

  1. print(req.headers[‘content-type‘])
  2. print(req.encoding)
  3. print(req.apparent_encoding)
  4. print(requests.utils.get_encodings_from_content(page_content.text))

输出结果分别是:
    text/html
    ISO-8859-1#response内容的编码
    utf-8#response headers里设置的编码
    [‘utf-8‘]#response返回的html header标签里设置的编码
    返回的内容是采用‘ISO-8859-1’,所以出现了乱码,而实际上我们应该采用‘utf-8’编码
        
    总结:当response编码是‘ISO-8859-1’,我们应该首先查找response header设置的编码;如果此编码不存在,查看返回的Html的header设置的编码,代码如下:

点击(此处)折叠或打开

  1. if req.encoding == ‘ISO-8859-1‘:
  2. encodings = requests.utils.get_encodings_from_content(req.text)
  3. if encodings:
  4. encoding = encodings[0]
  5. else:
  6. encoding = req.apparent_encoding
  7. encode_content = req.content.decode(encoding, ‘replace‘).encode(‘utf-8‘, ‘replace‘)

参考资料:
    1. http://blog.csdn.net/a491057947/article/details/47292923
    2. http://docs.python-requests.org/en/latest/user/quickstart/#response-content

时间: 2025-01-02 09:24:43

Python+requests 爬取网站遇到中文乱码怎么办?的相关文章

Python爬虫——爬取网站的图片

爬虫这东西最早出现在我大学计算机网络的课程上面,我们当时的老师人很好,期末不笔试,他说这东西笔试没什么用,对于一个年纪比较大的老师来讲,能提出这种方式,实在难得.当时在考虑做一个与网络有关的东西好,第一个想到的就是爬虫.想想也没想过用Java写过这种东西,所以当时是一般看一本爬虫的书一边敲代码,现在想起来有很多东西是没有想明白的--我当时爬的是刘末鹏的博客,把全部文章用分类爬了下来,在本地可以打开. 后面老师评价的时候就说,你这个只能爬这个,其实你应该让他智能些,让他可以爬图片,可以爬特定的内容

WinForm使用webbrowser爬取数据,中文乱码问题

使用winform中的webbrowser抓取某个网站的数据时,遇到中文乱码的问题: 当时使用的获取网页内容的代码为: webBrowser1.DocumentText.ToString(); 不管我如何使用转换编码的方式进行转换,都是乱码,在度娘的帮助下,终于找到正确答案: 如果所爬取的网站的编码是GB2312,则可以使用如下代码进行读取网页数据: System.IO.StreamReader Reader = new System.IO.StreamReader(this.webBrowse

Python 利用 BeautifulSoup 爬取网站获取新闻流

0. 引言 介绍下 Python 用 Beautiful Soup 周期性爬取 xxx 网站获取新闻流: 图 1 项目介绍 1. 开发环境 Python: 3.6.3 BeautifulSoup:   4.2.0 , 是一个可以从HTML或XML文件中提取数据的Python库* ( BeautifulSoup 的中文官方文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/ ) 2. 代码介绍 实现主要分为三个模块: 1. 计时

python爬取网站美女图片

今天周五,项目刚刚上线完,有些时间,闲着无聊,继续复习爬虫,这次打算爬取网站的美女图片.得先找到目标,然后目标网站还不会反爬虫,因为自己只是小白,好了开始. 寻找目标,发现了目标,哈哈 http://www.meizitu.com 里面图片按专题分类.先看下页面找出相关源码 页面 源码 即只要抓出来图片集的link跟图片集里面的link对应的jpg就可以了, 可以用beautifulsoup或者正则匹配,我这里用正则匹配需要的link.然后遍历整个网站就可以了 请看源码解释 #!bin/pyth

简易Python脚本爬取我爱我家网站信息

最近杭州房价涨得好凶,要不要跟风买房,确实是个头疼的问题,不过做点准备总是没坏处的.前段时间我找了一个我爱我家的中介了解了下情况,他提到我爱我家官网,说上面信息的时效性和准确度都不错,可以时常关注一下.本着程序员的天性,一切可以用脚本偷懒的事情就都不要麻烦自己动手了,于是就写了一个脚本,用于监测我爱我家官网的消息变动,有新的房源信息就发短信给自己. 首先分析一下可行性,爬取网站,取得HTML页面的信息当然是没什么难度的,接下来就是从中整理出有用的信息,然后发短信给自己了. 发送短信的服务,搜索了

【python爬虫】根据查询词爬取网站返回结果

最近在做语义方面的问题,需要反义词.就在网上找反义词大全之类的,但是大多不全,没有我想要的.然后就找相关的网站,发现了http://fanyici.xpcha.com/5f7x868lizu.html,还行能把"老师"-"学生","医生"-"病人"这样对立关系的反义词查出来. 一开始我想把网站中数据库中存在的所有的词语都爬出来(暗网爬虫),但是分析了url的特点: http://fanyici.xpcha.com/5f7x86

python爬虫——爬取网页数据和解析数据

1.网络爬虫的基本概念 网络爬虫(又称网络蜘蛛,机器人),就是模拟客户端发送网络请求,接收请求响应,一种按照一定的规则,自动地抓取互联网信息的程序.只要浏览器能够做的事情,原则上,爬虫都能够做到. 2.网络爬虫的功能   图2 网络爬虫可以代替手工做很多事情,比如可以用于做搜索引擎,也可以爬取网站上面的图片,比如有些朋友将某些网站上的图片全部爬取下来,集中进行浏览,同时,网络爬虫也可以用于金融投资领域,比如可以自动爬取一些金融信息,并进行投资分析等. 有时,我们比较喜欢的新闻网站可能有几个,每次

利用linux curl爬取网站数据

看到一个看球网站的以下截图红色框数据,想爬取下来,通常爬取网站数据一般都会从java或者python爬取,但本人这两个都不会,只会shell脚本,于是硬着头皮试一下用shell爬取,方法很笨重,但旨在结果嘛,呵呵. 2.首先利用curl工具后者wget工具把整个网站数据爬取下来 curl 网址 >wangzhan.txt 3.查看wangzhan.txt文件,找出规则,看到数据是存放在哪个地方,本人是把txt文件拷到本机上用UE打开方便查看.通过查看文件,我发现数据是存储在"var aut

Python爬虫爬取知乎小结

博客首发至Marcovaldo's blog (http://marcovaldong.github.io/) 最近学习了一点网络爬虫,并实现了使用python来爬取知乎的一些功能,这里做一个小的总结.网络爬虫是指通过一定的规则自动的从网上抓取一些信息的程序或脚本.我们知道机器学习和数据挖掘等都是从大量的数据出发,找到一些有价值有规律的东西,而爬虫则可以帮助我们解决获取数据难的问题,因此网络爬虫是我们应该掌握的一个技巧. python有很多开源工具包供我们使用,我这里使用了requests.Be