Python实现批量检测HTTP服务的状态


Posted in Python onOctober 27, 2016

用Python实现批量测试一组url的可用性(可以包括HTTP状态、响应时间等)并统计出现不可用情况的次数和频率等。

类似的,这样的脚本可以判断某个服务的可用性,以及在众多的服务提供者中选择最优的。

需求以及脚本实现的功能如下:

  1. 默认情况下,执行脚本会检测一组url的可用性。
  2. 如果可用,返回从脚本所在的机器到HTTP服务器所消耗的时间和内容等信息。
  3. 如果url不可用,则记录并提示用户,并显示不可用发生的时间。
  4. 默认情况下,允许最大的错误次数是200,数目可以自定义,如果达到允许的最大错误次数,则在输出信息的最后,根据每一个url做出错误统计。
  5. 如果用户手动停止脚本,则需要在输出信息的最后,根据每一个url做出错误统计。

脚本中涉及的一些技巧:

  1. 使用gevent并发处理多个HTTP请求,多个请求之间无须等待响应(gevent还有很多使用技巧,可再自行学习);
  2. 使用signal模块捕获信号,如果捕获到则处理并退出,避免主进程接收到KeyboardInterrupt直接退出但无法处理的问题;
  3. 注意留意脚本中关于统计次数方面的小技巧;

脚本运行效果图( 如果图片看不清楚,请选择“在新标签页中打开图片” )如下:

Python实现批量检测HTTP服务的状态

脚本如下:

#!/usr/bin/python
# encoding: utf-8
# -*- coding: utf8 -*-
"""
Created by PyCharm.
File:    LinuxBashShellScriptForOps:testNoHttpResponseException,testHttpHostAvailability.py
User:    Guodong
Create Date:  2016/10/26
Create Time:  12:09

Function:
 test Http Host Availability

Some helpful message:
 For CentOS: yum -y install python-devel python-pip; pip install gevent
 For Ubuntu: apt-get -y install python-dev python-pip; pip install gevent
 For Windows: pip install gevent
 """
import signal
import time
import sys
# execute some operations concurrently using python
from gevent import monkey

monkey.patch_all()
import gevent
import urllib2

hosts = ['https://webpush.wx2.qq.com/cgi-bin/mmwebwx-bin/synccheck',
   'https://webpush.wx.qq.com/cgi-bin/mmwebwx-bin/synccheck', ]

errorStopCounts = 200

quit_flag = False
statistics = dict()


def changeQuit_flag(signum, frame):
 del signum, frame
 global quit_flag
 quit_flag = True
 print "Canceled task on their own by the user."


def testNoHttpResponseException(url):
 tryFlag = True
 global quit_flag
 errorCounts = 0
 tryCounts = 0
 global statistics
 globalStartTime = time.time()
 while tryFlag:
  if not quit_flag:
   tryCounts += 1
   print('GET: %s' % url)
   try:
    startTime = time.time()
    resp = urllib2.urlopen(url) # using module 'request' will be better, request will return header info..
    endTime = time.time()
    data = resp.read()
    responseTime = endTime - startTime
    print '%d bytes received from %s. response time is: %s' % (len(data), url, responseTime)
    print "data received from %s at %d try is: %s" % (url, tryCounts, data)
    gevent.sleep(2)
   except urllib2.HTTPError as e:
    errorCounts += 1
    statistics[url] = errorCounts
    currentTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
    print "HTTPError occurred, %s, and this is %d times(total) occurs on %s at %s." % (
     e, statistics[url], url, currentTime)

    if errorCounts >= errorStopCounts:
     globalEndTime = time.time()
     tryFlag = False
  else:
   globalEndTime = time.time()
   break

 for url in statistics:
  print "Total error counts is %d on %s" % (statistics[url], url)
  hosts.remove(url)
 for url in hosts:
  print "Total error counts is 0 on %s" % url
 globalUsedTime = globalEndTime - globalStartTime
 print "Total time use is %s" % globalUsedTime
 sys.exit(0)


try:
 # Even if the user cancelled the task,
 # it also can statistics the number of errors and the consumption of time for each host.
 signal.signal(signal.SIGINT, changeQuit_flag)

 gevent.joinall([gevent.spawn(testNoHttpResponseException, host) for host in hosts])
