首先,详细背景知识应该参考《深入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的数据