python爬虫爬取网页时的gzip压缩问题
本帖最后由 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' ([^<]*)'
title_ = r'<title>([^_]*)'
content = re.findall(content_,strs)
title = re.findall(title_,strs)
content = title + '\n\n\n ' + content
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)
确认是gzip压缩吗 wp231957 发表于 2020-3-7 13:32
确认是gzip压缩吗
应该是吧,前面的章节都能爬出来,到中间某一章的时候就会抱这个错误 本帖最后由 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 Mr.Consummate 发表于 2020-3-7 13:54
终于找到原因了....后面的章节变成了不压缩的...
只需要再在打开链接的函数中加一个判断就行了...(吐血 ...
没事,吐着吐着就习惯了 wp231957 发表于 2020-3-7 13:56
没事,吐着吐着就习惯了
我之前有过这个怀疑,感觉可能不是压缩了,判断了一下,但是不是用headers作为判断条件,结果还是个错的,就打消了这个思路,现在想起来可能是我之前的判断条件写错了{:10_266:} Mr.Consummate 发表于 2020-3-7 14:03
我之前有过这个怀疑,感觉可能不是压缩了,判断了一下,但是不是用headers作为判断条件,结果还是个错的 ...
是笔趣阁吗??挺变态呀 wp231957 发表于 2020-3-7 14:04
是笔趣阁吗??挺变态呀
嗯,新笔趣阁,可能是它的资源来源也不太统一吧,然后站长也不怎么想干统一格式这事 Mr.Consummate 发表于 2020-3-7 14:07
嗯,新笔趣阁,可能是它的资源来源也不太统一吧,然后站长也不怎么想干统一格式这事
我用的是笔趣阁app
所以没爬过书籍一类的 wp231957 发表于 2020-3-7 14:08
我用的是笔趣阁app
所以没爬过书籍一类的
这个网站挺好爬的,访问频率限制不怎么严格,昨天晚上本来想搞一搞全书网,结果访问频率高了点,现在我的ip地址还在被它的服务器ban着, Mr.Consummate 发表于 2020-3-7 14:12
这个网站挺好爬的,访问频率限制不怎么严格,昨天晚上本来想搞一搞全书网,结果访问频率高了点,现在我的 ...
是你太狠了,不怪对方,哈哈 检查响应报头啊,常见的头部(1)Content-Type(2)Content-Range(3)Content-Ecnoding 最好检查一下,写一个函数封装一下。注意大小写问题,一般不区分。 TJBEST 发表于 2020-3-7 14:32
检查响应报头啊,常见的头部(1)Content-Type(2)Content-Range(3)Content-Ecnoding 最好检查一下,写一个 ...
主要是第一次遇到压缩的问题,没啥经验{:10_333:} 请问这个响应报头是需要怎么改?我也碰到了跟你一样的问题,但是我爬取的是sina的weibo,只是请求网页源码就卡住了 我也遇到了第一次全爬了,然后之后越来越少,现在一个网页都打不开了一直是gzip.BadGzipFile: Not a gzipped file (b'<!')
页:
[1]