Python中的CURL PycURL庫簡介及例項

pythontab發表於2017-12-29

簡介

在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'))


相關文章