except KeyboardInterrupt:
 # Note: this line can NOT be reached, because signal has been captured!
 print "Canceled task on their own by the user."
 sys.exit(0)
Python 相关文章推荐
python实现读取命令行参数的方法
May 22 Python
Windows上使用virtualenv搭建Python+Flask开发环境
Jun 07 Python
使用Python实现微信提醒备忘录功能
Dec 04 Python
python networkx 包绘制复杂网络关系图的实现
Jul 10 Python
python实现从本地摄像头和网络摄像头截取图片功能
Jul 11 Python
利用python实现冒泡排序算法实例代码
Dec 01 Python
python 和c++实现旋转矩阵到欧拉角的变换方式
Dec 04 Python
IronPython连接MySQL的方法步骤
Dec 27 Python
Django添加bootstrap框架时无法加载静态文件的解决方式
Mar 27 Python
详解用Python调用百度地图正/逆地理编码API
Jul 02 Python
python实现图像外边界跟踪操作
Jul 13 Python
图解Python中深浅copy(通俗易懂)
Sep 03 Python
python解决网站的反爬虫策略总结
Oct 26 #Python
Python控制多进程与多线程并发数总结
Oct 26 #Python
Python网络爬虫项目:内容提取器的定义
Oct 25 #Python
Python实现ssh批量登录并执行命令
Oct 25 #Python
详解Python的Lambda函数与排序
Oct 25 #Python
Python脚本实现Web漏洞扫描工具
Oct 25 #Python
python+django快速实现文件上传
Oct 24 #Python
You might like
FCKeditor的安装(PHP)
2007/01/13 PHP
php下防止单引号,双引号在接受页面转义的设置方法
2008/09/25 PHP
PHP 加密与解密的斗争
2009/04/17 PHP
PHP中实现crontab代码分享
2015/03/26 PHP
Linux(CentOS)下PHP扩展PDO编译安装的方法
2016/04/07 PHP
PHP异步进程助手async-helper
2018/02/05 PHP
PHP中常见的密码处理方式和建议总结
2018/10/14 PHP
javascript的原生方法获取数组中的最大(最小)值
2012/12/19 Javascript
Javascript变量作用域详解
2013/12/06 Javascript
JS运动基础框架实例分析
2015/03/03 Javascript
AngularJS 日期格式化详解
2015/12/23 Javascript
jQuery实现网页顶部固定导航效果代码
2015/12/24 Javascript
jQuery实现百叶窗焦点图动画效果代码分享(附源码下载)
2016/03/14 Javascript
ionic实现下拉刷新载入数据功能
2017/05/11 Javascript
KOA+egg.js集成kafka消息队列的示例
2018/11/09 Javascript
jQuery利用FormData上传文件实现批量上传
2018/12/04 jQuery
解决vscode进行vue格式化,会自动补分号和双引号的问题
2020/10/26 Javascript
vue实现防抖的实例代码
2021/01/11 Vue.js
Python re模块介绍
2014/11/30 Python
在mac下查找python包存放路径site-packages的实现方法
2018/11/06 Python
python DataFrame 取差集实例
2019/01/30 Python
python创建n行m列数组示例
2019/12/02 Python
关于Theano和Tensorflow多GPU使用问题
2020/06/19 Python
如何将Pycharm中调整字体大小的方式设置为"ctrl+鼠标滚轮上下滑"
2020/11/17 Python
华为旗下电子商务平台:华为商城
2016/08/06 全球购物
俄罗斯大型在线书店:Читай-город
2019/10/10 全球购物
给校长的建议书100字
2014/05/16 职场文书
个人委托书范本
2014/09/13 职场文书
2014年食品安全工作总结
2014/12/04 职场文书
结婚保证书
2015/01/16 职场文书
关于感谢信的范文
2015/01/23 职场文书
离婚答辩状怎么写
2015/05/22 职场文书
JS不要再到处使用绝对等于运算符了
2021/04/30 Javascript
python批量创建变量并赋值操作
2021/06/03 Python
MySQL实现配置主从复制项目实践
2022/03/31 MySQL
小程序实现侧滑删除功能
2022/06/25 Javascript