介绍
- 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