Python 笔记六:入门爬虫坑–网页数据压缩(python deflate gzip)
admin
2023-07-30 20:47:19
0

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

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...