脚本如何检测网站状态

wen 实用脚本 22

本文目录导读:

脚本如何检测网站状态

  1. 使用 Python (requests 库)
  2. 使用 Bash + curl (Linux/Mac)
  3. 使用 Node.js (JavaScript)
  4. 使用 PowerShell (Windows)
  5. 进阶检测 (Python 完整版)
  6. 关键检测指标说明
  7. 实用技巧

使用 Python (requests 库)

import requests
from requests.exceptions import RequestException
def check_website_status(url, timeout=10):
    try:
        response = requests.get(url, timeout=timeout)
        # 检查 HTTP 状态码
        if response.status_code == 200:
            return True, f"网站正常 (状态码: 200)"
        else:
            return False, f"异常状态码: {response.status_code}"
    except requests.ConnectionError:
        return False, "无法连接 - 网络问题或域名不存在"
    except requests.Timeout:
        return False, "请求超时"
    except RequestException as e:
        return False, f"请求异常: {str(e)}"
# 使用示例
status, message = check_website_status("https://www.example.com")
print(f"状态: {status}, 信息: {message}")

使用 Bash + curl (Linux/Mac)

#!/bin/bash
check_site() {
    local url=$1
    local timeout=$2
    # 使用 curl 检测 HTTP 状态码
    response=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout $timeout $url)
    if [ $? -ne 0 ]; then
        echo "❌ 无法连接: $url"
        return 1
    fi
    if [ "$response" -eq 200 ] || [ "$response" -eq 301 ] || [ "$response" -eq 302 ]; then
        echo "✅ 网站正常: $url (状态码: $response)"
        return 0
    else
        echo "❌ 异常状态: $url (状态码: $response)"
        return 1
    fi
}
# 批量检测
sites=("https://www.google.com" "https://www.github.com" "https://www.example.com")
for site in "${sites[@]}"; do
    check_site $site 5
done

使用 Node.js (JavaScript)

const https = require('https');
const http = require('http');
function checkWebsiteStatus(url, timeout = 10000) {
    return new Promise((resolve, reject) => {
        const protocol = url.startsWith('https') ? https : http;
        const req = protocol.get(url, { timeout }, (res) => {
            const statusCode = res.statusCode;
            if (statusCode >= 200 && statusCode < 400) {
                resolve({
                    status: 'up',
                    code: statusCode,
                    message: `网站正常 (状态码: ${statusCode})`
                });
            } else {
                resolve({
                    status: 'down',
                    code: statusCode,
                    message: `异常状态码: ${statusCode}`
                });
            }
        });
        req.on('error', (err) => {
            resolve({
                status: 'down',
                code: 0,
                message: `连接失败: ${err.message}`
            });
        });
        req.on('timeout', () => {
            req.destroy();
            resolve({
                status: 'down',
                code: 0,
                message: '请求超时'
            });
        });
    });
}
// 使用示例 (异步)
async function main() {
    const result = await checkWebsiteStatus('https://www.example.com');
    console.log(`状态: ${result.status}, 信息: ${result.message}`);
}
main();

使用 PowerShell (Windows)

function Check-WebsiteStatus {
    param(
        [string]$Url,
        [int]$TimeoutSeconds = 10
    )
    try {
        $request = [System.Net.WebRequest]::Create($Url)
        $request.Timeout = $TimeoutSeconds * 1000
        $request.Method = "HEAD"  # 使用 HEAD 请求减少数据量
        $response = $request.GetResponse()
        $statusCode = [int]$response.StatusCode
        if ($statusCode -eq 200) {
            Write-Host "✅ 网站正常 ($Url)" -ForegroundColor Green
            return $true
        } else {
            Write-Host "⚠️ 状态码: $statusCode ($Url)" -ForegroundColor Yellow
            return $false
        }
    }
    catch {
        Write-Host "❌ 连接失败: $($_.Exception.Message)" -ForegroundColor Red
        return $false
    }
}
# 使用示例
Check-WebsiteStatus -Url "https://www.example.com"

进阶检测 (Python 完整版)

import requests
import time
from concurrent.futures import ThreadPoolExecutor
class WebsiteMonitor:
    def __init__(self, urls, timeout=10, max_workers=5):
        self.urls = urls
        self.timeout = timeout
        self.workers = max_workers
    def check_single(self, url):
        start_time = time.time()
        try:
            response = requests.get(url, timeout=self.timeout)
            response_time = round((time.time() - start_time) * 1000, 2)
            return {
                'url': url,
                'status': 'up' if response.status_code == 200 else 'warning',
                'code': response.status_code,
                'response_time': f"{response_time}ms",
                'timestamp': time.strftime('%Y-%m-%d %H:%M:%S')
            }
        except Exception as e:
            return {
                'url': url,
                'status': 'down',
                'code': 0,
                'response_time': 'N/A',
                'error': str(e),
                'timestamp': time.strftime('%Y-%m-%d %H:%M:%S')
            }
    def check_all(self):
        with ThreadPoolExecutor(max_workers=self.workers) as executor:
            results = list(executor.map(self.check_single, self.urls))
        return results
# 使用示例
monitor = WebsiteMonitor([
    'https://www.google.com',
    'https://www.github.com',
    'https://www.notexist123.com'
])
results = monitor.check_all()
for result in results:
    status_icon = "✅" if result['status'] == 'up' else "❌"
    print(f"{status_icon} {result['url']} - {result['status']} - {result.get('response_time', 'N/A')}")

关键检测指标说明

| 说明 | 实现方式 | |---------|------|---------| | HTTP 状态码 | 200=正常, 4xx=客户端错误, 5xx=服务器错误 | response.status_code | | 响应时间 | 页面加载速度 | time.time() 计算 |匹配 | 检测页面是否包含特定关键词 | response.text.find('keyword') | | SSL 证书 | 证书是否过期或有效 | ssl 模块检查 | | 连通性** | 是否能 Ping 通或连接端口 | ping 命令或 socket |

实用技巧

  1. 使用 HEAD 请求:减少数据传输,只获取响应头

    response = requests.head(url)
  2. 设置重试机制:避免临时网络波动误判

    from requests.adapters import HTTPAdapter
    session = requests.Session()
    session.mount('http://', HTTPAdapter(max_retries=3))
  3. 记录日志:保存检测历史用于分析

    import logging
    logging.basicConfig(filename='website_monitor.log', level=logging.INFO)
  4. 定时执行:使用 cron (Linux) 或 Task Scheduler (Windows) 定期运行脚本

这些脚本可以根据你的具体需求调整,比如添加邮件通知、生成报表等高级功能。

抱歉,评论功能暂时关闭!