Python實(shí)現(xiàn)批量檢測(cè)HTTP服務(wù)的狀態(tài)
用Python實(shí)現(xiàn)批量測(cè)試一組url的可用性(可以包括HTTP狀態(tài)、響應(yīng)時(shí)間等)并統(tǒng)計(jì)出現(xiàn)不可用情況的次數(shù)和頻率等。
類似的,這樣的腳本可以判斷某個(gè)服務(wù)的可用性,以及在眾多的服務(wù)提供者中選擇最優(yōu)的。
需求以及腳本實(shí)現(xiàn)的功能如下:
- 默認(rèn)情況下,執(zhí)行腳本會(huì)檢測(cè)一組url的可用性。
- 如果可用,返回從腳本所在的機(jī)器到HTTP服務(wù)器所消耗的時(shí)間和內(nèi)容等信息。
- 如果url不可用,則記錄并提示用戶,并顯示不可用發(fā)生的時(shí)間。
- 默認(rèn)情況下,允許最大的錯(cuò)誤次數(shù)是200,數(shù)目可以自定義,如果達(dá)到允許的最大錯(cuò)誤次數(shù),則在輸出信息的最后,根據(jù)每一個(gè)url做出錯(cuò)誤統(tǒng)計(jì)。
- 如果用戶手動(dòng)停止腳本,則需要在輸出信息的最后,根據(jù)每一個(gè)url做出錯(cuò)誤統(tǒng)計(jì)。
腳本中涉及的一些技巧:
- 使用gevent并發(fā)處理多個(gè)HTTP請(qǐng)求,多個(gè)請(qǐng)求之間無須等待響應(yīng)(gevent還有很多使用技巧,可再自行學(xué)習(xí));
- 使用signal模塊捕獲信號(hào),如果捕獲到則處理并退出,避免主進(jìn)程接收到KeyboardInterrupt直接退出但無法處理的問題;
- 注意留意腳本中關(guān)于統(tǒng)計(jì)次數(shù)方面的小技巧;
腳本運(yùn)行效果圖( 如果圖片看不清楚,請(qǐng)選擇“在新標(biāo)簽頁中打開圖片” )如下:

腳本如下:
#!/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 快速實(shí)現(xiàn) HTTP 和 FTP 服務(wù)器的方法
- Python通過命令開啟http.server服務(wù)器的方法
- python探索之BaseHTTPServer-實(shí)現(xiàn)Web服務(wù)器介紹
- Python探索之實(shí)現(xiàn)一個(gè)簡(jiǎn)單的HTTP服務(wù)器
- Python實(shí)現(xiàn)簡(jiǎn)單的HttpServer服務(wù)器示例
- Python搭建HTTP服務(wù)器和FTP服務(wù)器
- Python內(nèi)置的HTTP協(xié)議服務(wù)器SimpleHTTPServer使用指南
- 使用Python來編寫HTTP服務(wù)器的超級(jí)指南
- 超簡(jiǎn)單的Python HTTP服務(wù)
相關(guān)文章
詳解python路徑拼接os.path.join()函數(shù)的用法
os.path.join()函數(shù):連接兩個(gè)或更多的路徑名組件。這篇文章主要介紹了python路徑拼接os.path.join()函數(shù)的用法,需要的朋友可以參考下2019-10-10
Python循環(huán)結(jié)構(gòu)的應(yīng)用場(chǎng)景詳解
這篇文章主要介紹了Python循環(huán)結(jié)構(gòu)的應(yīng)用場(chǎng)景詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07
Python使用execjs執(zhí)行包含中文參數(shù)的JavaScript
爬蟲的開發(fā)過程中,往往需要對(duì)JS進(jìn)行模擬,簡(jiǎn)單或者通用的還可以在Python中模擬或者找到對(duì)應(yīng)的第三方庫,但是復(fù)雜的就可能不好實(shí)現(xiàn)了,下面這篇文章主要給大家介紹了關(guān)于Python使用execjs執(zhí)行包含中文參數(shù)的JavaScript的相關(guān)資料,需要的朋友可以參考下2022-03-03

