Python爬取网页Utf-8解码错误及gzip压缩问题的解决办法

浏览: 1494

作者:博观厚积

链接:https://www.jianshu.com/p/bb4566e188f3

來源:简书



在我们用python3爬取一些网站时,获取网页url后进行解析,在采用decode('utf-8')解码时有时候会出现utf-8无法解码的问题,比如结果会提示:
Unicode Decode Error: 'utf8' codec can't decode byte 0xb2 in position 0: invalid start byte

这是因为有些网站进行了gzip压缩,最典型的就是sina,进行网页爬虫经常出现这个问题,那么为什么要压缩呢?搜狗百科解释为:
HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。大流量的WEB站点常常使用GZIP压缩技术来让用户感受更快的速度。这一般是指WWW服务器中安装的一个功能,当有人来访问这个服务器中的网站时,服务器中的这个功能就将网页内容压缩后传输到来访的电脑浏览器中显示出来.一般对纯文本内容可压缩到原大小的40%.这样传输就快了,效果就是你点击网址后会很快的显示出来.当然这也会增加服务器的负载*. *一般服务器中都安装有这个功能模块的。
我们在打开某个新浪网页,点击右键选择“检查”,然后Network》All》Headers下的“Request Headers”中就会发现这个字样:
Accept-Encoding:gzip, deflate, sdch

这个问题有的建议:“看一下设置的header是否存在 'Accept-Encoding':' gzip, deflate',这一句话,如果存在,删除即可解决。”,但是有时候header不存在这个代码,怎么删除?如下,我们以打开某个新浪新闻网页为例:

import BeautifulSoup
url=’http://news.sina.com.cn/c/nd/2017-02-05/doc-ifyafcyw0237672.shtml’req = urllib.request.Request(url)req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0')
page = urllib.request.urlopen(req) # 模仿浏览器登录
txt = page.read().decode('utf-8')
soup = BeautifulSoup(txt, 'lxml')
title =soup.select('#artibodyTitle')[0].text
print(title)```

在run之后仍会出现问题,当把*decode('utf-8')*去掉后得到的页面是乱码的。因此,解决的办法不是如此。
在这里有两种解决办法:(1)采用gzip库解压网页再解码;(2)使用requests库解析网页而不是urllib。
1)的解决办法为:在“txt = page.read()”页面读取之后,再加入下面这个命令:
txt=gzip.decompress(txt).decode('utf-8')

2)的解决办法为:
```import requests
import gzip
url="http://news.sina.com.cn/c/nd/2017-02-05/doc-ifyafcyw0237672.shtml"
req = requests.get(url)req.encoding= 'utf-8'```

这是对网页用设置为‘utf-8’的格式,但是这里模拟浏览器登录需采用这种方式:
headers = { 'Host': 'blog.csdn.net', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3', ….}

综合以上,我们看一下结果:
***错误的方式***
![](https://pic3.zhimg.com/v2-320f90bd0148565e87793b761fe16f5a_b.jpg)***Gzip******解压方式***
![](https://pic4.zhimg.com/v2-9ada2e1b953f0e7e62ecaaad5e3f5fb3_b.jpg)***Requests******的读取网页方式***
![](https://pic2.zhimg.com/v2-1526a346350861679be12011acaafbdd_b.jpg)
推荐 0
本文由 Python爱好者社区 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册