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 socket.error: [Errno 98] Address already in use的原因和解决方法
Aug 25 Python
在Python中使用cookielib和urllib2配合PyQuery抓取网页信息
Apr 25 Python
为Python程序添加图形化界面的教程
Apr 29 Python
python使用socket远程连接错误处理方法
Apr 29 Python
使用Python程序抓取新浪在国内的所有IP的教程
May 04 Python
Django实现自定义404,500页面教程
Mar 26 Python
python生成随机图形验证码详解
Nov 08 Python
python判断计算机是否有网络连接的实例
Dec 15 Python
python虚拟环境完美部署教程
Aug 06 Python
如何基于python生成list的所有的子集
Nov 11 Python
python GUI库图形界面开发之PyQt5打印控件QPrinter详细使用方法与实例
Feb 28 Python
python 实现定时任务的四种方式
Apr 01 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
php5.3提示Function ereg() is deprecated Error问题解决方法
2014/11/12 PHP
支付宝接口开发集成支付环境小结
2015/03/17 PHP
PHP中类的继承和用法实例分析
2016/05/24 PHP
PHP使用数组实现矩阵数学运算的方法示例
2017/05/29 PHP
PHP的PDO预定义常量讲解
2019/01/24 PHP
jquery 插件学习(二)
2012/08/06 Javascript
jquery预览图片实现鼠标放上去显示实际大小
2014/01/16 Javascript
用jquery写的一个万年历(自写)
2014/01/20 Javascript
查找Oracle高消耗语句的方法
2014/03/22 Javascript
js键盘事件的keyCode
2014/07/29 Javascript
JS实现带有3D立体感的银灰色竖排折叠菜单代码
2015/10/20 Javascript
javascript中数组和字符串的方法对比
2016/07/20 Javascript
bootstrap下拉列表与输入框组结合的样式调整
2016/10/08 Javascript
JavaScript中三种常见的排序方法
2017/02/24 Javascript
详解Vue 全局变量,局部变量
2019/04/17 Javascript
vue.js高德地图实现热点图代码实例
2019/04/18 Javascript
微信小程序登录时如何获取input框中的内容
2019/12/04 Javascript
Vue解析剪切板图片并实现发送功能
2020/02/04 Javascript
Vue Router 实现动态路由和常见问题及解决方法
2020/03/06 Javascript
常用python数据类型转换函数总结
2014/03/11 Python
Python写的贪吃蛇游戏例子
2014/06/16 Python
python自动格式化json文件的方法
2015/03/11 Python
Python编程对列表中字典元素进行排序的方法详解
2017/05/26 Python
详谈Python基础之内置函数和递归
2017/06/21 Python
MySQL适配器PyMySQL详解
2017/09/20 Python
Python实现随机漫步功能
2018/07/09 Python
Python 多维List创建的问题小结
2019/01/18 Python
python openpyxl使用方法详解
2019/07/18 Python
浅析Python语言自带的数据结构有哪些
2019/08/27 Python
利用 Python ElementTree 生成 xml的实例
2020/03/06 Python
Keras自定义IOU方式
2020/06/10 Python
简述使用ftp进行文件传输时的两种登录方式?它们的区别是什么?常用的ftp文件传输命令是什么?
2016/11/20 面试题
文明班级建设方案
2014/05/15 职场文书
国际经济贸易专业自荐信
2014/06/13 职场文书
学习雷锋月活动总结
2014/07/03 职场文书
话题作文之呼唤
2019/12/18 职场文书