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根据路径导入模块的方法
Sep 30 Python
Python Requests安装与简单运用
Apr 07 Python
python实现xlsx文件分析详解
Jan 02 Python
基于MTCNN/TensorFlow实现人脸检测
May 24 Python
python实现将读入的多维list转为一维list的方法
Jun 28 Python
Python 16进制与中文相互转换的实现方法
Jul 09 Python
使用Python编写Prometheus监控的方法
Oct 15 Python
python如何实现视频转代码视频
Jun 17 Python
学python安装的软件总结
Oct 12 Python
python 中Arduino串口传输数据到电脑并保存至excel表格
Oct 14 Python
Keras中的两种模型:Sequential和Model用法
Jun 27 Python
七个Python必备的GUI库
Apr 27 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
使用PHPMyAdmin修复论坛数据库的图文方法
2012/01/09 PHP
PHP中fwrite与file_put_contents性能测试代码
2013/08/02 PHP
yii操作cookie实例简介
2014/07/09 PHP
php基于SQLite实现的分页功能示例
2017/06/21 PHP
PHP定义字符串的四种方式详解
2018/02/06 PHP
PHPExcel 修改已存在Excel的方法
2018/05/03 PHP
浅谈laravel框架与thinkPHP框架的区别
2019/10/23 PHP
extjs3 combobox取value和text案例详解
2013/02/06 Javascript
js使用递归解析xml
2014/12/12 Javascript
谈谈JavaScript异步函数发展历程
2015/09/29 Javascript
详解JavaScript的回调函数
2015/11/20 Javascript
JS实现鼠标框选效果完整实例
2016/06/20 Javascript
基于JavaScript实现轮播图原理及示例
2020/04/10 Javascript
浅析Node.js非对称加密方法
2018/01/29 Javascript
解决vue v-for 遍历循环时key值报错的问题
2018/09/06 Javascript
koa2使用ejs和nunjucks作为模板引擎的使用
2018/11/27 Javascript
原生JS实现的自动轮播图功能详解
2018/12/28 Javascript
微信小程序接入腾讯云验证码的方法步骤
2020/01/07 Javascript
Vue向后台传数组数据,springboot接收vue传的数组数据实例
2020/11/12 Javascript
浅析python协程相关概念
2018/01/20 Python
从0开始的Python学习014面向对象编程(推荐)
2019/04/02 Python
pyqt 实现为长内容添加滑轮 scrollArea
2019/06/19 Python
python在不同条件下的输入与输出
2020/02/13 Python
Python3如何在Windows和Linux上打包
2020/02/25 Python
Python小白学习爬虫常用请求报头
2020/06/03 Python
html5 外链式实现加减乘除的代码
2019/09/04 HTML / CSS
台湾流行服饰购物平台:OB严选
2018/01/21 全球购物
印尼网上商店:Alfacart.com
2019/03/11 全球购物
Zatchels官网:英国剑桥包品牌
2021/01/12 全球购物
党员违纪检讨书
2014/02/18 职场文书
个人贷款担保书
2014/04/01 职场文书
刊首寄语大全
2014/04/11 职场文书
《永远的白衣战士》教学反思
2014/04/25 职场文书
NodeJs使用webpack打包项目的方法详解
2022/02/28 NodeJs
nginx搭建NFS网络文件系统
2022/04/14 Servers
Nginx配置之禁止指定IP访问
2022/05/02 Servers