介绍

  • PycURl是一个C语言写的libcurl的python绑定库。与urllib相比,pycurl的速度要快很多。
  • 关于python网络编程,使用urllib与服务器通信时,客户端的数据是添加到Head里面通过URL,发送到服务器端,urllib包实现客户端上传文件时,会出现死掉的状态(实际上是超时设置问题)。
  • Libcurl 是一个支持FTP,FTPS,HTTP,HTTPS,GOPHER,TELNET,DICT,FILE 和 LDAP的客户端URL传输库。libcurl也支持HTTPS认证,HTTP、POST、HTTP PUT、FTP上传,代理,Cookies,基本身份验证,FTP文件断点继传,HTTP代理通道等等。

pycurl模块的api

c = pycurl.Curl()    #创建一个curl对象 

c.perform()		# 提交请求访问url

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头部大小 



logger.info("测试网站:".format(URL))
	logger.info("HTTP状态码:{}" .format(HTTP_CODE))
	logger.info("HTTP状态码:%s" %(HTTP_CODE))
	logger.info("DNS解析时间:%.2f ms"%(NAMELOOKUP_TIME*1000))
	logger.info("建立连接时间:%.2f ms" %(CONNECT_TIME*1000))
	logger.info("准备传输时间:%.2f ms" %(PRETRANSFER_TIME*1000))
	logger.info("传输开始时间:%.2f ms" %(STARTTRANSFER_TIME*1000))
	logger.info("传输结束总时间:%.2f ms" %(TOTAL_TIME*1000))
	logger.info("下载数据包大小:%d bytes/s" %(SIZE_DOWNLOAD))
	logger.info("HTTP头部大小:%d byte" %(HEADER_SIZE))
	logger.info("平均下载速度:%d bytes/s" %(SPEED_DOWNLOAD))

简单的实例入门

import pycurl
from io import BytesIO


url='www.baidu.com'
c=pycurl.Curl()
c.setopt(pycurl.URL, url)
b= BytesIO()

# 下面这俩返回的结果是一样的
# c.setopt(c.WRITEDATA, b)
c.setopt(pycurl.WRITEFUNCTION, b.write)
c.perform()
# print(b.getvalue())    

dict1 = {

"total_time": c.getinfo(pycurl.TOTAL_TIME),
# DNS解析所消耗的时间
'namelookup_time': c.getinfo(pycurl.NAMELOOKUP_TIME),
# 建立连接所消耗的时间
'connect_time': c.getinfo(pycurl.CONNECT_TIME),
# 从建立连接到准备传输所消耗的时间
'pretransfer_time': c.getinfo(pycurl.PRETRANSFER_TIME),
# 从建立连接到传输开始消耗的时间
'starttransfer_time': c.getinfo(pycurl.STARTTRANSFER_TIME),
# 重定向所消耗的时间
'redirect_time': c.getinfo(pycurl.REDIRECT_TIME),
# 上传数据包大小
'size_upload': c.getinfo(pycurl.SIZE_UPLOAD),
# 下载数据包大小
'size_download': c.getinfo(pycurl.SIZE_DOWNLOAD),
# 平均下载速度
'speed_download': c.getinfo(pycurl.SPEED_DOWNLOAD),
# 平均上传速度
'speed_upload': c.getinfo(pycurl.SPEED_UPLOAD),
# HTTP头部大小
'header_size': c.getinfo(pycurl.HEADER_SIZE)
}

print(dict1)

post请求

def initCurl():
'''初始化一个pycurl对象,
尽管urllib2也支持 cookie 但是在登录cas系统时总是失败,并且没有搞清楚失败的原因。
这里采用pycurl主要是因为pycurl设置了cookie后,可以正常登录Cas系统
'''
        c = pycurl.Curl()
        c.setopt(pycurl.COOKIEFILE, "cookie_file_name")#把cookie保存在该文件中
        c.setopt(pycurl.COOKIEJAR, "cookie_file_name")
        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’)
        return c
然后,封装出HTTP中的两个常用方法,GET和POST

def GetDate(curl, url):
'''获得url指定的资源,这里采用了HTTP的GET方法
'''
        head = ['Accept:*/*',
                'User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11']
        body = {'name':'zs'}
        buf = StringIO.StringIO()
        curl.setopt(pycurl.WRITEFUNCTION, buf.write)
        curl.setopt(pycurl.URL, url)
        curl.setopt(pycurl.HTTPHEADER,  head)
        import pycurl,urllib.request,urllib.parse
        c.setopt(pycurl.POSTFIELDS,urllib.parse.urlencode(body))
        curl.perform()
        the_page =buf.getvalue()
        buf.close()
        return the_page
def PostData(curl, url, data):
'''提交数据到url,这里使用了HTTP的POST方法

备注,这里提交的数据为json数据,
如果需要修改数据类型,请修改head中的数据类型声明
'''
        head = ['Accept:*/*',
                'Content-Type:application/xml',
                'render:json',
                'clientType:json',
                'Accept-Charset:GBK,utf-8;q=0.7,*;q=0.3',
                'Accept-Encoding:gzip,deflate,sdch',
                'Accept-Language:zh-CN,zh;q=0.8',
                'User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11']
        buf = StringIO.StringIO()
        curl.setopt(pycurl.WRITEFUNCTION, buf.write)
        curl.setopt(pycurl.POSTFIELDS,  data)
        curl.setopt(pycurl.URL, url)
        curl.setopt(pycurl.HTTPHEADER,  head)
        curl.perform()
        the_page = buf.getvalue()
        #print the_page
        buf.close()
        return the_page
当然,还需要一些引用

import pycurl
import StringIO
import urllib
好了,给出个例子

    c = initCurl()
    html = GetDate(c, 'http://www.baidu.com')
    print html