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使用Flask框架获取用户IP地址的方法
Mar 21 Python
Python编程中归并排序算法的实现步骤详解
May 04 Python
浅析Python中的for 循环
Jun 09 Python
详解Python中的array数组模块相关使用
Jul 05 Python
答题辅助python代码实现
Jan 16 Python
利用Python将每日一句定时推送至微信的实现方法
Aug 13 Python
深入浅析Python获取对象信息的函数type()、isinstance()、dir()
Sep 17 Python
Python 微信爬虫完整实例【单线程与多线程】
Jul 06 Python
Django MEDIA的配置及用法详解
Jul 25 Python
python如何保存文本文件
Jun 07 Python
浅谈cv2.imread()和keras.preprocessing中的image.load_img()区别
Jun 12 Python
selenium携带cookies模拟登陆CSDN的实现
Jan 19 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的拦截器实例分析
2014/11/03 PHP
PHP正则+Snoopy抓取框架实现的抓取淘宝店信誉功能实例
2017/05/17 PHP
IE6图片加载的一个BUG解决方法
2010/07/13 Javascript
js异常捕获方法介绍
2013/04/10 Javascript
jquery live()调用不存在的解决方法
2014/02/26 Javascript
Angularjs 实现动态添加控件功能
2017/05/25 Javascript
微信小程序6位或多位验证码密码输入框功能的实现代码
2018/05/29 Javascript
使用JavaScript保存文本文件到本地的两种方法
2019/01/22 Javascript
自定义Vue中的v-module双向绑定的实现
2019/04/17 Javascript
vue项目前端知识点整理【收藏】
2019/05/13 Javascript
使用Python生成url短链接的方法
2015/05/04 Python
Python中使用装饰器来优化尾递归的示例
2016/06/18 Python
Python中类型检查的详细介绍
2017/02/13 Python
Python使用pylab库实现画线功能的方法详解
2017/06/08 Python
python 获取文件下所有文件或目录os.walk()的实例
2018/04/23 Python
Python之循环结构
2019/01/15 Python
Python实现KNN(K-近邻)算法的示例代码
2019/03/05 Python
Python PyQt5整理介绍
2020/04/01 Python
Python中如何添加自定义模块
2020/06/09 Python
Python scrapy爬取小说代码案例详解
2020/07/09 Python
HTML5之SVG 2D入门2—图形绘制(基本形状)介绍及使用
2013/01/30 HTML / CSS
Cotton On美国网站:澳洲时装连锁品牌
2016/10/25 全球购物
怎样在 Applet 中建立自己的菜单(MenuBar/Menu)?
2012/06/20 面试题
本科生详细的自我评价
2013/09/19 职场文书
大学生毕业的自我鉴定
2013/11/13 职场文书
采购员的工作职责
2013/12/26 职场文书
医药个人求职信范文
2014/01/29 职场文书
2014财产信托协议书范本
2014/11/18 职场文书
一年级数学下册复习计划
2015/01/17 职场文书
司机岗位职责范本
2015/04/10 职场文书
上市公司董事长岗位职责
2015/04/16 职场文书
仙境之桥观后感
2015/06/16 职场文书
学生会部长竞选稿
2015/11/19 职场文书
2020年基层司法所建设情况调研报告
2019/11/30 职场文书
JS实现简单九宫格抽奖
2022/06/28 Javascript
python playwright之元素定位示例详解
2022/07/23 Python