美文网首页Neubyepy爬虫爬虫
Python 笔记六:入门爬虫坑--网页数据压缩(python

Python 笔记六:入门爬虫坑--网页数据压缩(python

作者: brandonxiang | 来源:发表于2015-12-31 11:04 被阅读7609次

Python 笔记六:入门爬虫坑--网页数据压缩

源码github地址在此,记得点星:
https://github.com/brandonxiang/get_html_deflate_gzip


做项目就伴随着一个问题--数据来源。在网络数据获取的过程,考虑到数据的动态下载需要爬虫。这也是必经之路吧。

我在运用urllib2做相当简单的爬虫入门实验的时候,出现编码以及压缩等问题。这一个坑很多人踩过,甚至有人处理编码问题会出现一种情况,就是5分钟开发完成,25分钟处理编码问题。更不用说数据压缩,数据会面目全非。网页压缩主要两种,区别可参考gzip和deflate的几点区别

在这里用python举个栗子,小项目,用urllib2爬网页十分简单。

data = urllib2.urlopen(url).read()

网上有各种各样的解决数据压缩的方法。但是都没有很完美的解决方案。有些讲的是deflate,有的讲的是gzip。事实上,网页压缩技术采用deflate的网站已经很少,由于国内落后的网站还有一个很大保有量,特别是一些政府企事业的网站。我希望能提供一种两全齐美的解决方案。

deflate

import zlib
def deflate(data): 
    try:               
        return zlib.decompress(data, -zlib.MAX_WBITS)
    except zlib.error:
        return zlib.decompress(data)

两种压缩格式的解压方法有很大的差异。

gzip

from gzip import GzipFile
from StringIO import StringIO
def gzip(data):
    buf = StringIO(data)
    f = gzip.GzipFile(fileobj=buf)
    return f.read()

将两者结合写成一个整合方法

通过对Content-Encoding属性的判断,将两个方法结合在一起。

import urllib2
from gzip import GzipFile
from StringIO import StringIO
import zlib

def loadData(url):
    request = urllib2.Request(url)
    request.add_header('Accept-encoding', 'gzip,deflate')
    response = urllib2.urlopen(request)
    content = response.read()
    encoding = response.info().get('Content-Encoding')
    if encoding == 'gzip':
        content = gzip(content)
    elif encoding == 'deflate':
        content = deflate(content)
    return content

def gzip(data):
    buf = StringIO(data)
    f = gzip.GzipFile(fileobj=buf)
    return f.read()

def deflate(data):
    try:
        return zlib.decompress(data, -zlib.MAX_WBITS)
    except zlib.error:
        return zlib.decompress(data)

def main():
    url = "http://www.szxuexiao.com/"
    content = loadData(url)
    print content

if __name__ == '__main__':
    main()

转载,请表明出处。总目录Awesome GIS

转载,请表明出处。总目录后端记事本

微信公众号

相关文章

网友评论

  • 7763sea:如果出错zlib.error: Error -3 while decompressing data: incorrect header check

    参考其解释,把:

    respHtml = zlib.decompress(respHtml);
    变为:

    respHtml = zlib.decompress(respHtml, 16+zlib.MAX_WBITS);
  • 4eade07294ca:爬取网页的时候,用requests模块,并且携带请求头,响应的数据就是自动解压的数据
    看五年前自己的文章真是唏嘘不已:@fkeythg requests.content自动解压这两种压缩的数据
    086011f0621d:我用requests模块,也加了headers,可是响应的网页数据还是gzip压缩过的,这怎么回事
  • zBk9cN:你好,我想问一下,我用了你的gzip解压代码,但是一直报IOError: Not a gzipped file错误,我的response返回的是E1S39nxkmaJwT25sphEIxPF5dgPDEfM/lX4aF17PjKpVCh+z/4mzNJZvQm83guvBuYp3ZUdEDmSjbeI7NyaDqA==
    你能帮我看一下吗?谢谢
    d96110fb0f7f:把from gzip import GzipFile改成import gzip就好了
    zBk9cN:@brandonxiang 确认
    brandonxiang:@唐僧之妈 你确认那是gzip吗?
  • Air_man:python3需要改一些东西
    brandonxiang:@Air_man 我这是基于python2写的,你可以贴些代码
  • 菇凉别害怕啊我又不是什么好人:我擦,conda python竟然安装不了这个库……
    brandonxiang:@菇凉别害怕啊我又不是什么好人 这个不需要安装呀
  • 5b674470f1cd:感谢分享,收藏先了

本文标题:Python 笔记六:入门爬虫坑--网页数据压缩(python

本文链接:https://www.haomeiwen.com/subject/dxnihttx.html