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字符串转换成浮点数函数分享
Jul 24 Python
Python Sql数据库增删改查操作简单封装
Apr 18 Python
python使用opencv驱动摄像头的方法
Aug 03 Python
利用django+wechat-python-sdk 创建微信服务器接入的方法
Feb 20 Python
对Python 中矩阵或者数组相减的法则详解
Aug 26 Python
python SVD压缩图像的实现代码
Nov 05 Python
Python基础之函数原理与应用实例详解
Jan 03 Python
python读取yaml文件后修改写入本地实例
Apr 27 Python
python else语句在循环中的运用详解
Jul 06 Python
通过Python实现Payload分离免杀过程详解
Jul 13 Python
Python2及Python3如何实现兼容切换
Sep 01 Python
Python测试框架:pytest学习笔记
Oct 20 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
Laravel给生产环境添加监听事件(SQL日志监听)
2017/06/19 PHP
JCalendar 日历控件 v1.0 beta[兼容IE&Firefox] 有文档和例子
2007/05/30 Javascript
Prototype RegExp对象 学习
2009/07/19 Javascript
setTimeout与setInterval在不同浏览器下的差异
2010/01/24 Javascript
6个DIV 135或246间隔一秒轮番显示效果
2010/07/24 Javascript
js弹出层之1:JQuery.Boxy (二)
2011/10/06 Javascript
如何动态加载外部Javascript文件
2015/12/02 Javascript
JS数字千分位格式化实现方法总结
2016/12/16 Javascript
javascript填充默认头像方法
2018/02/22 Javascript
JS 使用 window对象的print方法实现分页打印功能
2018/05/16 Javascript
jQuery实现条件搜索查询、实时取值及升降序排序的方法分析
2019/05/04 jQuery
请求时token过期自动刷新token操作
2020/09/11 Javascript
通过实例了解Render Props回调地狱解决方案
2020/11/04 Javascript
[01:32]2016国际邀请赛中国区预选赛CDEC战队教练采访
2016/06/26 DOTA
Python迭代用法实例教程
2014/09/08 Python
深入Python函数编程的一些特性
2015/04/13 Python
python实现各进制转换的总结大全
2017/06/18 Python
python如何对实例属性进行类型检查
2018/03/20 Python
pycharm 实现显示project 选项卡的方法
2019/01/17 Python
set在python里的含义和用法
2019/06/24 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
2019/12/19 Python
win10系统下python3安装及pip换源和使用教程
2020/01/06 Python
用什么库写 Python 命令行程序(示例代码详解)
2020/02/20 Python
如何理解python面向对象编程
2020/06/01 Python
乌克兰的第一家手表店:Deka
2020/03/05 全球购物
当x.equals(y)等于true时,x.hashCode()与y.hashCode()可以不相等,这句话对不对
2015/05/02 面试题
Servlet的实例是在生命周期什么时候创建的?配置servlet最重要的是什么?
2012/05/30 面试题
出纳岗位职责范本
2013/12/01 职场文书
优秀教师先进事迹
2014/01/22 职场文书
面临毕业的毕业生自荐书范文
2014/02/05 职场文书
男女朋友协议书
2014/04/23 职场文书
2014年扫黄打非工作总结
2014/12/03 职场文书
小班下学期幼儿评语
2014/12/30 职场文书
小学端午节活动总结
2015/02/11 职场文书
2015廉洁自律个人总结
2015/02/14 职场文书
python某漫画app逆向
2021/03/31 Python