Pycurl介紹

http://blog.csdn.net/xajax/article/details/4246903 html


pycurl — A Python interface to the cURL library

Pycurl包是一個libcurl的Python接口.pycurl已經成功的在Python2.2到Python2.5版編譯測試過了.python

Libcurl是一個支持FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 和 LDAP的客戶端URL傳輸庫.libcurl也支持HTTPS認證,HTTP POST,HTTP PUT,FTP上傳,代理,Cookies,基自己份驗證,FTP文件斷點繼傳,HTTP代理通道等等.linux

Libcurl提供的全部功能均可以經過pycurl接口來使用.ajax

Module Functionality

pycurl.global_init(option) ->None 
選項是如下常量之一:pycurl.GLOBAL_SSL, pycurl.GLOBAL_WIN32, pycurl.GLOBAL_ALL, pycurl.GLOBAL_NOTHING, pycurl.GLOBAL_DEFAULT. 相應的是libcurl的 curl_global_init() 方法.app

pycurl.global_cleanup() -> None 
相應的是libcurl的curl_global_cleanup()方法.curl

pycurl.version 
這是liburl當前版本的信息,相應的是liburl的curl_version()方法.
用法舉例:函數

>>> import pycurl
>>> pycurl.version
'libcurl/7.12.3 OpenSSL/0.9.7e zlib/1.2.2.1 libidn/0.5.12'測試

pycurl.version_info() -> Tuple 
相對應的是libcurl中的 curl_version_info() 方法. 返回一個序列信息就像liburl的curl_version_info()方法返回的 curl_version_info_data 結構化數據. 
用法舉例:url

>>> import pycurl
>>> pycurl.version_info()
(2, '7.12.3', 461827, 'i586-pc-linux-gnu', 1565, 'OpenSSL/0.9.7e', 9465951,
'1.2.2.1', ('ftp''gopher''telnet''dict''ldap''http''file',
'https''ftps'), None, 0, '0.5.12')spa

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選項參數.

