鱼C论坛

 找回密码
 立即注册
查看: 5985|回复: 14

[已解决]python爬虫爬取网页时的gzip压缩问题

[复制链接]
发表于 2020-3-7 13:28:43 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 Mr.Consummate 于 2020-3-7 14:44 编辑

python入门选手,刚写了一个爬取网站小说的爬虫,刚开始还不知道还有gzip压缩这回事,
先是经历了  UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte  的错误,

百度一番后知道了需要对接收到的数据进行解码,故参照  https://zhuanlan.zhihu.com/p/25095566  使用了gzip库解压网页再解码,本以为问题解决了,可谁知在爬取部分页面后又报了一个新的错误:
raise BadGzipFile('Not a gzipped file (%r)' % magic)
gzip.BadGzipFile: Not a gzipped file (b'<!')
目前还未找到错误原因以及解决办法,希望大佬帮忙看看

代码如下:

import urllib.request
import re
import gzip
import time

#首先爬取小说每一章节的链接
def get_url(url):
        req = urllib.request.Request(url)
        req.add_header("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36")
        page = urllib.request.urlopen(req)

        content = page.read()
        #content是gzip压缩过的数据,所以需要对我们接收的字节码进行一个解码操作
        content = gzip.decompress(content).decode('utf-8')

        str2_ = r"<dd><a href='([^.]*)"
        str2 = re.findall(str2_,content)
        return str2

#打开链接
def open_page(url):
        req = urllib.request.Request(url)
        req.add_header("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36")
        page = urllib.request.urlopen(req)
       
        if ('Content-Encoding','gzip') in page.headers._headers:
                #content是gzip压缩过的数据,所以需要对我们接收的字节码进行一个解码操作
                content = page.read()
                content = gzip.decompress(content).decode('utf-8')
        else:
                content = page.read().decode('utf-8')
        return content

#抓取并保存小说
def save_content(strs):
        content_ = r'&nbsp;&nbsp;&nbsp;&nbsp;([^<]*)'
        title_ = r'<title>([^_]*)'
        content = re.findall(content_,strs)
        title = re.findall(title_,strs)
        content[0] = title[0] + '\n\n\n     ' + content[0]
        with open("元尊.txt","a") as f:
                f.write(str('\n\n     '.join(content)))
                f.write('\n\n')


if __name__ == "__main__":
        str1 = 'http://www.xbiquge.la/'
        str3 = '.html'
        str2 = get_url('http://www.xbiquge.la/14/14930/')
        len_list = len(str2)
        for i in range(0,len_list):
                url = str1 + str2 + str3
                print(url)
                save_content(open_page(url))
                time.sleep(1)


最佳答案
2020-3-7 13:28:44
确认是gzip压缩吗

源码

源码

第二次报错

第二次报错

第一次报错

第一次报错

最佳答案

查看完整内容

确认是gzip压缩吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-7 13:28:44 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
确认是gzip压缩吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-7 13:37:00 | 显示全部楼层
wp231957 发表于 2020-3-7 13:32
确认是gzip压缩吗

应该是吧,前面的章节都能爬出来,到中间某一章的时候就会抱这个错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-7 13:54:44 | 显示全部楼层
本帖最后由 Mr.Consummate 于 2020-3-7 13:56 编辑
Mr.Consummate 发表于 2020-3-7 13:37
应该是吧,前面的章节都能爬出来,到中间某一章的时候就会抱这个错误


终于找到原因了....后面的章节变成了不压缩的...
只需要再在打开链接的函数中加一个判断就行了...(吐血。。)

        if ('Content-Encoding','gzip') in page.headers._headers:
                #content是gzip压缩过的数据,所以需要对我们接收的字节码进行一个解码操作
                content = page.read()
                content = gzip.decompress(content).decode('utf-8')
        else:
                content = page.read().decode('utf-8')
        return content
aaaa.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-7 13:56:32 From FishC Mobile | 显示全部楼层
Mr.Consummate 发表于 2020-3-7 13:54
终于找到原因了....后面的章节变成了不压缩的...
只需要再在打开链接的函数中加一个判断就行了...(吐血 ...

没事,吐着吐着就习惯了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-7 14:03:15 | 显示全部楼层
wp231957 发表于 2020-3-7 13:56
没事,吐着吐着就习惯了

我之前有过这个怀疑,感觉可能不是压缩了,判断了一下,但是不是用headers作为判断条件,结果还是个错的,就打消了这个思路,现在想起来可能是我之前的判断条件写错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-7 14:04:44 From FishC Mobile | 显示全部楼层
Mr.Consummate 发表于 2020-3-7 14:03
我之前有过这个怀疑,感觉可能不是压缩了,判断了一下,但是不是用headers作为判断条件,结果还是个错的 ...

是笔趣阁吗??挺变态呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-7 14:07:46 | 显示全部楼层
wp231957 发表于 2020-3-7 14:04
是笔趣阁吗??挺变态呀

嗯,新笔趣阁,可能是它的资源来源也不太统一吧,然后站长也不怎么想干统一格式这事
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-7 14:08:50 From FishC Mobile | 显示全部楼层
Mr.Consummate 发表于 2020-3-7 14:07
嗯,新笔趣阁,可能是它的资源来源也不太统一吧,然后站长也不怎么想干统一格式这事

我用的是笔趣阁app
所以没爬过书籍一类的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-7 14:12:57 | 显示全部楼层
wp231957 发表于 2020-3-7 14:08
我用的是笔趣阁app
所以没爬过书籍一类的

这个网站挺好爬的,访问频率限制不怎么严格,昨天晚上本来想搞一搞全书网,结果访问频率高了点,现在我的ip地址还在被它的服务器ban着,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-7 14:14:03 From FishC Mobile | 显示全部楼层
Mr.Consummate 发表于 2020-3-7 14:12
这个网站挺好爬的,访问频率限制不怎么严格,昨天晚上本来想搞一搞全书网,结果访问频率高了点,现在我的 ...

是你太狠了,不怪对方,哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-7 14:32:32 | 显示全部楼层
检查响应报头啊,常见的头部(1)Content-Type(2)Content-Range(3)Content-Ecnoding 最好检查一下,写一个函数封装一下。注意大小写问题,一般不区分。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-7 14:59:34 | 显示全部楼层
TJBEST 发表于 2020-3-7 14:32
检查响应报头啊,常见的头部(1)Content-Type(2)Content-Range(3)Content-Ecnoding 最好检查一下,写一个 ...

主要是第一次遇到压缩的问题,没啥经验
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-9 21:23:22 | 显示全部楼层
请问这个响应报头是需要怎么改?我也碰到了跟你一样的问题,但是我爬取的是sina的weibo,只是请求网页源码就卡住了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-12 10:32:21 | 显示全部楼层
我也遇到了第一次全爬了,然后之后越来越少,现在一个网页都打不开了一直是gzip.BadGzipFile: Not a gzipped file (b'<!')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-13 09:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表