原文地址 http://www.cnblogs.com/lexus/archive/2012/04/08/2437336.htmlphp
Pycurl的簡單使用與對比 十二月 5th, 2010html
標籤: python,pycurlpython
在幾回莫名其妙的退出以後,我終於有點放棄urllib2,開始嘗試其餘的模塊。看到不少人推薦wget和pycurl。wget是獨立軟件,因此就沒考慮。pycurl的話,得益於基於c語言開發的curl性能強勁,使得廣泛反映它效率快、穩定性高、功能強大。因而決定嘗試之,簡單測試了下(見後面),若是用平均值來比較的話,pycur所消耗的時間遠小於urllib2。這對於爬蟲來說,累積以後變化就很是可觀了。ubuntu
PycURL 是一個很是快速(參考多併發操做)和豐富完整特性的,可是有點複雜的接口。若是你須要些簡單或純 Python 的模塊,你能夠參考一下 urllib2 或 urlgrabber 。經過 http://pycurl.sourceforge.net/ 瞭解 PycURL 的文檔信息及其其餘信息。由於 PycURL 是對 libcurl 的一個封裝,使用時還須要參考 libcurl 的文檔(針對 C 的)。安全
pycurl的安裝cookie
獲取和安裝libcurl很是簡單,取決於您所運行的Linux版本,若是你也使用ubuntu,那隻須要使用ap-get就能夠輕鬆安裝。併發
$ sudo apt-get libcurl3app
$ sudo apt-get python-pycurlcurl
若是想查看下系統內pycurl版本信息能夠:jsp
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會自動調用這個方法,但也可直接地調用這個方法.
perform() -> None 對應於libcurl中的curl_easy_perform方法.
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.perform()
print b.getvalue()
getinfo(option) -> Result 對應於 libcurl中的curl_easy_getinfo方法, option一樣使用libcurl中的CURLOPT_*常量來指定,只惋惜CURLOPT_前綴如今已經被去掉了. Result包含一個整數,浮點數或字符串,這都信賴於給定的option.getinfo方法不能在perform方法未調用或完成以前進行調用.
Example usage:
import pycurl
c = pycurl.Curl()
c.setopt(pycurl.URL, "http://sf.net")
c.setopt(pycurl.FOLLOWLOCATION, 1)
c.perform()
print c.getinfo(pycurl.HTTP_CODE), c.getinfo(pycurl.EFFECTIVE_URL)
...
--> 200 "http://sourceforge.net/"
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:1.9.2.12) 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:1.9.2.12) 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 = ['http://www.baidu.com/', 'http://www.sina.com.cn', 'http://www.qq.com', 'http://www.sohu.com', 'http://www.163.com/', 'http://www.ifeng.com/', 'http://www.cctv.com/default.shtml', 'http://www.xinhuanet.com/', 'http://www.people.com.cn/', 'http://cn.msn.com/', 'http://www.google.cn/', 'http://cn.yahoo.com/', 'http://www.amazon.cn/?source=2009hao123famousdaohang', 'http://www.chinamobile.com/', 'http://www.pconline.com.cn/', 'http://www.chinahr.com/', 'http://www.gov.cn/', 'http://www.zhcw.com/', 'http://www.autohome.com.cn/', 'http://www.zhaopin.com/Market/hao123.jsp', 'http://fund.eastmoney.com/', 'http://www.eastmoney.com/', 'http://www.xiaonei.com/', 'http://www.soufun.com/', 'http://www.51.com/', 'http://www.rayli.com.cn/', 'http://youa.baidu.com/', 'http://www.360.cn/', 'http://www.ctrip.com/', 'http://www.xcar.com.cn/', 'http://www.qq163.com', 'http://www.samsung.com/', 'http://www.zol.com.cn/', 'http://www.taobao.com/', 'http://www.icbc.com.cn/', 'http://www.sto.cn', 'http://www.dianping.com', 'http://www.gougou.com', 'http://www.ct10000.com']
65: link +=['http://www.qidian.com/', 'http://www.readnovel.com/', 'http://www.hongxiu.com/', 'http://www.bookge.com/', 'http://www.jjwxc.net/', 'http://hjsm.tom.com/', 'http://www.4yt.net/', 'http://www.cuiweiju.com/', 'http://book.sina.com.cn/', 'http://www.xxsy.net/', 'http://www.wansong.net/', 'http://www.myfreshnet.com/', 'http://www.fmx.cn/', 'http://www.xs8.cn/', 'http://www.rongshuxia.com/', 'http://www.booksky.org/', 'http://www.zhulang.com/', 'http://www.3320.net/', 'http://www.17k.com/', 'http://www.xhsd.net/', 'http://www.qukanshu.com/', 'http://www.fbook.net/', 'http://www.duyidu.com/', 'http://www.soso999.com/', 'http://www.junzitang.com/', 'http://msn.hongxiu.com/', 'http://www.yuanwen.com/', 'http://top.baidu.com/book.html', 'http://www.lcread.com/', 'http://www.sodu.com.cn/', 'http://www.cc222.com/', 'http://www.feiku.com/', 'http://book.hqdoor.com/', 'http://book.sooyuu.com/', 'http://www.52eshu.com/', 'http://bbs.91txt.com/', 'http://book.qq.com/', 'http://book.sohu.com/', 'http://www.baidu.com/search/guoxue/dir/fenlei.html', 'http://wind.yinsha.com/', 'http://www.duzhe.com/', 'http://www.storychina.cn/', 'http://www.shigeku.org/', 'http://www.goodmood.cn/', 'http://www.nlc.gov.cn/', 'http://www.qnwz.cn/', 'http://wenxue.xilu.com/']
66: link +=['http://www.ganji.com/', 'http://www.58.com/', 'http://www.baixing.com/', 'http://www.263.com/', 'http://www.kuxun.cn/', 'http://www.mangocity.com/', 'http://www.qunar.com/', 'http://www.dianping.com/', 'http://www.fantong.com/', 'http://www.55bbs.com/', 'http://www.19lou.com/', 'http://www.koubei.com/', 'http://www.nike.com.cn/', 'http://www.li-ning.com.cn/', 'http://www.bosideng.com/', 'http://www.pirateship.com.cn/', 'http://www.goelia.com.cn/', 'http://www.adidas.com/', 'http://www.converse.com.cn/', 'http://www.romon.com/index.php', 'http://www.youngor.com/', 'http://www.etam.com.cn', 'http://www.heilanhome.com/', 'http://www.mizuno.com.cn/', 'http://www.goldlion-china.com/', 'http://www.phland.com.cn/', 'http://www.betu.com.hk/', 'http://www.puma.com.cn/', 'http://www.anta.com/', 'http://www.pierrecardin.com.cn/', 'http://www.bobdog.com.cn/', 'http://www.idaphne.com/', 'http://www.e-giordano.com/', 'http://www.361sport.com/', 'http://www.levi.com.cn/', 'http://www.lee.com.cn/', 'http://www.shanshan.com/', 'http://www.semir.com', 'http://www.versace.com/flash.html', 'http://www.k-boxing.com/', 'http://only.nzn.cn/', 'http://www.pb89.com/%20', 'http://www.aimer.com.cn/', 'http://www.balenciaga.com', 'http://www.ordifen.com.cn/', 'http://www.ochirly.com/', 'http://www.uggaustralia.com/', 'http://www.jshyx.com/', 'http://www.givenchy.com/default.php', 'http://www.thenorthface.com.cn/', 'http://www.tissot.com.hk/', 'http://www.azona.com.hk/', 'http://www.3suisses.com.cn/', 'http://www.valentino.it/', 'http://www.yishion.com.cn/', 'http://www.chowtaiseng.com/', 'http://www.tsljewellery.com/', 'http://www.jeanswest.com/', 'http://www.baoxiniao.com.cn/', 'http://www.qsyr.com/%20', 'http://www.septwolves.com/', 'http://www.baleno.com.hk/', 'http://www.belle.com.cn/', 'http://www.teenmix.com.cn/', 'http://www.fairwhale.com.cn/', 'http://www.swatch.com.cn/', 'http://www.staccato.com/', 'http://www.daphne.com.cn/', 'http://www.c-banner.com/', 'http://www.xtep.com.cn/', 'http://www1.jeanswest.com.cn/', 'http://www.kappa.com.cn/', 'http://www.laofengxiang.com/', 'http://www.cnhqt.com/', 'http://www.tatashoes.com.cn/', 'http://www.robinhood.com.cn/', 'http://www.doublestar.com.cn/', 'http://www.ozarkgear.com.cn/', 'http://www.aokang.com.cn/', 'http://www.ctf.com.cn/', 'http://www.crpttan.com/', 'http://www.calvinklein.com/', 'http://www.citizen.com.cn/', 'http://www.longines.com/', 'http://www.jackjonescn.net/', 'http://www.famoustone.com/', 'http://www.kfc.com.cn/', 'http://www.bjyoshinoya.com.cn/', 'http://www.starbucks.cn/', 'http://www.icoke.cn/', 'http://www.mengniu.com.cn/', 'http://www.mcdonalds.com.cn/', 'http://www.yonghe.com.cn/', 'http://www.ubccn.com/', 'http://www.dicos.com.cn/', 'http://www.yili.com/', 'http://www.pizzahut.com.cn/', 'http://www.quanjude.com.cn/direct.php', 'http://www.nescafe.com.cn/', 'http://www.masterkong.com.cn/', 'http://www.heinz.com.cn/', 'http://www.origus.com/', 'http://www.xfy.com.cn/', 'http://www.haagendazs.com.cn/', 'http://www.wyeth.com.cn/', 'http://www.moutaichina.com/index.asp', 'http://www.tsingtao.com.cn/', 'http://www.meadjohnson.com.cn/', 'http://www.dumex.com.cn/', 'http://www.wuliangye.com.cn/', 'http://www.zkungfu.com/', 'http://www.dovechocolate.com.cn/', 'http://www.ganso.com.cn/%20%20%20', 'http://www.beingmate.com/', 'http://www.waffleboy.com.cn/', 'http://www.holiland.com.cn/', 'http://www.goldenjaguar.com/', 'http://www.huiyuan.com.cn/%20%20%20', 'http://www.hsufuchifoods.com/%20%20%20%20', 'http://www.maybellinechina.com/', 'http://www.dabao.com/', 'http://www.lorealchina.com/', 'http://www.shiseidochina.com/', 'http://www.esteelauder.com.cn/', 'http://www.avon.com.cn/PRSuite/home/home.jsp', 'http://www.tjoy.biz/', 'http://www.lancome.com.cn/_zh/_cn/index.aspx', 'http://www.kose.co.jp/', 'http://www.h2oplus.com.hk/', 'http://www.yuesai.com.cn/', 'http://www.nivea.com.cn/', 'http://www.chanel.com/', 'http://www.clinique.com.cn/index.tmpl?ngextredir=1', 'http://www.ponds.com.cn/', 'http://www.vichy.com.cn/', 'http://www.efu.org.cn/', 'http://www.laneigechina.com/Front-Page/index2.jsp', 'http://www.olay.com.cn/', 'http://www.guerlain.com.cn/', 'http://www.aupres-shiseido.com.cn/', 'http://www.dior.com/pcd/International/JSP/Home/prehomeFlash.jsp', 'http://www.herborist.com.cn/', 'http://www.dhc.net.cn/', 'http://www.ysl.com/', 'http://www.kose.com.cn/', 'http://www.liangfei.com/', 'http://www.tayoi.com/', 'http://www.chcedo.com/', 'http://www.head-shoulders.com.cn/', 'http://www.slek.com.cn/', 'http://www.mentholatum.com.cn/', 'http://www.pg.com.cn/', 'http://www.china-ajjj.com/', 'http://www.rejoice.com.cn/', 'http://www.cnnice.com/', 'http://www.watsons.com.cn/', 'http://www.unilever.com.cn/', 'http://www.ikea.com/cn/zh/', 'http://www.pantene.com.cn/', 'http://www.colgate.com.cn/app/Colgate/CN/HomePage.cvsp', 'http://www.auchan.com.cn/', 'http://www.c-bons.com.cn/', 'http://www.carrefour.com.cn/', 'http://www.vs.com.cn/', 'http://www.crest.com.cn/', 'http://www.tongrentang.com/', 'http://www.amway.com.cn/index.aspx', 'http://www.wal-martchina.com/', 'http://www.tupperware.com.cn/', 'http://www.ourlotus.com/', 'http://www.skyworth.com/cn/', 'http://www.sony.com.cn/', 'http://www.siemens.com.cn/', 'http://www.gree.com.cn/', 'http://www.shinco.com/', 'http://www.midea.com.cn/', 'http://www.samsung.com.cn/', 'http://www.hitachi-shha.com.cn/', 'http://www.electrolux.com.cn/', 'http://www.toshiba.com.cn/', 'http://www.panasonic.com.cn/', 'http://www.canon.com.cn/', 'http://www.tcl.com/', 'http://www.lg.com.cn/', 'http://cn.changhong.com/', 'http://www.haier.com/', 'http://www.philips.com.cn/', 'http://www.konka.com/', 'http://www.rsd.com.cn/', 'http://www.supor.com.cn/', 'http://www.fotile.com/', 'http://www.cnsuning.com/', 'http://www.sharp.cn/', 'http://www.galanz.com.cn/', 'http://www.chinamacro.cn/', 'http://www.robam.com/', 'http://www.gome.com.cn/', 'http://www.joyoung.com.cn/', 'http://www.staccato.com/', 'http://www.meiling.com/', 'http://www.fushibao.com/', 'http://www.sacon.cn/', 'http://www.yongle.com.cn/', 'http://www.xinfei.com/']
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: bb = fetch_url2(each)
78: c = time.time()
79: t_url.append(b-a)
80: t_curl.append(c-b)
81: # 保存urllib2的數據
82: sum_url=0
83: inf.write("urllib2\n")
84: for each in t_url:
85: inf.write(str(each)+"\n")
86: sum_url += each
87: inf.write("\n\n")
88: # 保存pycurl的數據
89: inf.write("pycurl\n")
90: sum_curl = 0
91: for each in t_curl:
92: inf.write(str(each)+"\n")
93: sum_curl += each
94: print "urllib2 平均時間:%f, pycurl平均時間:%f" % (sum_url*1.0/len(t_url), sum_curl*1.0/len(t_curl))
95: inf.close()
96: print "結束:",dt.datetime.now()
97:
98: if __name__ == "__main__":
99: for i in xrange(7):
100: url_vs_curl()
附相關資料:
urllib2是python的一個獲取url(Uniform Resource Locators,統一資源定址器)的模塊。它用urlopen函數的形式提供了一個很是簡潔的接口。這使得用各類各樣的協議獲取url成爲可能。它同時 也提供了一個稍微複雜的接口來處理常見的情況-如基本的認證,cookies,代理等等。這些都是由叫作opener和handler的對象來處理的。urllib2屬於python內置模塊。
Libcurl (http://curl.haxx.se/libcurl/)的介紹:
libcurl 是免費並且易於使用的客戶端的 URL 傳輸庫,支持 FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 和 LDAP。libcurl 支持 HTTPS 認證, HTTP POST, HTTP PUT, FTP 上傳, kerberos, 基於 HTTP 表單的上傳,代理,cookies,用戶名+密碼認證,文件傳輸恢復,http 代理封裝等!
libcurl 是高度可移植的,它在大量平臺上都有構建和一致的工做,包括: Solaris, NetBSD, FreeBSD, OpenBSD, Darwin, HP-UX, IRIX, AIX, Tru64, Linux, Windows, Amigo, OS/2, BeOs, Mac OS X, Ultrix, QNX, OpenVMS, RISC OS, Novell NetWare, DOS 和更多......
libcurl 是免費、線程安全、IPv6 安全、特性豐富,良好支持和快速的。
pycurl官方地址http://pycurl.sourceforge.net 官網上有各個版本的pycurl和相關文檔。