现在的位置: 首页 > 综合 > 正文

【经验总结2】httplib2 下载 gzip数据

2012年08月12日 ⁄ 综合 ⁄ 共 1587字 ⁄ 字号 评论关闭

首先,详细背景知识应该参考《深入python3》中的http章节

做了实际的测试,以支持gzip压缩的131漫画网的页面为例

http://comic.131.com/content/16365/151406/17.html

进行了如下测试:

import multiprocessing
import time
import urllib.request
import httplib2

def gzip():
    #httplib2.debuglevel = 1
    h = httplib2.Http('.cache')
    response,data = h.request("http://comic.131.com/content/16365/151406/17.html",headers={'Accept-Encoding':'gzip,identity','cache-control':'no-cache'})

def identity():
    #httplib2.debuglevel = 1
    h = httplib2.Http('.cache')
    response,data = h.request("http://comic.131.com/content/16365/151406/17.html",headers={'Accept-Encoding':'identity','cache-control':'no-cache'})

def urllib_identity():
    data = urllib.request.urlopen("http://comic.131.com/content/16365/151406/17.html").read()

if __name__ == "__main__":
    from timeit import Timer
    t1=Timer("gzip()","from __main__ import gzip")
    t2=Timer("identity()","from __main__ import identity")
    t3=Timer("urllib_identity()","from __main__ import urllib_identity")
    print(t1.timeit(100))
    print(t2.timeit(100))
    print(t3.timeit(100))

其中time模块的使用也是应当记住的,但不是重点。

在gzip()中,设置Accept-Encoding为gzip优先,由于我事先已经知道网站支持传输gzip数据,所以这么设置,下载到的一定是gzip的东西。

本来的想法是通过response中的content-length来看看gzip下载的数据量是否更少,但是发现由于httplib2自带解压功能,所以实际上data里的东西是解压之后的数据,而content-length也是解压之后的大小。故无法直接判定。而且用identity方式下载的时候,有时候response.items()列出的字典项里面根本没有content-length,这点也让人费解。总之,最后决定通过执行时间来判断下载的数据多少。

identity()是用httplib2下载未经压缩的数据,urllib_identity()是用urllib.request下载未压缩的数据

在自测中,将3个函数分别传入3个计时器,并且打印出每个函数执行100次的时间。结果如下:

10.36172354438112
16.53859735619307
18.407492004169207

显然,是否下载gzip数据差距十分明显。另外一点让人意外的是,同样是下载未压缩的数据,httplib2 居然能比标准库 urllib.request 快2s(当然这是100次的)。这是非常大的速度差距,说明,以后抓站应该尽量用httplib2,并且下载gzip的数据

抱歉!评论已关闭.