您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 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就可以轻松安装。$sudoapt-getlibcurl3$sudoapt-getpython-pycurl如果想查看下系统内pycurl版本信息可以:1importpycurl2pycurl.version3'libcurl/7.19.7GnuTLS/2.8.5zlib/1.2.3.3libidn/1.15'如上所示,我的系统里的libcurl是7.19.7的最新版本。pycurl的使用:pycurl.Curl()-Curlobject这个函数创建一个同libcurl中的CURL处理器相对应的Curl对象.Curl对象自动的设置CURLOPT_VERBOSE为0,CURLOPT_NOPROGRESS为1,提供一个默认的CURLOPT_USERAGENT和设置CURLOPT_ERRORBUFFER指向一个私有的错误缓冲区.pycurl.CurlMulti()-CurlMultiobject这个函数创建一个新的与libcurl中的CURLM处理器相对应的CurlMulti对象.pycurl.CurlShare()-CurlShareobject这个函数创建一个新的与libcurl中的CURLSH处理器相对应的CurlShare对象.CurlShare对象可以在Curl对象上传递SHARE选项参数.[待续]其中:Curl对象具有以下方法:close()-None对应的是libcurl中的curl_easy_cleanup方法.当Curl对象不再被引用时pycurl会自动调用这个方法,但也可直接地调用这个方法.perform()-None对应于libcurl中的curl_easy_perform方法.setopt(option,value)-None对应于libcurl中的curl_easy_setopt方法,option使用libcurl中的CURLOPT_*常量来指定,只可惜CURLOPT_前缀现在已经被去掉了.value的数据类型依赖于option,它可以是一个字符串,整型,长整型,文件对象,列表或是函数.Exampleusage:importpycurlc=pycurl.Curl()c.setopt(pycurl.URL,)c.setopt(pycurl.HTTPHEADER,[Accept:])importStringIOb=StringIO.StringIO()c.setopt(pycurl.WRITEFUNCTION,b.write)c.setopt(pycurl.FOLLOWLOCATION,1)c.setopt(pycurl.MAXREDIRS,5)c.perform()printb.getvalue()getinfo(option)-Result对应于libcurl中的curl_easy_getinfo方法,option同样使用libcurl中的CURLOPT_*常量来指定,只可惜CURLOPT_前缀现在已经被去掉了.Result包含一个整数,浮点数或字符串,这都信赖于给定的option.getinfo方法不能在perform方法未调用或完成之前进行调用.Exampleusage:importpycurlc=pycurl.Curl()c.setopt(pycurl.URL,)c.setopt(pycurl.FOLLOWLOCATION,1)c.perform()printc.getinfo(pycurl.HTTP_CODE),c.getinfo(pycurl.EFFECTIVE_URL)...--200()-String返回这个处理器中内部libcurl错误缓冲区的字符串表示.其他的就以后再翻译吧。urilib2VSpycurl的一个简单对比编码如下,就是取一批url,然后分别用urllib2和pycurl的方法来获取页面内容,计算它们各自所消耗的时间。最后比较平均时间。我这跑了一下,相关的数据如下,大概pycurl能比urllib2减少20%以上的消耗时间。1:urllib2平均时间:0.379438,pycurl平均时间:0.2792132:urllib2平均时间:0.568966,pycurl平均时间:0.3952013:urllib2平均时间:0.606843,pycurl平均时间:0.4599654:urllib2平均时间:0.381241,pycurl平均时间:0.2396735:urllib2平均时间:0.503715,pycurl平均时间:0.5436006:urllib2平均时间:0.291307,pycurl平均时间:0.1884927:urllib2平均时间:0.449666,pycurl平均时间:0.299233相关代码如下:1:#coding=utf-82:importos3:importdatetimeasdt4:importtime5:importurllib26:importpycurl7:importcStringIOasStringIO8:9:'''测试用程序,用于比较pycurl和urllib2效率10:一只橘子2010.12.0511:'''12:13:deffetch_url(menuurl=):14:'''从url获取目录页内容;返回返回页面内容字符串15:使用urllib2来实现16:'''17:the_page=18:try:19:#下载页面20:req=urllib2.Request(menuurl)21:req.add_header('User-Agent','Mozilla/5.0(Windows;U;WindowsNT6.1;zh-CN;rv:1.9.2.12)Gecko/20101026Firefox/3.6.12')22:#设置超时23:response=urllib2.urlopen(req,timeout=30)24:the_page=response.read()25:exceptException,e:26:crawlerlog(+++++++++fetch_url():Error4:%s;menuurl:%s%(e,menuurl))27:returnthe_page28:29:deffetch_url2(menuurl=):30:'''从url获取目录页内容;返回返回页面内容字符串31:使用pycurl来实现32:'''33:the_page=34:try:35:#下载页面36:req=pycurl.Curl()37:req.setopt(pycurl.URL,menuurl)38:#设置超时39:req.setopt(pycurl.TIMEOUT,30)40:fp=StringIO.StringIO()41:req.setopt(pycurl.WRITEFUNCTION,fp.write)42:req.setopt(pycurl.USERAGENT,'Mozilla/5.0(Windows;U;WindowsNT6.1;zh-CN;rv:1.9.2.12)Gecko/20101026Firefox/3.6.12')43:req.perform()44:the_page=fp.getvalue()45:exceptException,e:46:crawlerlog(+++++++++fetch_url():Error555:%s;menuurl:%s%(e,menuurl))47:returnthe_page48:49:defcrawlerlog(doc):50:'''保存日志51:'''52:logfile=u./crawler_error.log53:try:54:out=open(logfile,a)55:out.write(Time:%s%s\n%(dt.datetime.now(),doc))56:exceptException,e:57:printError:%s%e58:finally:59:out.close()60:61:defurl_vs_curl():62:print开始:,dt.datetime.now()63:importtimeit64:link=['://://://://://://://://://cn.msn.com/','://cn.yahoo.com/','=2009hao123famousdaohang','://://://://://://://fund.eastmoney.com/','://://://://://youa.baidu.com/','://://://://://://://://://://://]65:link+=['
本文标题:Pycurl的安装与使用
链接地址:https://www.777doc.com/doc-4210446 .html