pycurl(http://pycurl.sourceforge.net)是一个用C语言写的libcurl Python实现,速度很快,比urllib和httplib都快功能非常强大,支持的操作协议有FTP、HTTP、HTTPS、TELNET等,可以理解成Linux下curl命令功能的Python封装,简单易用。
下面介绍Curl对象的几个常用的方法:
close()方法,对应libcurl包中的curl_easy_cleanup方法,无参数,实现关闭、回收Curl对象。
perform()方法,对应libcurl包中的curl_easy_perform方法,无参数,实现Curl对象请求的提交。
setopt(option, value)方法,对应libcurl包中的curl_easy_setopt方法,参数option是通过libcurl的常量来指定的,参数value的值会依赖option,可以是一个字符串、整型、长整型、文件对象、列表或函数等。
getinfo(option)方法,对应libcurl包中的curl_easy_getinfo方法,参数option是通过libcurl的常量来指定的。
使用pycurl实现探测Web服务质量脚本:
<code> #!/usr/bin/python #coding:utf-8 import os,sys import time import pycurl ''' 探测web服务质量 www.tianfeiyu.com ''' URL = 'http://www.tianfeiyu.com' #探测的目标URL c = pycurl.Curl() #创建一个Curl对象 c.setopt(pycurl.URL,URL) #定义请求的URL常量 c.setopt(pycurl.CONNECTTIMEOUT,10) #定义请求的等待连接时间 c.setopt(pycurl.TIMEOUT,20) #定义请求的超时时间 c.setopt(pycurl.NOPROGRESS,1) #屏蔽下载进度条 c.setopt(pycurl.FORBID_REUSE,1) #完成交互后强制断开连接,不重用 c.setopt(pycurl.MAXREDIRS,1) #指定HTTP重定向的最大数为1 c.setopt(pycurl.DNS_CACHE_TIMEOUT,30) #设置保存DNS信息的时间为30秒 c.setopt(c.USERAGENT, 'Foo') #创建一个文件对象,以‘wb’方式打开,用来存储返回的http头部及页面内容 indexfile = open(os.path.dirname(os.path.realpath(__file__))+'/content','wb') #os.path.realpath(__file__) 返回指定的文件名真实路径,不使用任何符号链接。os.path.dirname返回文件路径 c.setopt(pycurl.WRITEHEADER,indexfile) #将返回的HTTP HEADER定向到indefile文件对象 c.setopt(pycurl.WRITEDATA,indexfile) #将返回的HTML内容定向到indexfile文件对象 try: c.perform() #提交请求 except Exception as e: print('connection error:'+str(e)) indexfile.close() c.close() sys.exit() NAMELOOKUP_TIME = c.getinfo(c.NAMELOOKUP_TIME) #获取DNS解析时间 CONNECT_TIME = c.getinfo(c.CONNECT_TIME) #获取连接建立的时间 PRETRANSFER_TIME = c.getinfo(c.PRETRANSFER_TIME) #获取从连接建立到准备传输所消耗的时间 STARTTRANSFER_TIME = c.getinfo(c.STARTTRANSFER_TIME) #获取从连接建立到传输开始所消耗的时间 TOTAL_TIME = c.getinfo(c.TOTAL_TIME) #获取传输的总时间 HTTP_CODE = c.getinfo(c.HTTP_CODE) #获取 HTTP 状态码 SIZE_DOWNLOAD = c.getinfo(c.SIZE_DOWNLOAD) #获取下载数据包大小 HEADER_SIZE = c.getinfo(c.HEADER_SIZE) #获取 HTTP 头部大小 SPEED_DOWNLOAD = c.getinfo(c.SPEED_DOWNLOAD) #获取平均下载速度 #打印输出相关数据 print('HTTP状态码: %s' %(HTTP_CODE)) print('DNS解析状态:%.2f ms' %(NAMELOOKUP_TIME*1000)) print('建立连接时间: %.2f ms' %(CONNECT_TIME*1000)) print('准备传输时间:%.2f ms' %(PRETRANSFER_TIME*1000)) print('传输开始时间:%.2f ms' %(STARTTRANSFER_TIME*1000)) print('传输结束总时间:%.2f ms' %(TOTAL_TIME*1000)) print('下载数据包大小:%d bytes/s' %(SIZE_DOWNLOAD)) print('HTTP 头部大小:%d bytes/s' %(HEADER_SIZE)) print('平均下载速度:%d bytes/s' %(SPEED_DOWNLOAD)) #关闭文件及curl对象 indexfile.close() c.close() </code>
运行结果:
<code> [root@feiyu auto]# python web_check.py HTTP状态码: 200 DNS解析状态:5055.88 ms 建立连接时间: 5100.66 ms 准备传输时间:5100.67 ms 传输开始时间:5581.72 ms 传输结束总时间:5627.53 ms 下载数据包大小:32662 bytes/s HTTP 头部大小:248 bytes/s 平均下载速度:5803 bytes/s [root@sta auto]# cat content #查看http头部及页面内容 HTTP/1.1 200 OK Date: Thu, 19 Nov 2015 10:28:24 GMT Server: Apache/2.4.3 (Unix) OpenSSL/1.0.1e-fips X-Powered-By: PHP/5.4.26 X-Pingback: http://www.tianfeiyu.com/xmlrpc.php Transfer-Encoding: chunked Content-Type: text/html; charset=UTF-8 <!DOCTYPE HTML> <html> <head> 。。。。。。 。。。。。。 </code>
此脚本只是初步完成的,还在不断完善中,欢迎继续关注!