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探索之静态方法和类方法的区别详解
Oct 27 Python
python日期时间转为字符串或者格式化输出的实例
May 29 Python
深入了解Python iter() 方法的用法
Jul 11 Python
Django框架视图函数设计示例
Jul 29 Python
python连接mongodb集群方法详解
Feb 13 Python
django admin 添加自定义链接方式
Mar 11 Python
Keras官方中文文档:性能评估Metrices详解
Jun 15 Python
python中wheel的用法整理
Jun 15 Python
从零开始的TensorFlow+VScode开发环境搭建的步骤(图文)
Aug 31 Python
有关pycharm登录github时有的时候会报错connection reset的问题
Sep 15 Python
Python私有属性私有方法应用实例解析
Sep 15 Python
详解用Python把PDF转为Word方法总结
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
全国FM电台频率大全 - 1 北京市
2020/03/11 无线电
一个PHP的QRcode类与大家分享
2011/11/13 PHP
php版微信数据统计接口用法示例
2016/10/12 PHP
添加JavaScript重载函数的辅助方法2
2010/07/04 Javascript
jQuery Ajax 实例全解析
2011/04/20 Javascript
javascript中为某个元素指定事件的三种方式
2014/08/07 Javascript
JavaScript实现控制打开文件另存为对话框的方法
2015/04/17 Javascript
基于javascript实现动态显示当前系统时间
2016/01/28 Javascript
微信js-sdk界面操作接口用法示例
2016/10/12 Javascript
浅谈js中的this问题
2017/08/31 Javascript
Node.js中DNS模块学习总结
2018/02/28 Javascript
微信小程序实现自上而下字幕滚动
2018/07/14 Javascript
Vue动态生成el-checkbox点击无法赋值的解决方法
2019/02/21 Javascript
每天学点Vue源码之vm.$mount挂载函数
2019/03/11 Javascript
NestJs 静态目录配置详解
2019/03/12 Javascript
vue-cli3跨域配置的简单方法
2019/09/06 Javascript
[03:00]DOTA2-DPC中国联赛1月18日Recap集锦
2021/03/11 DOTA
python encode和decode的妙用
2009/09/02 Python
Python转换HTML到Text纯文本的方法
2015/01/15 Python
python连接远程ftp服务器并列出目录下文件的方法
2015/04/01 Python
python使用mysql数据库示例代码
2017/05/21 Python
Numpy对数组的操作:创建、变形(升降维等)、计算、取值、复制、分割、合并
2019/08/28 Python
CSS3 Notes: -webkit-box-reflect实现倒影的实例
2016/12/08 HTML / CSS
中国最大的名表商城:万表网
2016/08/29 全球购物
美国户外服装和装备购物网站:Outland USA
2020/03/22 全球购物
关于护士节的演讲稿
2014/05/26 职场文书
禁止高声喧哗的标语
2014/06/11 职场文书
学习雷锋标语
2014/06/25 职场文书
大学班长竞选稿
2015/11/20 职场文书
三好学生竞选稿
2015/11/21 职场文书
汉语拼音教学反思
2016/02/22 职场文书
python使用XPath解析数据爬取起点小说网数据
2021/04/22 Python
Django模型层实现多表关系创建和多表操作
2021/07/21 Python
Mysql中where与on的区别及何时使用详析
2021/08/04 MySQL
解决Redis启动警告问题
2022/02/24 Redis
golang操作redis的客户端包有多个比如redigo、go-redis
2022/04/14 Golang