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代码调试的几种方法总结
Apr 15 Python
python修改字典内key对应值的方法
Jul 11 Python
详解K-means算法在Python中的实现
Dec 05 Python
python unittest实现api自动化测试
Apr 04 Python
windows下搭建python scrapy爬虫框架步骤
Dec 23 Python
利用python和ffmpeg 批量将其他图片转换为.yuv格式的方法
Jan 08 Python
Python数据可视化库seaborn的使用总结
Jan 15 Python
python中bytes和str类型的区别
Oct 21 Python
Python加密模块的hashlib,hmac模块使用解析
Jan 02 Python
Django接收照片储存文件的实例代码
Mar 07 Python
音频处理 windows10下python三方库librosa安装教程
Jun 20 Python
pdf论文中python画的图Type 3 fonts字体不兼容的解决方案
Apr 24 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
php REMOTE_ADDR之获取访客IP的代码
2008/04/22 PHP
PHP 错误之引号中使用变量
2009/05/04 PHP
PHP中获取内网用户MAC地址(WINDOWS/linux)的实现代码
2011/08/11 PHP
PHP实现自动对图片进行滚动显示的方法
2015/03/12 PHP
PHP中addslashes与mysql_escape_string的区别分析
2016/04/25 PHP
PHP正则匹配到2个字符串之间的内容方法
2018/12/24 PHP
类似框架的js代码
2006/11/09 Javascript
学习从实践开始之jQuery插件开发 菜单插件开发
2012/05/03 Javascript
jQuery实现用方向键控制层的上下左右移动
2013/01/13 Javascript
如何获取select下拉框的值(option没有及有value属性)
2013/11/08 Javascript
JavaScript 封装一个tab效果源码分享
2015/09/15 Javascript
js时间戳转为日期格式的方法
2015/12/28 Javascript
react.js 获取真实的DOM节点实例(必看)
2017/04/17 Javascript
zTree节点文字过多的处理方法
2017/11/24 Javascript
ng-alain表单使用方式详解
2018/07/10 Javascript
详解Angular5/Angular6项目如何添加热更新(HMR)功能
2018/10/10 Javascript
angular 服务的单例模式(依赖注入模式下)详解
2018/10/22 Javascript
详解ES6 系列之异步处理实战
2018/10/26 Javascript
详解vue2.6插槽更新v-slot用法总结
2019/03/09 Javascript
每周一练 之 数据结构与算法(Stack)
2019/04/16 Javascript
JS实现简单贪吃蛇小游戏
2020/10/28 Javascript
python使用正则搜索字符串或文件中的浮点数代码实例
2014/07/11 Python
python爬虫 正则表达式使用技巧及爬取个人博客的实例讲解
2017/10/20 Python
Random 在 Python 中的使用方法
2018/08/09 Python
python爬虫基础教程:requests库(二)代码实例
2019/04/09 Python
Python pandas用法最全整理
2019/08/04 Python
运动会解说词50字
2014/01/18 职场文书
“学雷锋活动月”总结
2014/03/09 职场文书
本科毕业生求职自荐信
2014/04/09 职场文书
家长会学生演讲稿
2014/04/26 职场文书
学校运动会广播稿
2014/10/11 职场文书
党风廉政建设心得体会(2016最新版)
2016/01/22 职场文书
使用Selenium实现微博爬虫(预登录、展开全文、翻页)
2021/04/13 Python
css3实现背景图片颜色修改的多种方式
2021/04/13 HTML / CSS
MySQL 可扩展设计的基本原则
2021/05/14 MySQL
开发微信小程序之WXSS样式教程
2022/04/18 HTML / CSS