获取http响应时间,pycurl,python

2024-03-05 17:08

本文主要是介绍获取http响应时间,pycurl,python,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转载自:http://blog.sina.com.cn/s/blog_603e2b9f0102eu7e.html

获取http响应时间,pycurl,python

最近需要对节点到源站自己做个监控,简单的ping可以检测到一些东西,但是http请求的检查也要进行,于是就研究了下pycurl
pycurl是个用c语言实现的python 库,虽然据说不是那么pythonic,但是却很高效,它支持的协议居多:

supporting FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE andLDAP. libcurl supports HTTPS certificates, HTTP POST, HTTP PUT, FTPuploading, kerberos, HTTP form based upload, proxies, cookies,user+password authentication, file transfer resume, http proxytunneling and more!

这一堆协议已经很多了,我需要就是http一个,相对urlib来说,这个库可能更快些。

以下这个脚本是对某一个给定的url进行检查,并打印出http相应码,响应大小,建立连接时间,准备传输时间,传输第一个字节时间,完成时间

#!/usr/bin/python
# coding: UTF-8
import  StringIO
import  pycurl
import  sys
import  os
class  Test:
         def  __init__( self ):
                 self .contents =  ''
         def  body_callback( self ,buf):
                 self .contents =  self .contents +  buf
def  test_gzip(input_url):
         t =  Test()
         #gzip_test= file("gzip_test.txt", 'w')
         c =  pycurl.Curl()
         c.setopt(pycurl.WRITEFUNCTION,t.body_callback)
         c.setopt(pycurl.ENCODING, 'gzip' )
         c.setopt(pycurl.URL,input_url)
         c.perform()
         http_code =  c.getinfo(pycurl.HTTP_CODE)
         http_conn_time =    c.getinfo(pycurl.CONNECT_TIME)
         http_pre_tran =    c.getinfo(pycurl.PRETRANSFER_TIME)
         http_start_tran =    c.getinfo(pycurl.STARTTRANSFER_TIME)
         http_total_time =  c.getinfo(pycurl.TOTAL_TIME)
         http_size =  c.getinfo(pycurl.SIZE_DOWNLOAD)
         print  'http_codehttp_size conn_time pre_tran start_tran total_time'
         print  "%d%d %f %f %f %f" % (http_code,http_size,http_conn_time,http_pre_tran,http_start_tran,http_total_time)
if  __name__ = =  '__main__' :
         input_url =  sys.argv[ 1 ]
         test_gzip(input_url)


脚本运行效果

xu:~ /curl $python pycurl_test.py http: //daxuxu .info/
http_code http_size conn_time pre_tran start_trantotal_time
200 8703 0.748147 0.748170 1.632642 1.636552

