使用Python的requests开发的 [网站监控工具] 的实现

1. 概述

本报告详细介绍了一个使用Python开发的简单网站监控工具的设计与实现。该工具主要功能是周期性地检查一组预定义网站的可达性和响应时间。使用Python的requests库来发送HTTP请求,通过分析响应状态码和响应时间来评估网站的运行状态。监控结果会实时打印到控制台,并记录到日志文件中,便于后续的审查和分析。

工具的核心功能包括:

  • 网站状态检测:对指定网站进行可达性测试,检查其HTTP响应状态。
  • 响应时间记录:测量并记录每次请求的响应时间,用于评估网站性能。
  • 日志记录:将每次检测的时间戳、网站URL、状态和响应时间记录到日志文件中。
  • 定时监控:通过设定时间间隔(例如每分钟),自动执行上述检查任务。

2. 系统设计

2.1 技术选型
  • Python: 选择Python作为开发语言,因其简洁的语法和丰富的库支持,非常适合快速开发。
  • Requests库: 用于发送HTTP请求,检测网站的可达性和响应速度。
  • Time和Datetime库: 用于处理时间相关的功能,如添加时间戳和设置检测间隔。
2.2 功能设计
  • 网站状态检测: 对指定的网站列表进行可达性测试,检查HTTP响应状态码。
  • 响应时间记录: 记录每次请求的响应时间,用于分析网站的性能。
  • 日志记录: 将检测结果记录到日志文件,便于后续的分析和监控。
  • 定时任务: 设定监控的频率,如每分钟检测一次所有指定的网站。

3. 实现步骤

1. 引入必要的库

  • requests:用于发送HTTP请求。
  • time:提供时间相关的功能,用于控制检查的间隔。
  • datetime:用于生成时间戳,记录每次检查的时间。

2. 设定被监控的网站列表

websites = [
    "http://example.com",
    "http://example.org",
    "http://example.net"
]

这个列表包含了所有需要监控的网站的URL。可以根据需要添加或删除URL。

3. 定义检查网站状态的函数

def check_website(url):
    try:
        response = requests.get(url)
        if response.status_code == 200:
            return True, response.elapsed.total_seconds()
        else:
            return False, response.elapsed.total_seconds()
    except requests.RequestException as e:
        return False, 0

这个函数尝试对给定的URL发起GET请求。如果网站正常响应(HTTP状态码为200),函数返回True和响应时间。如果请求失败或状态码不是200,函数返回False和响应时间。异常情况下,响应时间返回0。

4. 主函数执行周期性检查

def monitor_websites(interval=60):
    while True:
        for url in websites:
            status, response_time = check_website(url)
            timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
            log_message = f"[{timestamp}] {url} - 状态: {'正常' if status else '异常'}, 响应时间: {response_time:.2f}秒"
            print(log_message)
            with open("website_monitor_log.txt", "a") as f:
                f.write(log_message + "\n")
        time.sleep(interval)

5. 运行监控

当脚本被执行时,monitor_websites函数将被调用,并开始执行监控活动。

完整代码

import requests
import time
from datetime import datetime

# 网站列表
websites = [
    "http://example.com",
    "http://example.org",
    "http://example.net"
]

# 检查网站状态
def check_website(url):
    try:
        response = requests.get(url, timeout=10)
        if response.status_code == 200:
            return True, response.elapsed.total_seconds()
        else:
            return False, response.elapsed.total_seconds()
    except requests.RequestException:
        return False, 0

# 监控网站并记录日志
def monitor_websites(interval=60):
    while True:
        for url in websites:
            status, response_time = check_website(url)
            timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
            log_message = f"[{timestamp}] {url} - 状态: {'正常' if status else '异常'}, 响应时间: {response_time:.2f}秒"
            print(log_message)
            with open("website_monitor_log.txt", "a") as f:
                f.write(log_message + "\n")
        time.sleep(interval)

if __name__ == "__main__":
    monitor_websites(60)