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 包含汉字的文件读写之每行末尾加上特定字符
Dec 12 Python
python生成tensorflow输入输出的图像格式的方法
Feb 12 Python
Python GUI布局尺寸适配方法
Oct 11 Python
python3在同一行内输入n个数并用列表保存的例子
Jul 20 Python
python使用PIL剪切和拼接图片
Mar 23 Python
Python判断三段线能否构成三角形的代码
Apr 12 Python
Selenium元素定位的30种方式(史上最全)
May 11 Python
python实点云分割k-means(sklearn)详解
May 28 Python
Python使用OpenPyXL处理Excel表格
Jul 02 Python
python如何进入交互模式
Jul 06 Python
Python实现一个优先级队列的方法
Jul 31 Python
python定时截屏实现
Nov 02 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
PHPExcel笔记, mpdf导出
2016/05/03 PHP
PHP线程的内存回收问题
2016/07/08 PHP
php实现的中文分词类完整实例
2017/02/06 PHP
PHP实现字符串翻转功能的方法【递归与循环算法】
2017/11/03 PHP
PHP自定义序列化接口Serializable用法分析
2017/12/29 PHP
一个JavaScript的求爱小特效
2014/05/09 Javascript
上传文件返回的json数据会被提示下载问题解决方案
2014/12/03 Javascript
跟我学习javascript的prototype原型和原型链
2015/11/18 Javascript
js获取客户端操作系统类型的方法【测试可用】
2016/05/27 Javascript
浅谈时钟的生成(js手写简洁代码)
2016/08/20 Javascript
深入理解js中的加载事件
2017/02/08 Javascript
微信小程序 图片上传实例详解
2017/05/05 Javascript
微信小程序实现多个按钮toggle功能的实例
2017/06/13 Javascript
详解如何用模块化的方式写vuejs
2017/12/16 Javascript
浅谈Vue Element中Select下拉框选取值的问题
2018/03/01 Javascript
vue脚手架搭建项目的兼容性配置详解
2018/07/17 Javascript
微信小程序云函数使用mysql数据库过程详解
2019/08/07 Javascript
如何在JS文件中获取Vue组件
2020/09/16 Javascript
[01:09]2014DOTA2国际邀请赛 TI4西雅图DOTA2 中国美女coser加油助威
2014/07/20 DOTA
[01:37]全新的一集《真视界》——TI7总决赛
2017/09/21 DOTA
[56:58]VP vs Optic 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
详解python 字符串和日期之间转换 StringAndDate
2017/05/04 Python
对numpy中shape的深入理解
2018/06/15 Python
python开发准备工作之配置虚拟环境(非常重要)
2019/02/11 Python
django rest framework使用django-filter用法
2020/07/15 Python
Python 实现3种回归模型(Linear Regression,Lasso,Ridge)的示例
2020/10/15 Python
python requests库的使用
2021/01/06 Python
Lookfantastic台湾:英国彩妆美发保养购物网
2018/03/26 全球购物
Europcar比利时:租车
2019/08/26 全球购物
机电一体化专业应届本科生求职信
2013/09/27 职场文书
财务主管的岗位职责
2013/12/30 职场文书
经理秘书求职自荐信范文
2014/03/23 职场文书
电子商务专业毕业生自荐书
2014/06/22 职场文书
个人自查自纠材料
2014/10/14 职场文书
java Nio使用NioSocket客户端与服务端交互实现方式
2021/06/15 Java/Android
使用canvas仿Echarts实现金字塔图的实例代码
2021/11/11 HTML / CSS