今天使用python+pycurl来检测网站性能,使用curl_obj.getinfo(pycurl.*_TIME)来获取各个阶段运行时间
total_time = curl_obj.getinfo(pycurl.TOTAL_TIME)
#传输结束所消耗的总时间
dns_time = curl_obj.getinfo(pycurl.NAMELOOKUP_TIME)
#从发起请求到DNS解析完成所消耗的时间
connect_time = curl_obj.getinfo(pycurl.CONNECT_TIME)
#从发起请求到建立连接所消耗的时间
redirect_time = curl_obj.getinfo(pycurl.REDIRECT_TIME)
#从发起请求到重定向所消耗的时间
ssl_time = curl_obj.getinfo(pycurl.APPCONNECT_TIME)
#从发起请求到SSL建立握手时间
pretrans_time = curl_obj.getinfo(pycurl.PRETRANSFER_TIME)
#从发起请求到准备传输所消耗的时间
starttrans_time = curl_obj.getinfo(pycurl.STARTTRANSFER_TIME)
#从发起请求到接收第一个字节的时间
最后发现,dns_time+connect_time+......+starttrans_time远远大于total_time。
查看man curl(pycurl基于curl开发的),发现各个阶段时间是从客户端发起URL请求时到某个阶段的时间差,而不是某个阶段开始时间到结束时间差。
为了求得某个阶段的执行时间,需要对这些值进行计算。
pycurl的各个阶段(根据pycurl.*_TIME统计)依次为
DNS解析-->TCP连接-->跳转【如有】-->SSL握手【如有】-->客户端准备-->服务器响应-->数据传输
代码如下:
#! /usr/bin/python
#coding:utf-8
#-*- coding : utf-8 -*-
import sys,pycurl
request_url = sys.argv[1]
curl_obj = pycurl.Curl()
#创建一个curl对象
curl_obj.setopt(pycurl.CONNECTTIMEOUT, 5)
#连接的等待时间,设置为0则不等待
curl_obj.setopt(pycurl.TIMEOUT, 5)
#最大下載时间
curl_obj.setopt(pycurl.NOPROGRESS, 1)
#是否屏蔽下载进度条,非0则屏蔽
curl_obj.setopt(pycurl.MAXREDIRS, 0)
#指定HTTP重定向的最大数
curl_obj.setopt(pycurl.FORBID_REUSE, 1)
#完成交互后强制断开连接,不重用
curl_obj.setopt(pycurl.FRESH_CONNECT,1)
#强制获取新的连接,即替代缓存中的连接
curl_obj.setopt(pycurl.DNS_CACHE_TIMEOUT,1)
#设置保存DNS信息的时间,默认为120秒
curl_obj.setopt(pycurl.URL,request_url)
#指定请求的URL
import StringIO
strio = StringIO.StringIO()
curl_obj.setopt(pycurl.WRITEFUNCTION, strio.write)
try :
curl_obj.perform()
err_mess = ''
except Exception as e:
err_mess = str(e)
#访问页面
total_time = curl_obj.getinfo(pycurl.TOTAL_TIME)
#传输结束所消耗的总时间
dns_time = curl_obj.getinfo(pycurl.NAMELOOKUP_TIME)
#从发起请求到DNS解析完成所消耗的时间
connect_time = curl_obj.getinfo(pycurl.CONNECT_TIME)
#从发起请求到建立连接所消耗的时间
redirect_time = curl_obj.getinfo(pycurl.REDIRECT_TIME)
#从发起请求到重定向所消耗的时间
ssl_time = curl_obj.getinfo(pycurl.APPCONNECT_TIME)
#从发起请求到SSL建立握手时间
pretrans_time = curl_obj.getinfo(pycurl.PRETRANSFER_TIME)
#从发起请求到准备传输所消耗的时间
starttrans_time = curl_obj.getinfo(pycurl.STARTTRANSFER_TIME)
#从发起请求到接收第一个字节的时间
print '发起请求到DNS解析时间 : %.3f ms' %(dns_time*1000)
print '发起请求到TCP连接完成时间: %.3f ms' %(connect_time*1000)
print '发起请求到跳转完成时间: %.3f ms' %(redirect_time*1000)
print '发起请求到SSL建立完成时间 : %.3f ms' %(ssl_time*1000)
print '发起请求到客户端发送请求时间: %.3f ms' %(pretrans_time*1000)
print '发起请求到客户端接受首包时间: %.3f ms' %(starttrans_time*1000)
print '总时间为: %.3f ms' %(total_time*1000)
print ''
transfer_time = total_time - starttrans_time
#传输时间
serverreq_time = starttrans_time - pretrans_time
#服务器响应时间,包括网络传输时间
if ssl_time == 0 :
if redirect_time == 0 :
clientper_time = pretrans_time - connect_time
#客户端准备发送数据时间
redirect_time = 0
else :
clientper_time = pretrans_time - redirect_time
redirect_time = redirect_time - connect_time
ssl_time = 0
else :
clientper_time = pretrans_time - ssl_time
if redirect_time == 0 :
ssl_time = ssl_time - connect_time
redirect_time = 0
else :
ssl_time = ssl_time - redirect_time
redirect_time = redirect_time - connect_time
connect_time = connect_time - dns_time
print '发起请求到DNS解析时间 : %.3f ms' %(dns_time*1000)
print 'TCP连接消耗时间 : %.3f ms' %(connect_time*1000)
print '跳转消耗时间: %.3f ms' %(redirect_time*1000)
print 'SSL握手消耗时间 : %.3f ms' %(ssl_time*1000)
print '客户端发送请求准备时间: %.3f ms' %(clientper_time*1000)
print '服务器处理时间: %.3f ms' %(serverreq_time*1000)
print '数据传输时间: %.3f ms' %(transfer_time*1000)
经过多次测试,终于dns_time+connect_time+......+starttrans_time=total_time
分享到:
相关推荐
离线安装包,亲测可用
python-pycurl-7.19.0-19.el7.x86_64.rpm python-urlgrabber-3.10-10.el7.noarch.rpm rpm-python-4.11.3-45.el7.x86_64.rpm 下载完成后,执行命令 :rpm -ivh python-* rpm-python-* --nodeps --force
python-pycurl-7.19.0-19.el7.x86_64.rpm python-setuptools-0.9.8-7.el7.noarch.rpm python-urlgrabber-3.10-9.el7.noarch.rpm python-virtualenv-15.1.0-2.el7.noarch.rpm rpm-4.11.3-40.el7.x86_64.rpm rpm-...
《Python的CURL库:PyCurl深度解析》 PyCurl是Python中一个非常重要的库,它提供了对libcurl的接口,使Python程序能够处理各种网络协议,如HTTP、HTTPS、FTP、FTPS等。libcurl是一个强大的URL传输库,而PyCurl则将...
8. **多线程**:`pycurl`支持多连接处理,可以同时处理多个HTTP请求,提高程序的并发性能。 9. **回调函数**:可以设置回调函数处理传输过程中的事件,例如数据接收、进度跟踪等。 10. **限速功能**:可以设置上传...
需要注意的是,由于这些包是针对CentOS 6.5设计的,所以在更高版本的系统上可能不适用,因为它们可能缺少对新系统特性的支持或与新版本的软件存在兼容性问题。在安装前,务必确保系统版本与这些包相匹配。
python-pycurl-7.19.0-19.el7.x86_64.rpm python-urlgrabber-3.10-9.el7.noarch.rpm rpm-4.11.3-45.el7.src.rpm rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm rpm-python-4.11.3-45.el7.x86_64.rpm yum-3.4.3-168....
8. **性能优化**:pycurl通过高效的缓冲机制和内存管理,减少了系统调用次数,提高了整体性能。 针对"win32-py2.7"这一标签,说明这个版本是为32位的Windows系统和Python 2.7编译的。由于Python 2.7已经在2020年1月...
通过正确理解和运用pycurl,Python开发者可以高效地处理各种网络通信问题,提升项目的性能和稳定性。 总之,pycurl是Python中一个强大的网络访问工具,其全面的协议支持、灵活的配置选项以及高效的性能,使其成为...
python-pycurl-7.19.0-19.el7.x86_64.rpm python-libs-2.7.5-86.el7.x86_64.rpm python-chardet-2.2.1-3.el7.noarch.rpm python2-rpm-macros-3-32.el7.noarch.rpm python-kitchen-1.1.1-5.el7.noarch.rpm ...
如果你不小心删除了Python 2,可能会导致一系列的问题,尤其是`yum`不能正常工作,因为`yum`自身就是用Python编写的。本篇文章将深入探讨如何处理"CentOS7误删Python2后yum报错"的问题。 首先,让我们理解一下`yum`...
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
content = self.fetch_with_pycurl(response.url) # 处理网页内容 ... def fetch_with_pycurl(self, url): # 自定义PyCurl逻辑 ... ``` 总的来说,PyCurl是Python中不可或缺的网络请求工具,尤其在Pyspider...
然而,有时候用户可能会遇到`yum`的版本过旧或者某些依赖包缺失的问题。本资源集合了一组特定版本的`yum`及其相关依赖包,旨在解决这个问题。 首先,让我们逐个分析提供的压缩包文件,了解它们在`yum`安装过程中的...
pycurl 基于curl 官方只出版了32位版本 在http://www.lfd.uci.edu/~gohlke/pythonlibs/#pycurl中有非官方的64位版本
在实际应用中,PyCurl常被用于爬虫开发、文件上传下载、网页抓取等场景,其高效的性能和丰富的功能使其成为Python网络编程中的重要工具。然而,需要注意的是,由于PyCurl直接操作底层网络接口,因此对于错误处理和...
官方离线安装包,亲测可用
Pycurl相对于urllib2和其他模块,如wget,它的优势在于性能和并发处理能力。对于大量数据抓取或高并发的场景,Pycurl的效率更高。然而,它的API相对较复杂,对于简单的HTTP请求,可能urllib2或requests等模块更为...
5. **错误处理**:处理可能出现的网络异常、请求失败等问题,如重试、记录日志或跳过。 6. **运行和监控**:启动爬虫,监控其运行状态,如爬取速度、成功与失败的请求等。 7. **结果导出**:爬取结束后,将结果...