簡介
在Linux上有個常用的命令 curl(非常好用),支援curl的就是大名鼎鼎的libcurl庫;libcurl是功能強大的,而且是非常高效的函式庫。libcurl除了提供本身的C API之外,還有多達40種程式語言的Binding,這裡介紹的PycURL就是libcurl的Python binding。
在Python中對網頁進行GET/POST等請求,當需要考慮高效能的時候,libcurl是非常不錯的選擇,一般來說會比liburl、liburl2快不少,可能也會比Requests的效率更高。特別是使用PycURL的多併發請求時,更是效率很高的。
常見用法
pycurl是十分強大和簡潔的,常見用法:
c = pycurl.Curl() #建立一個curl物件 c.setopt(pycurl.CONNECTTIMEOUT, 5) #連線的等待時間,設定為0則不等待 c.setopt(pycurl.TIMEOUT, 5) #請求超時時間 c.setopt(pycurl.NOPROGRESS, 0) #是否遮蔽下載進度條,非0則遮蔽 c.setopt(pycurl.MAXREDIRS, 5) #指定HTTP重定向的最大數 c.setopt(pycurl.FORBID_REUSE, 1) #完成互動後強制斷開連線,不重用 c.setopt(pycurl.FRESH_CONNECT,1) #強制獲取新的連線,即替代快取中的連線 c.setopt(pycurl.DNS_CACHE_TIMEOUT,60) #設定儲存DNS資訊的時間,預設為120秒 c.setopt(pycurl.URL,"http://www.baidu.com") #指定請求的URL c.setopt(pycurl.USERAGENT,"Mozilla/5.2 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50324)") #配置請求HTTP頭的User-Agent c.setopt(pycurl.HEADERFUNCTION, getheader) #將返回的HTTP HEADER定向到回撥函式getheader c.setopt(pycurl.WRITEFUNCTION, getbody) #將返回的內容定向到回撥函式getbody c.setopt(pycurl.WRITEHEADER, fileobj) #將返回的HTTP HEADER定向到fileobj檔案物件 c.setopt(pycurl.WRITEDATA, fileobj) #將返回的HTML內容定向到fileobj檔案物件 c.getinfo(pycurl.HTTP_CODE) #返回的HTTP狀態碼 c.getinfo(pycurl.TOTAL_TIME) #傳輸結束所消耗的總時間 c.getinfo(pycurl.NAMELOOKUP_TIME) #DNS解析所消耗的時間 c.getinfo(pycurl.CONNECT_TIME) #建立連線所消耗的時間 c.getinfo(pycurl.PRETRANSFER_TIME) #從建立連線到準備傳輸所消耗的時間 c.getinfo(pycurl.STARTTRANSFER_TIME) #從建立連線到傳輸開始消耗的時間 c.getinfo(pycurl.REDIRECT_TIME) #重定向所消耗的時間 c.getinfo(pycurl.SIZE_UPLOAD) #上傳資料包大小 c.getinfo(pycurl.SIZE_DOWNLOAD) #下載資料包大小 c.getinfo(pycurl.SPEED_DOWNLOAD) #平均下載速度 c.getinfo(pycurl.SPEED_UPLOAD) #平均上傳速度 c.getinfo(pycurl.HEADER_SIZE) #HTTP頭部大小
程式碼例項
Python2下:
import pycurl from StringIO import StringIO buffer = StringIO() c = pycurl.Curl() c.setopt(c.URL, 'http://www.pythontab.com/') c.setopt(c.WRITEDATA, buffer) c.perform() c.close() body = buffer.getvalue() print(body)
Python3下:
import pycurl from io import BytesIO buffer = BytesIO() c = pycurl.Curl() c.setopt(c.URL, 'http://www.pythontab.com/') c.setopt(c.WRITEDATA, buffer) c.perform() c.close() body = buffer.getvalue() print(body.decode('iso-8859-1'))