pycurl 的一些响应信息:
(参考: http://curl.haxx.se/libcurl/c/curl_easy_getinfo.html )

pycurl.NAMELOOKUP_TIME 域名解析时间
pycurl.CONNECT_TIME 远程服务器连接时间
pycurl.PRETRANSFER_TIME 连接上后到开始传输时的时间
pycurl.STARTTRANSFER_TIME 接收到第一个字节的时间
pycurl.TOTAL_TIME 上一请求总的时间
pycurl.REDIRECT_TIME 如果存在转向的话,花费的时间

pycurl.EFFECTIVE_URL
pycurl.HTTP_CODE HTTP 响应代码
pycurl.REDIRECT_COUNT 重定向的次数
pycurl.SIZE_UPLOAD 上传的数据大小
pycurl.SIZE_DOWNLOAD 下载的数据大小
pycurl.SPEED_UPLOAD 上传速度
pycurl.HEADER_SIZE 头部大小
pycurl.REQUEST_SIZE 请求大小
pycurl.CONTENT_LENGTH_DOWNLOAD 下载内容长度
pycurl.CONTENT_LENGTH_UPLOAD 上传内容长度
pycurl.CONTENT_TYPE 内容的类型
pycurl.RESPONSE_CODE 响应代码
pycurl.SPEED_DOWNLOAD 下载速度
pycurl.SSL_VERIFYRESULT
pycurl.INFO_FILETIME 文件的时间信息

pycurl.HTTP_CONNECTCODE HTTP 连接代码
pycurl.HTTPAUTH_AVAIL
pycurl.PROXYAUTH_AVAIL
pycurl.OS_ERRNO
pycurl.NUM_CONNECTS
pycurl.SSL_ENGINES
pycurl.INFO_COOKIELIST
pycurl.LASTSOCKET
pycurl.FTP_ENTRY_PATH

 

########################################################

http://icyleaf.com/2012/08/url-request-time-test-using-python-with-argparse

前几天看完《Python简明教程》,预想练手,想起同事的一个ruby 代码,尝试改写成 python,顺便看看两个语言的简练程度。下面是原始的 ruby 代码:

 123456789
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/env rubyrequire 'rubygems'
require 'net/http'urls = ["http://icyleaf.com"]
50.times dourls.each do |url|start_at = Time.nowNet::HTTP.get URI.parse(url)end_at = Time.nowdiff = end_at - start_atif diff <</span> 0.3 thencolor_code = 32elsif diff > 0.8 thencolor_code = 31elsecolor_code = 33endputs "#{url}\n time: \033[#{color_code}m#{diff}\033[0m seconds"end
end

改写 python的同时,考虑脚本的灵活性准备增加两个参数,第一个是请求测试次数,第二个是请求测试的 URL,而 python默认提供了argparse 库,可以很方便的生成--help 的帮助和解析传递的参数:

 123456789
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/usr/bin/env pythonimport urllib2
import time
import sys
import argparsedef benchmark(url, count):for i in range(count):s = time.time()r = urllib2.urlopen(urllib2.Request(url))e = time.time()diff = e - sif diff <</span> 0.3:color_code = 32elif diff > 0.8:color_code = 31else:color_code = 33print '# %d' % (i + 1)print '\tStauts: %s' % r.getcode()print '\tTime: \033[%dm%f\033[0m second(s)' % (color_code, diff)def main(argv):parser = argparse.ArgumentParser(description='url request time test')parser.add_argument('URL', help='request url')parser.add_argument('-t', '--time', action='store', dest='count', type=int, default=10, help='request times')args = parser.parse_args(argv)benchmark(args.URL, args.count)if __name__ == '__main__':main(sys.argv[1:])

当然,我主要是为了练手 python才去写的,ruby 本身也有 optparse 库用于解析参数,但是需要自己手写生成--help 的输出,而且需要对每个参数做相应的 callback。

效果如下:

screenshot

Posted by icyleaf on 2012-08-02

 

 

#########################################################

 

http://blog.raphaelzhang.com/2012/03/issues-in-python-crawler/

用Python抓网页的注意事项

3条回复

用Python编一个抓网页的程序是非常快的,下面就是一个例子:

 

1
2
3
import urllib2
html = urllib2 . urlopen ( 'http://blog.raphaelzhang.com' ) . read ( )

 

但是在实际工作中,这种写法是远远不够的,至少会遇到下面几个问题:

  • 网络会出错,任何错误都可能。例如机器宕了,网线断了,域名出错了,网络超时了,页面没有了,网站跳转了,服务被禁了,主机负载不够了…
  • 服务器加上了限制,只让常见浏览器访问
  • 服务器加上了防盗链的限制
  • 某些2B网站不管你HTTP请求里有没有Accept-Encoding头部,也不管你头部具体内容是什么,反正总给你发gzip后的内容
  • URL链接千奇百怪,带汉字的也罢了,有的甚至还有回车换行
  • 某些网站HTTP头部里有一个Content-Type,网页里有好几个Content-Type,更过分的是,各个Content-Type还不一样,最过分的是,这些Content-Type可能都不是正文里使用的Content-Type,从而导致乱码
  • 网络链接很慢,乘分析几千个页面的时间,建议你可以好好吃顿饭去了
  • Python本身的接口有点糙

好吧,这么一大箩筐问题,我们来一个个搞定。

错误处理和服务器限制

首先是错误处理。由于urlopen本身将大部分错误,甚至包括4XX和5XX的HTTP响应,也搞成了异常,因此我们只需要捕捉异常就好了。同时,我们也可以获取urlopen返回的响应对象,读取它的HTTP状态码。除此之外,我们在urlopen的时候,也需要设置timeout参数,以保证处理好超时。下面是代码示例:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import urllib2
import socket
try :
   f = urllib2 . urlopen ( 'http://blog.raphaelzhang.com' , timeout = 10 )
   code = f . getcode ( )
   if code <</span>200orcode>=300:
     #你自己的HTTP错误处理
except Exception , e :
   if isinstance ( e , urllib2 . HTTPError ) :
     print 'http error:{0}' . format ( e . code )
   elif isinstance ( e , urllib2 . URLError ) and isinstance ( e . reason , socket . timeout ) :
     print 'url error: sockettimeout {0}' . format ( e . __str__ ( ) )
   else :
     print 'misc error:' + e . __str__ ( )

 

如果是服务器的限制,一般来说我们都可以通过查看真实浏览器的请求来设置对应的HTTP头部,例如针对浏览器的限制我们可以设置User-Agent头部,针对防盗链限制,我们可以设置Referer头部,下面是示例代码:

 

1
2
3
4
5
6
7
import urllib2
req = urllib2 . Request ( 'http://blog.raphaelzhang.com' ,
   headers = { "Referer" : "http://www.baidu.com" ,
     "User-Agent" : "Mozilla/5.0 (WindowsNT 5.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.68Safari/534.24"
} )
html = urllib2 . urlopen ( url = req , timeout = 10 ) . read ( )

 

有的网站用了Cookie来限制,主要是涉及到登录和限流,这时候没有什么通用的方法,只能看能否做自动登录或者分析Cookie的问题了。

URL与内容处理

URL里奇形怪状的格式只能个别分析,个别处理,逮到一个算一个。例如针对URL里可能有汉字,相对路径,以及回车换行之类的问题,我们可以先用urlparse模块的urljoin函数处理相对路径的问题,然后去掉乱七八糟的回车换行之类的玩意,最后用urllib2的quote函数处理特殊字符编码和转义的问题,生成真正的URL。

当然,在使用的过程中你会发现Python的urljoin和urlopen都有些问题,因此具体的代码我们在后面再给。

对于那些不管三七二十一就把gzip内容丢过来的,我们直接分析它的内容格式,不要管HTTP头部就好了。代码是这样的:

 

1
2
3
4
5
6
import urllib2
import gzip , cStringIO
html = urllib2 . urlopen ( 'http://blog.raphaelzhang.com' ) . read ( )
if html [ : 6 ] == '\x1f\x8b\x08\x00\x00\x00' :
   html = gzip . GzipFile ( fileobj = cStringIO . StringIO ( html ) ) . read ( )


添加 requests模块自带响应时间函数import requests r = requests.get("http://bitest.hylinkad.com")print r.elapsed.microsecondsmicroseconds,seconds,total_secondselapsed是datetime.timedelta类型。total_seconds=seconds+microsecondstotal_seconds是整个请求耗费的时间。seconds是请求耗费时间的秒数,microseconds是微妙数。

这篇关于获取http响应时间,pycurl,python的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/777211

相关文章

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

Python正则表达式匹配和替换的操作指南

《Python正则表达式匹配和替换的操作指南》正则表达式是处理文本的强大工具,Python通过re模块提供了完整的正则表达式功能,本文将通过代码示例详细介绍Python中的正则匹配和替换操作,需要的朋... 目录基础语法导入re模块基本元字符常用匹配方法1. re.match() - 从字符串开头匹配2.

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4

Nginx部署HTTP/3的实现步骤

《Nginx部署HTTP/3的实现步骤》本文介绍了在Nginx中部署HTTP/3的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前提条件第一步:安装必要的依赖库第二步:获取并构建 BoringSSL第三步:获取 Nginx

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结