pycurl,Python cURL library

pycurl — A Python interface to the cURL library

Pycurl包是一个libcurl的Python接口.pycurl已经成功的在Python2.2到Python2.5版编译测试过了.

Libcurl是一个支持FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 和 LDAP的客户端URL传输库.libcurl也支持HTTPS认证,HTTP POST,HTTP PUT,FTP上传,代理,Cookies,基本身份验证,FTP文件断点继传,HTTP代理通道等等.

Libcurl提供的所有功能都可以通过pycurl接口来使用.

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() 方法.

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

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 结构化数据.
用法举例:

>>> 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‘)

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

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

时间: 2024-11-05 10:49:04

pycurl,Python cURL library的相关文章

关于使用TexturePackerGUI将图片合成和用Python Imaging Library将图片分解

写这片博客前,我在学习cocos2d-x,正在做一个微信打飞机的项目,为了将飞机图片资源合成为一张,使用到了TexturePackerGUI软件,在这介绍使用方法,后面是将这张合成图片分解成原来图片的方法. 合成 软件下载地址 破解完成之后就开始使用,对里面控件不熟悉的请参考这篇文章,虽然看起来复杂,但是只要把你所有需要合成的资源全部移到右边的框内就行了,如下图(蓝色的地方): 好了,把图片全部拖进去之后,就可以开始导出了,选择菜单栏中的Publish,在此之前,请在左边的DataFile中设置

Awesome Python,Python的框架集合

Awesome Python A curated list of awesome Python frameworks, libraries and software. Inspired by awesome-php. Awesome Python Environment Management 环境管理 Package Management              软件包管理 Package Repositories              软件源 Distribution          

CentOS 6.5 Python Image Library 配置

转自:http://www.cnblogs.com/way_testlife/archive/2011/04/17/2019013.html PIL 下载: http://www.pythonware.com/products/pil/index.htm 安装 PIL $ tar xvfz Imaging-1.1.7.tar.gz        $ cd Imaging-1.1.7        $ python setup.py install 1. 简介. 图像处理是一门应用非常广的技术,而

安装 Python Image Library (Pillow)

作者:kkninjae 出处:http://www.cnblogs.com/kkninjae 转载请注明出处,谢谢. 最近读到一篇图像灰度算法的文章,打算用 Python 实现一下文章中提到的算法. 于是找了一下 Python 处理图片类多媒体文件的库,发现 Python 自带的库 imageop 在 Python3 里面被废弃了,果断扔(虽然我用的 Python2 :)). 随后发现了 Python Image Library,API 还成,够直白简单.但是这个库很久没更新了,果断扔.还好找到

php cURL library is not loaded

问题: php 在命令行里面可以找到 curl 模块,但是用apache 没有找到 curl 模块. 表现内容为: extension_loaded('curl')cURL library is not loaded 下面变量 undefined CURLOPT_SSL_VERIFYPEER, CURLOPT_SSL_VERIFYHOST, CURLOPT_CONNECTTIMEOUT, CURLOPT_TIMEOUT, 原因: 没有加载: libeay32.dll . ssleay32.dll

PIL Python Imaging Library (PIL)

介绍 把Python的基础知识学习后,尝试一下如何安装.加载.使用非标准库,选择了图像处理模块PIL. Python Imaging Library (PIL)是PythonWare公司提供的免费的图像处理工具包,是python下的图像处理模块,支持多种格式,并提供强大的图形与图像处理功能.虽然在这个软件包上要实现类似MATLAB中的复杂的图像处理算法并不太适合,但是Python的快速开发能力以及面向对象等等诸多特点使得它非常适合用来进行原型开发.对于简单的图像处理或者大批量的简单图像处理任务,

碉堡了,python识别黄色图片

创建testimg.py import sysfrom PIL import Image img = Image.open(sys.argv[1]).convert('YCbCr') w, h = img.size data = img.getdata() cnt = 0 for i, ycbcr in enumerate(data): y, cb, cr = ycbcr if 86 <= cb <= 117 and 140 <= cr <= 168: cnt += 1 print

做数据分析,Python和R究竟哪个更强?

作者: Enoch Kan编译: Mika本文为 CDA 数据分析师原创作品,转载需授权 几十年来,研究人员和开发人员一直在争论,进行数据科学和数据分析,Python和R语言哪种才是更好的选择.近年来,数据科学在生物技术.金融和社交媒体等多个行业迅速发展.数据科学的重要性不仅得到了业内人士的认可,而且还得到了许多学术机构的认可,目前越来越多的学校都开始设立数据科学学位. 随着开源技术的迅速取代了传统的闭源技术,Python和R语言在数据科学中变得越来越受欢迎. 数据科学就业增长图--Indeed

云计算学习教程,Python自动化运维开发实战

都忘记是什么时候知道python的了,我是搞linux运维的,早先只是知道搞运维必须会shell,要做一些运维自动化的工作,比如实现一些定时备份数据啊.批量执行某个操作啊.写写监控脚本什么的. 后来发现工作量大的时候shell开始变慢,实现某个功能使用shell感觉力不从心,听人说python能实现shell能做的一切功能,而且开发效率高,速度快,慢慢的就认识了python,多多少少看点简单的东西. 印象最深的是花几天时间把<python简明手册>看完后,感觉python很简单,特二的认为自己