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 相关文章推荐
rhythmbox中文名乱码问题解决方法
Sep 06 Python
详解Python中for循环的使用方法
May 14 Python
Python SqlAlchemy动态添加数据表字段实例解析
Feb 07 Python
pytorch + visdom CNN处理自建图片数据集的方法
Jun 04 Python
win7+Python3.5下scrapy的安装方法
Jul 31 Python
Python小工具之消耗系统指定大小内存的方法
Dec 03 Python
对python中不同模块(函数、类、变量)的调用详解
Jul 16 Python
Python Socketserver实现FTP文件上传下载代码实例
Mar 27 Python
python logging.info在终端没输出的解决
May 12 Python
Python实现Canny及Hough算法代码实例解析
Aug 06 Python
python中opencv实现图片文本倾斜校正
Jun 11 Python
python自动化八大定位元素讲解
Jul 09 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 第二节 数据类型之转换
2012/04/28 PHP
Laravel 4 初级教程之安装及入门
2014/10/30 PHP
php实现用于删除整个目录的递归函数
2015/03/16 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
javascript 动态数据下的锚点错位问题解决方法
2008/12/24 Javascript
js下判断 iframe 是否加载完成的完美方法
2010/10/26 Javascript
Javascript 面试题随笔
2011/03/31 Javascript
JQuery 在线引用及测试引用是否成功
2014/06/24 Javascript
JS实现单击输入框弹出选择框效果完整实例
2015/12/14 Javascript
Node.js程序中的本地文件操作用法小结
2016/03/06 Javascript
js实现表单提交后不重新刷新当前页面
2016/11/30 Javascript
简单好用的nodejs 爬虫框架分享
2017/03/26 NodeJs
ES6中Math对象新增的方法实例详解
2017/04/25 Javascript
jquery操作ul的一些操作笔记整理(干货)
2017/08/31 jQuery
JavaScript寄生组合式继承原理与用法分析
2019/01/11 Javascript
Vuejs学习笔记之使用指令v-model完成表单的数据双向绑定
2019/04/29 Javascript
微信小程序实现日期格式化和倒计时
2020/11/01 Javascript
layui use 定义js外部引用函数的方法
2019/09/26 Javascript
[52:06]完美世界DOTA2联赛决赛日 Inki vs LBZS 第一场 11.08
2020/11/10 DOTA
Python多线程编程(五):死锁的形成
2015/04/05 Python
深入理解Python 关于supper 的 用法和原理
2018/02/28 Python
python3中获取文件当前绝对路径的两种方法
2018/04/26 Python
Python unittest基本使用方法代码实例
2020/06/29 Python
python给视频添加背景音乐并改变音量的具体方法
2020/07/19 Python
基于css3实现漂亮便签样式
2013/03/18 HTML / CSS
会计专业个人求职信范文
2014/01/08 职场文书
《太阳》教学反思
2014/02/21 职场文书
大学生励志演讲稿
2014/04/25 职场文书
2014年乡镇安全生产工作总结
2014/12/02 职场文书
2015年幼儿园后勤工作总结
2015/04/25 职场文书
2015年初一班主任工作总结
2015/05/13 职场文书
信用卡催款律师函
2015/05/27 职场文书
保护地球的宣传语
2015/07/13 职场文书
董事长开业致辞
2015/07/29 职场文书
MySQL复制问题的三个参数分析
2021/04/07 MySQL
Python实现生活常识解答机器人
2021/06/28 Python