直接爬取gzip压缩过的网页,用decode(“utf-8“)无法读取html文档

今天在照着教程爬取某小说网页的时候,本想着试试最简单的urlopen然后直接输出html文档,代码如下:

req = urllib.request.Request(url,headers=headers)

response = urllib.request.urlopen(req)
html = ""
response = urllib.request.urlopen(req, timeout=10)
html=response.read().decode("utf-8")
print(html)

但是控制台输出报错

Traceback (most recent call last):
  File "D:xxxxx/novel_crawling.py", line 31, in <module>
    html=response.read().decode("utf-8")
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc8 in position 109: invalid continuation byte

查了一下报错信息,发现是"utf-8"不能解码一些字符,然后用chrome浏览器去看了看该网站,发现
在这里插入图片描述
虽然还是不知道这是啥玩意,于是继续百度,又发现原来

GZIP最早由Jean-loup Gailly和Mark
Adler创建,用于UNIX系统的文件压缩。我们在Linux中经常会用到后缀为.gz的文件,它们就是GZIP格式的。现今已经成为Internet
上使用非常普遍的一种数据压缩格式,或者说一种文件格式。HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。大流量的WEB站点常常使用GZIP压缩技术来让用户感受更快的速度。这一般是指WWW服务器中安装的一个功能,当有人来访问这个服务器中的网站时,服务器中的这个功能就将网页内容压缩后传输到来访的电脑浏览器中显示出来.一般对纯文本内容可压缩到原大小的40%.这样传输就快了,效果就是你点击网址后会很快的显示出来.当然这也会增加服务器的负载.
一般服务器中都安装有这个功能模块的.2.开GZIP有什么好处?答:Gzip开启以后会将输出到用户浏览器的数据进行压缩的处理,这样就会减小通过网络传输的数据量,提高浏览的速度。

现在大概知道这是个什么东西了,但是对如何爬取内容还是没有头绪。
然而书上的示例代码,用lxml库的html里面的parse方法解析urlopen返回的对象,之后就可以直接用xpath搜索想要的节点内容了

 req = urllib.request.Request(url, headers=headers)
    html = lxml.html.parse(urllib.request.urlopen(req))
    hrefs =html.xpath('//dd/a/@href')
    for href in hrefs:
        chapter_url_list.append(urllib.parse.urljoin(base_url,href))

虽然并没有直接解决问题,但是间接地可以爬取网页内容啦hh

Guess you like

Origin blog.csdn.net/weixin_45774350/article/details/108760547