Pycurl的安装与使用.doc_第1页
Pycurl的安装与使用.doc_第2页
Pycurl的安装与使用.doc_第3页
Pycurl的安装与使用.doc_第4页
Pycurl的安装与使用.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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版本信息可以:1 import pycurl2 pycurl.version3 libcurl/7.19.7 GnuTLS/2.8.5 zlib/ libidn/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,它可以是一个字符串,整型,长整型,文件对象,列表或是函数.Example usage:import pycurlc = pycurl.Curl()c.setopt(pycurl.URL, /)c.setopt(pycurl.HTTPHEADER, Accept:)import StringIOb = StringIO.StringIO()c.setopt(pycurl.WRITEFUNCTION, b.write)c.setopt(pycurl.FOLLOWLOCATION, 1)c.setopt(pycurl.MAXREDIRS, 5)c.perform()print b.getvalue()getinfo(option) - Result对应于 libcurl中的curl_easy_getinfo方法, option同样使用libcurl中的CURLOPT_*常量来指定,只可惜CURLOPT_前缀现在已经被去掉了. Result包含一个整数,浮点数或字符串,这都信赖于给定的option.getinfo方法不能在perform方法未调用或完成之前进行调用.Example usage:import pycurlc = pycurl.Curl()c.setopt(pycurl.URL, )c.setopt(pycurl.FOLLOWLOCATION, 1)c.perform()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: 测试用程序,用于比较pycurl和urllib2效率 10: 一只橘子 2010.12.05 11: 12: 13: def fetch_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; Windows NT 6.1; zh-CN; rv:2) Gecko/20101026 Firefox/3.6.12) 22: #设置超时 23: response = urllib2.urlopen(req, timeout = 30) 24: the_page = response.read() 25: except Exception, e: 26: crawlerlog(+fetch_url():Error4: %s; menuurl: %s % (e, menuurl) 27: return the_page 28: 29: def fetch_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; Windows NT 6.1; zh-CN; rv:2) Gecko/20101026 Firefox/3.6.12) 43: req.perform() 44: the_page = fp.getvalue() 45: except Exception, e: 46: crawlerlog(+fetch_url():Error555: %s; menuurl: %s % (e, menuurl) 47: return the_page 48: 49: def crawlerlog(doc): 50: 保存日志 51: 52: logfile = u./crawler_error.log 53: try: 54: out = open(logfile, a) 55: out.write( Time: %s %s n % (dt.datetime.now(), doc) 56: except Exception,e: 57: print Error: %s % e 58: finally: 59: out.close() 60: 61: def url_vs_curl(): 62: print 开始:,dt.datetime.now() 63: import timeit 64: link = /, , , , /, /, /default.shtml, /, /, /, /, /, /?source=2009hao123famousdaohang, /, /, /, /, /, /, /Market/hao123.jsp, /, /, /, /, /, /, /, /, /, /, , /, /, /, /, , , , 65: link +=/, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /book.html, /, /, /, /, /, /, /, /, /, /, /search/guoxue/dir/fenlei.html, /, /, /, /, /, /, /, / 66: link +=/, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /index.php, /, , /, /, /, /, .hk/, /, /, /, /, /, /, /, /, /, /, , /flash.html, /, /, /%20, /, , /, /, /, /, /default.php, /, .hk/, .hk/, /, http:/www.valentino.it/, /, /, /, /, /, /%20, /, .hk/, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /direct.php, /, /, /, /, /, /, /, /index.asp, /, /, /, /, /, /, /%20%20%20, /, /, /, /, /%20%20%20, /%20%20%20%20, /, /, /, /, /, /PRSuite/home/home.jsp, /, /_zh/_cn/index.aspx, http:/www.kose.co.jp/, .hk/, /, /, /, /index.tmpl?ngextredir=1, /, /, /, /Front-Page/index2.jsp, /, /, /, /pcd/International/JSP/Home/prehomeFlash.jsp, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /cn/zh/, /, /app/Colgate/CN/HomePage.cvsp, /, /, /, /, /, /, /index.aspx, /, /, /, /cn/, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, / 67: t_url = #urllib2 每个url的消耗时间的列表 68: t_curl = #pycurl 每个url的消耗时间的列表 69: f = ./time.csv #保存相关数据,供进一步分析 70: inf = open(f,a) 71: for index, each in enumerate(link): 72: # urllib2 73: a = time.time() 74: aa = fetch_url(each) 75: b = time.time() 76: # pycurl 77

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论