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 28 Python
Python利用Nagios增加微信报警通知的功能
Feb 18 Python
python里使用正则的findall函数的实例详解
Oct 19 Python
mac系统安装Python3初体验
Jan 02 Python
详谈套接字中SO_REUSEPORT和SO_REUSEADDR的区别
Apr 28 Python
Python动态生成多维数组的方法示例
Aug 09 Python
Python3实现统计单词表中每个字母出现频率的方法示例
Jan 28 Python
Python3爬楼梯算法示例
Mar 04 Python
如何使用python爬虫爬取要登陆的网站
Jul 12 Python
python 字典 setdefault()和get()方法比较详解
Aug 07 Python
关于pycharm中pip版本10.0无法使用的解决办法
Oct 10 Python
如何使用repr调试python程序
Feb 28 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实例
2013/12/24 PHP
ThinkPHP之getField详解
2014/06/20 PHP
php计算给定日期所在周的开始日期和结束日期示例
2017/02/06 PHP
PHP编程实现的TCP服务端和客户端功能示例
2018/04/13 PHP
HTML 自动伸缩的表格Table js实现
2009/04/01 Javascript
IE FF OPERA都可用的弹出层实现代码
2009/09/29 Javascript
jquery $.getJSON()跨域请求
2011/12/21 Javascript
图片动画横条广告带上下滚动可自定义图片、链接等等
2013/10/20 Javascript
判断字符串的长度(优化版)中文占两个字符
2014/10/30 Javascript
基于Bootstrap的后台管理面板 Bootstrap Metro Dashboard
2016/06/17 Javascript
原生和jQuery的ajax用法详解
2017/01/23 Javascript
简易Vue评论框架的实现(父组件的实现)
2018/01/08 Javascript
webpack css加载和图片加载的方法示例
2018/09/11 Javascript
Vue响应式原理Observer、Dep、Watcher理解
2019/06/06 Javascript
Vue动态修改网页标题的方法及遇到问题
2019/06/09 Javascript
Vue 2.0 中依赖注入 provide/inject组合实战
2019/06/20 Javascript
jQuery-Citys省市区三级菜单联动插件使用详解
2019/07/26 jQuery
微信小程序使用npm包的方法步骤
2019/08/13 Javascript
vue中获取滚动table的可视页面宽度调整表头与列对齐(每列宽度不都相同)
2019/08/17 Javascript
详解在Vue.js编写更好的v-for循环的6种技巧
2020/04/14 Javascript
Python Mysql数据库操作 Perl操作Mysql数据库
2009/01/12 Python
Python中unittest模块做UT(单元测试)使用实例
2015/06/12 Python
深入浅析python继承问题
2016/05/29 Python
python ---lambda匿名函数介绍
2019/03/13 Python
Python实现邮件发送的详细设置方法(遇到问题)
2021/01/18 Python
使用canvas生成含有微信头像的邀请海报没有微信头像问题
2019/10/29 HTML / CSS
巴西最大的在线约会网站:ParPerfeito
2018/07/11 全球购物
法国在线购买汽车轮胎网站:123pneus.fr
2019/02/25 全球购物
临床医学应届生求职信
2013/11/06 职场文书
大学生职业规划前言模板
2013/12/27 职场文书
中学家长会邀请函
2014/01/17 职场文书
供用电专业求职信
2014/07/07 职场文书
我是特种兵观后感
2015/06/11 职场文书
2015年法律事务部工作总结
2015/07/27 职场文书
最新最全的手机号验证正则表达式
2022/02/24 Javascript
解决IDEA翻译插件Translation报错更新TTK失败不能使用
2022/04/24 Python