Pycurl的安装与使用
下载后可任意编辑 Pycurl的简单使用与对比 在几次莫名其妙的退出之后,我终于有点放弃urllib2,开始尝试其他的模块。看到很多人推举wget和pycurl。wget是独立软件,所以就没考虑。pycurl的话,得益于基于c语言开发的curl性能强劲,使得普遍反映它效率快、稳定性高、功能强大。于是决定尝试之,简单测试了下(见后面),假如用平均值来比较的话,pycur所消耗的时间远小于urllib2。这对于爬虫来讲,累积之后变化就非常可观了。 PycURL 是一个非常快速(参考多并发操作)和丰富完整特性的,但是有点复杂的接口。假如你需要些简单或纯 Python 的模块,你可以参考一下 urllib2 或 urlgrabber 。通过 了解 PycURL 的文档信息及其其他信息。因为 PycURL 是对 libcurl 的一个封装,使用时还需要参考 libcurl 的文档(针对 C 的)。 pycurl的安装 猎取和安装libcurl非常简单,取决于您所运行的Linux版本,假如你也使用ubuntu,那只需要使用ap-get就可以轻松安装。 $ sudo apt-get libcurl3 $ sudo apt-get python-pycurl 假如想查看下系统内pycurl版本信息可以: 1 >>> import pycurl 2 >>> pycurl.version 3 libcurl/7.19.7 GnuTLS/2.8.5 zlib/1.2.3.3 libidn/1.15 如上所示,我的系统里的libcurl是7.19.7的最新版本。 pycurl的使用: pycurl.Curl() -> Curl object 这个函数创建一个同 libcurl中的CURL处理器相对应的Curl对象.Curl对象自动的设置CURLOPT_VERBOSE为0, CURLOPT_NOPROGRESS为1,提供一个默认的CURLOPT_USERAGENT和设置CURLOPT_ERRORBUFFER指向一个私 有的错误缓冲区. pycurl.CurlMulti() -> CurlMulti object 这个函数创建一个新的与libcurl中的CURLM处理器相 对应的CurlMulti对象. pycurl.CurlShare() -> CurlShare object 这个函数创建一个新的与libcurl中的CURLSH处理器 相对应的CurlShare对象.CurlShare对 象可以在Curl对象上传递SHARE选项参数. [待续] 其中: Curl对象具有以下方法: close() -> None 对应的是 libcurl中的curl_easy_cleanup方法.当Curl对象不再被引用时pycurl会自动调用这个方法,但也可直接地调用这个方法. per() -> None 对应于libcurl中的curl_easy_per方法. setopt(option, value) -> None 对应于libcurl中的curl_easy_setopt方法, option使用libcurl中的CURLOPT_*常量来指定,只可惜CURLOPT_前缀现在已经被去掉了.value的数据类型依赖于 option,它可以是一个字符串,整型,长整型,文件对象,列表或是函数. Example usage: import pycurl c = pycurl.Curl() c.setopt(pycurl.URL, “http://www.python.org/“) c.setopt(pycurl.HTTPHEADER, [“Accept:“]) import StringIO b = StringIO.StringIO() c.setopt(pycurl.WRITEFUNCTION, b.write) c.setopt(pycurl.FOLLOWLOCATION, 1) c.setopt(pycurl.MAXREDIRS, 5) c.per() print b.getvalue() getinfo(option) -> Result 对应于 libcurl中的curl_easy_getinfo方法, option同样使用libcurl中的CURLOPT_*常量来指定,只可惜CURLOPT_前缀现在已经被去掉了. Result包含一个整数,浮点数或字符串,这都信赖于给定的option.getinfo方法不能在per方法未调用或完成之前进行调用. Example usage: import pycurl c = pycurl.Curl() c.setopt(pycurl.URL, ““) c.setopt(pycurl.FOLLOWLOCATION, 1) c.per() print c.getinfo(pycurl.HTTP_CODE), c.getinfo(pycurl.EFFECTIVE_URL) . --> 200 “ errstr() -> String 返回这个处理器中内部libcurl错误缓冲区的字符串表示. 其他的就以后再翻译吧。 urilib2 VS pycurl的一个简单对比 编码如下,就是取一批url,然后分别用urllib2和pycurl的方法来猎取页面内容,计算它们各自所消耗的时间。最后比较平均时间。 我这跑了一下,相关的数据如下,大概pycurl能比urllib2减少20%以上的消耗时间。 1: urllib2 平均时间:0.379438, pycurl平均时间:0.279213 2: urllib2 平均时间:0.568966, pycurl平均时间:0.395201 3: urllib2 平均时间:0.606843, pycurl平均时间:0.459965 4: urllib2 平均时间:0.381241, pycurl平均时间:0.239673 5: urllib2 平均时间:0.503715, pycurl平均时间:0.543600 6: urllib2 平均时间:0.291307, pycurl平均时间:0.188492 7: urllib2 平均时间:0.449666, pycurl平均时间:0.299233 相关代码如下: 1: #coding=utf-8 2: import os 3: import datetime as dt 4: import time 5: import urllib2 6: import pycurl 7: import cStringIO as StringIO 8: 9: