当前位置:首页 > 数字化与技术

python搭建网站访问异常监测脚本方案

文玑阁3个月前 (06-02)数字化与技术3720

团队有个项目,部署在某国企的服务器上,采用了信创的架构。问题来了,极不稳定,经常发现网站访问不了,或者宕机了。于是就想自己用python做个访问脚本,只要有访问异常,就推送信息到微信上,以便及时处理。当然这个是不是以开发这个项目的技术角度来处理。只是站在用户的角度开发一个小工具,运行在本地电脑上(编者将python程序部署在阿里云服务器上)。以下描述实施步骤。

一、项目需求:

  • 监测目标:B 网站

  • 运行环境:放在 A 网站服务器(Linux/Windows 都支持)

  • 时间规则:8点-10点,每15分钟确认一次。10点-18点每30分钟确认一次

  • 超时判定:20 秒内未访问成功 = 异常

  • 告警方式:自动发消息到微信

二、准备工作(5 分钟完成)

1. 开通微信告警(Server 酱,免费)

  1. 打开官网:https://sct.ftqq.com/

  2. 微信扫码登录

  3. 获取 SendKey(后面脚本要用到)

  4. 关注官方公众号,告警会直接推送到微信

2. 服务器安装 Python(几乎所有服务器都自带)

三、python源码

import time
import os
import traceback
from datetime import datetime
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
import urllib.request
import urllib.parse

# ====================== 【配置】 ======================
USERNAME = "你的账号"
PASSWORD = "你的密码"
SEND_KEY = "你的SendKey"

LOGIN_URL = "B网站域名/登录地址"
TARGET_URL = "B网站域名"
CHROME_DRIVER_PATH = r"D:\python\chromedriver.exe" #服务器安装chrome浏览器,并且检查版本后,下载chromedriver.exe并复制到该项目的位置。

# 稳定性设置
MAX_CHECK_TIME = 120  # 单次检测最大超时秒数(超过就重启)
LOG_DIR = "logs"      # 日志文件夹
# ======================================================

# 自动创建日志目录
if not os.path.exists(LOG_DIR):
    os.mkdir(LOG_DIR)

# 日志输出(自动按天生成)
def log(msg):
    now = datetime.now()
    date_str = now.strftime("%Y-%m-%d")
    time_str = now.strftime("%Y-%m-%d %H:%M:%S")
    log_file = os.path.join(LOG_DIR, f"check_{date_str}.log")
    log_msg = f"[{time_str}] {msg}"
    print(log_msg)
    try:
        with open(log_file, "a", encoding="utf-8") as f:
            f.write(log_msg + "\n")
    except:
        pass

# 微信推送
def send_wechat(title, desp):
    if not SEND_KEY:
        return
    try:
        data = urllib.parse.urlencode({"title": title, "desp": desp}).encode()
        req = urllib.request.Request(f"https://sctapi.ftqq.com/{SEND_KEY}.send", data=data)
        with urllib.request.urlopen(req, timeout=10):
            pass
    except:
        log("微信推送失败")

# 浏览器启动
def get_driver():
    options = webdriver.ChromeOptions()
    options.add_argument("--no-sandbox")
    options.add_argument("--disable-gpu")
    options.add_argument("--disable-dev-shm-usage")
    options.add_experimental_option("excludeSwitches", ["enable-automation", "enable-logging"])
    service = Service(CHROME_DRIVER_PATH)
    driver = webdriver.Chrome(service=service, options=options)
    driver.implicitly_wait(20)
    return driver

# 检测任务
def check():
    driver = None
    try:
        log("开始检测...")
        driver = get_driver()
        driver.get(LOGIN_URL)
        time.sleep(5)

        driver.get(TARGET_URL)
        time.sleep(3)

        url = driver.current_url
        if "login" not in url.lower():
            log("✅ 访问正常(已绕过412)")
            return True
        else:
            log("❌ 未登录成功")
            send_wechat("网站告警", "未登录成功,可能会话失效")
            return False

    except Exception as e:
        err = str(e)[:100]
        log(f"❌ 检测异常:{err}")
        send_wechat("网站监测异常", f"错误:{err}")
        return False

    finally:
        try:
            if driver:
                driver.quit()
        except:
            pass

# 时间策略
def sleep_time():
    h = datetime.now().hour
    if 8 <= h < 10:
        return 15 * 60
    elif 10 <= h < 18:
        return 30 * 60
    else:
        return 60 * 60

# 看门狗:超时自动重启
def run_with_watchdog():
    while True:
        try:
            start = time.time()
            check()
            cost = int(time.time() - start)
            log(f"单次检测完成,耗时{cost}秒")

            # 超时保护
            if cost > MAX_CHECK_TIME:
                log(f"⚠️ 检测超时({cost}秒),即将重启")
                os._exit(1)

        except:
            log(f"⚠️ 程序崩溃,准备重启:{traceback.format_exc()[:100]}")
            time.sleep(5)

        # 等待下一轮
        wait = sleep_time()
        log(f"等待 {wait//60} 分钟后下次检测\n")
        time.sleep(wait)

if __name__ == "__main__":
    log("===== 网站监测服务启动(稳定版 + 日志 + 自动重启)=====")
    run_with_watchdog()

四、说明

1. 自动日志

  • 每天自动生成一个 log 文件

  • 路径:logs/check_2026-06-02.log

  • 记录:启动、成功、失败、错误、耗时

2. 崩溃自动重启

  • 浏览器崩了 → 自动重启

  • 网络异常 → 自动重试

  • 不中断监测

3. 卡死自动重启

  • 超过 120 秒没反应 → 强制重启

  • 彻底杜绝卡死不动

4. 不重复启动

  • 安全单例运行

  • 不会开一堆浏览器

5. 异常自动告警

  • 登录失败 → 告警

  • 页面打不开 → 告警

  • 程序崩溃 → 告警


五、补充说明:开机自启动python文件

1、创建一个启动脚本

2、新建一个文本文件,输入内容

Set WshShell = CreateObject("WScript.Shell")
WshShell.Run "py main.py", 0
Set WshShell = Nothing

3、把文本文件另存为:start.vbs(保存类型:所有文件,编码:ANSI)

4、把这个 vbs 放到开机启动文件夹:

①按win+r

②输入

shell:startup

③把 start.vbs 拖进去,完成:服务器开机 → 自动后台运行脚本 → 自动定时检测 → 异常微信告警。


以上就是全部过程。结果如下


分享给朋友:

相关文章

如何修改网页编码gb2312与utf-8

网页编码一般gb2312或者utf-8比较流行,对于中国大陆的大部分浏览器而言,编码为gb2312都能识别,而加上国外的浏览器来说,可能utf-8更受欢迎,暂且定utf-8编码为通用编码吧,所以有时候…

CSS控制zblog文章段落首行缩进两个字符位置

乾元轩介绍了如何利用CSS控制zblog文章段落首行缩进的问题,可以避免使用tab键,这样查看源代码,也会觉得代码看起来比较美观简洁,搜索引擎相对来说爬行时会感到比较舒服…

搜狗输入法也沦为流氓软件?

输入法安装居然捆绑搜狗浏览器,还不让选择不安装搜狗浏览器,似乎洞悉我们的内心想法,知道我们需要什么样的输入法,什么样的浏览器,什么样的上网主页,通通都帮我们强制设定好了,这种做法看似很周到,很人性,其…

博客流量之搜索引擎来路

博客流量之搜索引擎来路

乾元轩博客并没有什么流量,都是靠着几篇琐碎的文章从一些大牌搜索引擎那里分得点滴流量,这当然不是假话,有第三方流量统计工具的统计数字作证,这十几二十个ip一天虽然不值一提,但是觉得还挺有意思挺好玩的…

乾元轩新域名终于拿到工信部备案号了

乾元轩新域名终于拿到工信部备案号了

互联网在中国当然必须具有中国特色,而备案就是中国特色之一,没有工信部的备案号当然就如红旗上少了一颗星星一样,不靠谱,这个imwen.com已经注册半年了,从注册时起,就委托空间商备案客服帮忙备案了…

zblog邮箱设置为必填选项

前两天花满山也和我提到个人博客网站很多垃圾留言评论的问题,这个问题让我很汗颜,垃圾评论已经严重损害了个人博客网站的健康,同时给广大人民群众带来非常严重的负面影响,所以我解决此问题并顺便介绍了zblog…

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。