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中的filter()函数的用法
Apr 27 Python
Python中datetime常用时间处理方法
Jun 15 Python
python根据日期返回星期几的方法
Jul 06 Python
Djang中静态文件配置方法
Jul 30 Python
利用Tkinter和matplotlib两种方式画饼状图的实例
Nov 06 Python
[原创]教女朋友学Python(一)运行环境搭建
Nov 29 Python
pandas对指定列进行填充的方法
Apr 11 Python
python matlibplot绘制多条曲线图
Feb 19 Python
Python3 执行系统命令并获取实时回显功能
Jul 09 Python
python3.7 的新特性详解
Jul 25 Python
python 19个值得学习的编程技巧
Aug 15 Python
解决Pyinstaller打包软件失败的一个坑
Mar 04 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
thinkphp3.2.2实现生成多张缩略图的方法
2014/12/19 PHP
详谈PHP中的密码安全性Password Hashing
2017/02/04 PHP
PHP单例模式实例分析【防继承,防克隆操作】
2019/05/22 PHP
javascript之函数直接量(function(){})()
2007/06/29 Javascript
Ajax+Json 级联菜单实现代码
2009/10/27 Javascript
JavaScript设计模式之建造者模式介绍
2014/12/28 Javascript
js编写贪吃蛇的小游戏
2020/08/24 Javascript
jQuery实现ajax无刷新分页页码控件
2017/02/28 Javascript
微信小程序实现原生步骤条
2019/07/25 Javascript
Vue表单控件数据绑定方法详解
2020/02/05 Javascript
原生微信小程序开发中 redux 的使用详解
2021/02/18 Javascript
[54:10]完美世界DOTA2联赛PWL S2 Magma vs FTD 第二场 11.29
2020/12/03 DOTA
Python读写Excel文件的实例
2013/11/01 Python
利用Python爬取可用的代理IP
2016/08/18 Python
python使用psutil模块获取系统状态
2016/08/27 Python
python利用urllib和urllib2访问http的GET/POST详解
2017/09/27 Python
Python生成数字图片代码分享
2017/10/31 Python
Python Requests模拟登录实现图书馆座位自动预约
2018/04/27 Python
Python实现去除列表中重复元素的方法小结【4种方法】
2018/04/27 Python
Python单元和文档测试实例详解
2019/04/11 Python
Ranorex通过Python将报告发送到邮箱的方法
2020/01/12 Python
解决Tensorflow 使用时cpu编译不支持警告的问题
2020/02/03 Python
Python使用os.listdir和os.walk获取文件路径
2020/05/21 Python
Pytho爬虫中Requests设置请求头Headers的方法
2020/09/22 Python
如何在Win10系统使用Python3连接Hive
2020/10/15 Python
matplotlib bar()实现百分比堆积柱状图
2021/02/24 Python
中国双语服务优势的在线购票及活动平台:247tickets
2018/10/26 全球购物
SIDESTEP荷兰:在线购买鞋子
2019/11/18 全球购物
汽车电子与维修专业大学生求职信
2013/09/28 职场文书
防邪知识进家庭活动方案
2014/08/26 职场文书
法定代表人身份证明书
2014/09/10 职场文书
四风问题个人对照检查剖析材料
2014/09/27 职场文书
2014年实习期工作总结
2014/11/27 职场文书
红色故事汇观后感
2015/06/18 职场文书
Python 解决空列表.append() 输出为None的问题
2021/05/23 Python
Python查找算法的实现 (线性、二分,分块、插值查找算法)
2022/04/24 Python