使用urllib爬取压缩过的网页

最近在使用urllib爬取网页的时候发现一个非常奇怪的问题,就是使用浏览器或者postman都可以正常访问的一个网页,但是使用urllib的话获取到的网页信息都是乱码,无论使用utf-8解码还是使用GBK解码都不行。

原始代码:

cookies = http.cookiejar.LWPCookieJar()
handlers = [
urllib.request.HTTPHandler(),
urllib.request.HTTPSHandler(),
urllib.request.HTTPCookieProcessor(cookies)
]
opener = urllib.request.build_opener(*handlers)
opener.addheaders = [('User-agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36')]

request = urllib.request.Request(url)
text = opener.open(request).read()

排除错误的过程

首先怀疑web page本身有问题,使用浏览器和postman,结果都能打开

其次怀疑代码问题,换成requests module,没有问题,可以正常获取

response = requests.request('GET', url, headers=headers)

但问题是我这里整个爬虫的框架都是用的是urllib,而且对于大多数web(几乎所有了)都是可以的。为什么偏偏对某些不行呢?总不能为了这一个来修改整体的代码吧。

继续钻研:
发现postman显示,accept-encoding: gzip,猜想难道web发过来的时候是压缩过的数据。那么试一下解压缩呢,于是将上面的代码修改为

cookies = http.cookiejar.LWPCookieJar()
handlers = [
urllib.request.HTTPHandler(),
urllib.request.HTTPSHandler(),
urllib.request.HTTPCookieProcessor(cookies)
]
opener = urllib.request.build_opener(*handlers)
opener.addheaders = [('User-agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36'),
('Accept-encoding', 'gzip')]

request = urllib.request.Request(url)
text = opener.open(request).read()
html = zlib.decompress(text, 16+zlib.MAX_WBITS)

这里的改动是加入一个一行,使用zlib来解压缩收到的数据,测试一下,完美解决之前的乱码问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值