Subsections

  • Curl objects

  • CurlMulti objects

  • CurlShare objects

  • Callbacks

    Curl Object

    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,它能夠是一個字符串,整型,長整型,文件對象,列表或是函數.
    用法舉例:

    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方法未調用或完成以前進行調用.
    用法舉例:

    errstr() -> String 
    返回這個處理器中內部libcurl錯誤緩衝區的字符串表示.

    CurlMulti Object


    CurlMulti對象具備如下方法:

    close() -> None 
    對應於libcurl中的curl_multi_cleanup()方法.當CurlMulti對象再也不被引用時pycurl會自動調用該方法,也可顯示調用該方法.

    perform() -> tuple of status and the number of active Curl objects 
    對應於libcurl中的curl_multi_perform()方法.

    add_handle(Curl object) -> None 
    對應於libcurl中的curl_multi_add_handle()方法.這個方法添加一個有效的Curl對象到CurlMulti對象.
    重要提示:add_handle沒有隱式的增長對Curl對象的引用(於是也沒有增長Curl對象的引用次數)

    remove_handle(Curl object) -> None
    對應於libcurl中的curl_multi_remove_handle()方法.這個方法從CurlMulti對象中移除一個現有的Curl對象.
    重要提示:remove_handle不會隱式的移除Curl對象的引用(於是不會減小Curl對象的引用次數).

    fdset() -> triple of lists with active file descriptors, readable, writeable, exceptions. 
    對應於libcurl中的curl_multi_fdset()方法.這個方法從CurlMulti對象中提取文件描述信息.返回的列表能夠被用於select模塊to poll for events.
    用法舉例:

    import pycurl
    c = pycurl.Curl()
    c.setopt(pycurl.URL, "http://curl.haxx.se")
    m = pycurl.CurlMulti()
    m.add_handle(c)
    while 1:
         ret, num_handles = m.perform()
        if ret != pycurl.E_CALL_MULTI_PERFORM: break
    while num_handles:
         apply(select.select, m.fdset() + (1,))
        while 1:
             ret, num_handles = m.perform()
            if ret != pycurl.E_CALL_MULTI_PERFORM: break

    select(timeout) -> number of ready file descriptors or -1 on timeout 
    這是一個有用的函數,它簡化了fdest()和select模塊的組合使用.
    用法舉例:

    import pycurl
    c = pycurl.Curl()
    c.setopt(pycurl.URL, "http://curl.haxx.se")
    m = pycurl.CurlMulti()
    m.add_handle(c)
    while 1:
         ret, num_handles = m.perform()
        if ret != pycurl.E_CALL_MULTI_PERFORM: break
    while num_handles:
         ret = m.select(1.0)
        if ret == -1:  continue
        while 1:
             ret, num_handles = m.perform()
            if ret != pycurl.E_CALL_MULTI_PERFORM: break

    info_read([max]) -> numberof queued messages, a list of successful objects, a list of failed objects 
    對應於libcurl中的curl_multi_info_read()方法.這個方法從多重棧中提取至多max個信息而後返回兩個列表.第一個列表包含成功完成的操做第二個列表包含每個失敗的curl對象的<curl對象,curl錯誤代碼,curl錯誤信息>序列.

    CurlShare Object

    CurlShare對象具備如下方法:

    setopt(option, value) -> None 
    對應於libcurl中的curl_share_setopt方法, option使用libcurl中的CURLOPT_*常量來指定,只惋惜CURLOPT_前綴如今改爲SH_了.一般value必須是 LOCK_DATA_COOKIE 或者說LOCK_DATA_DNS.
    用法舉例:

    import pycurl
    curl = pycurl.Curl()
    s = pycurl.CurlShare()
    s.setopt(pycurl.SH_SHARE, pycurl.LOCK_DATA_COOKIE)
    s.setopt(pycurl.SH_SHARE, pycurl.LOCK_DATA_DNS)
    curl.setopt(pycurl.URL, 'http://curl.haxx.se')
    curl.setopt(pycurl.SHARE, s)
    curl.perform()
    curl.close()


    Callbacks

    爲了更好的控制,libcurl容許把一些回調函數關聯到每一個鏈接中.在pycurl中,回調函數經過Curl對象調用setopt爲s WRITEFUNCTION, READFUNCTION, HEADERFUNCTION, PROGRESSFUNCTION, IOCTLFUNCTION, 或DEBUGFUNCTION這些選項設置.這些選項對應着libcurl中CURLOPT_*前綴被移除的選項.在pycurl中回調函數必須是一個正規的Python函數,或者一個類的方法或是一個擴展的函數類型.

    這兒有些侷限性就是這些選項的回調函數有可能同時發生.它容許不一樣的回調函數對應到不一樣的Curl對象.更多明確的是,WRITEDATA的回調函數不能用於WRITEFUNCTION,READDATA的回調函數不能用於READFUNCTION,WRITEHEADER的回調函數不能用於 HEADERFUNCTION,PROGRESSDATA回調函數不能用於PROGRESSFUNCTION,IOCTLDATA回調函數不能用於 IOCTLFUNCTION,DEBUGDATA回調函數不能用於DEBUGFUNCTION.實際上,能夠經過把一個類的實例方法來看成回調函數而且使用類實例屬性像文件對象那樣存儲每一個對象的數據來克服這種侷限性.

    Pycurl中的每一個回調函數的簽名以下:


    WRITEFUNCTION(string) -> number of characters written

    READFUNCTION(number of characters to read)-> string

    HEADERFUNCTION(string) -> number of characters written

    PROGRESSFUNCTION(download total, downloaded, upload total, uploaded) -> status

    DEBUGFUNCTION(debug message type, debug message string) -> None

    IOCTLFUNCTION(ioctl cmd) -> status

    Example: Callbacks for document header and body

    這個例子打印頭數據到stderr打印內容數據到stdout.一樣注意它們都不返回寫入的字節數. WRITEFUNCTION和HEADERFUNCTION回調,寫入全部字節時返回None.

        ## Callback function invoked when body data is ready
        def body(buf):
            # Print body data to stdout
            import sys
             sys.stdout.write(buf)
            # Returning None implies that all bytes were written

        ## Callback function invoked when header data is ready
        def header(buf):
            # Print header data to stderr
            import sys
             sys.stderr.write(buf)
            # Returning None implies that all bytes were written

         c = pycurl.Curl()
         c.setopt(pycurl.URL, "http://www.python.org/")
         c.setopt(pycurl.WRITEFUNCTION, body)
         c.setopt(pycurl.HEADERFUNCTION, header)
         c.perform()

    Example: Download/upload progress callback

    這個例子演示如何使用進度回調.當下載一個文檔時,uploads參數都將是0,反之亦然.

        ## Callback function invoked when download/upload has progress
        def progress(download_t, download_d, upload_t, upload_d):
            print "Total to download", download_t
            print "Total downloaded", download_d
            print "Total to upload", upload_t
            print "Total uploaded", upload_d

         c.setopt(c.URL, "http://slashdot.org/")
         c.setopt(c.NOPROGRESS, 0)
         c.setopt(c.PROGRESSFUNCTION, progress)
         c.perform()

    Example: Debug callbacks

    這個例子演示如何使用調試回調.調試信息類型是一個調試信息的整數標示類型.在這個回調被調用時VERBOSE選項必須可用.

        def test(debug_type, debug_msg):
            print "debug(%d): %s" % (debug_type, debug_msg)

         c = pycurl.Curl()
         c.setopt(pycurl.URL, "http://curl.haxx.se/")
         c.setopt(pycurl.VERBOSE, 1)
         c.setopt(pycurl.DEBUGFUNCTION, test)
         c.perform()


    Other examples

    Pycrul也包含一些用於演示如何在libcurl中使用不一樣的回調的測試腳本和事例.例如,文件 examples/file_upload.py包含如何使用READFUNCTION的事例代碼, 'tests/test_cb.py'演示WRITEFUNCTION和HEADERFUNCTION, 'tests/test_debug.py'演示DEBUGFUNCTION, 'tests/test_getinfo.py'演示PROGRESSFUNCTION.

    ============================================================================

    編輯文本保存在C:/Python25/Lib下的pycurl_test.py

    import pycurl
    import StringI

    def getURLContent_pycurl(url):   
       c = pycurl.Curl()
       c.setopt(pycurl.URL,url)
       b = StringIO.StringIO()
       c.setopt(pycurl.WRITEFUNCTION, b.write)
       c.setopt(pycurl.FOLLOWLOCATION, 1)
       c.setopt(pycurl.MAXREDIRS, 5)
       #c.setopt(pycurl.PROXY, 'http://11.11.11.11:8080')
       #c.setopt(pycurl.PROXYUSERPWD, 'aaa:aaa')
       c.perform()
       return b.getvalue()

    在命令行中輸入import pycurl_test

    url ='http://blog.csdn.net'

    content = getURLContent_pycurl(url)

    print content

    =============================================================

相關文章
相關標籤/搜索