美文网首页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