定时任务全自动:从 cron 到告警,一套 SERP 监控不落地

搭 SERP 监控,最难的不是"查一次",而是让它每天自动跑、出错能发现、结果能交付。这篇讲一套完整的调度方案:定时触发 + 失败告警 + 结果存储。

整体架构

定时触发(GitHub Actions / cron)
  → 跑监控脚本(SERP API)
    → 成功:存结果
    → 失败:告警(邮件/Slack)

方案一:GitHub Actions(推荐,免费)

name: serp-monitor
on:
  schedule:
    - cron: "0 */6 * * *"   # 每 6 小时
  workflow_dispatch:         # 手动触发
jobs:
  monitor:
    runs-on: ubuntu-latest
    timeout-minutes: 10
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with: { python-version: "3.11" }
      - run: pip install requests
      - name: Run monitor
        env:
          SERPBASE_API_KEY: ${{ secrets.SERPBASE_API_KEY }}
        run: python monitor.py

监控脚本

import os, requests

def run_monitor():
    keywords = open("keywords.txt").read().splitlines()
    results = {}
    failures = []

    for kw in keywords:
        try:
            r = requests.post(
                "https://api.serpbase.dev/google/search",
                headers={"X-API-Key": os.environ["SERPBASE_API_KEY"]},
                json={"q": kw, "hl": "zh-CN", "gl": "cn"},
                timeout=10,
            )
            r.raise_for_status()
            results[kw] = r.json()
        except Exception as e:
            failures.append((kw, str(e)))

    # 存结果
    save_results(results)

    # 有失败就告警
    if failures:
        send_alert(f"{len(failures)} 个关键词失败: {failures[:3]}")

失败告警

发邮件:

def send_alert(msg):
    import smtplib
    from email.mime.text import MIMEText
    m = MIMEText(msg, "plain", "utf-8")
    m["Subject"] = "[SERP监控] 任务失败"
    m["From"] = "you@example.com"
    m["To"] = "you@example.com"
    with smtplib.SMTP("smtp.example.com", 587) as s:
        s.starttls(); s.login("you", "pass"); s.send_message(m)

或者发 Slack / 飞书 webhook,几行代码。

结果存储

按日期存,方便回溯:

def save_results(results):
    import json
    from datetime import datetime
    fname = f"results/{datetime.now():%Y%m%d-%H}.json"
    with open(fname, "w", encoding="utf-8") as f:
        json.dump(results, f, ensure_ascii=False, indent=2)

方案二:本地 cron

不想用 Actions,本地 VPS 也行:

# crontab -e
0 */6 * * * cd /opt/serp && python monitor.py >> monitor.log 2>&1

告警阈值

不是每次失败都要告警。设置分级:

def alert_policy(failures, total):
    rate = len(failures) / total
    if rate > 0.05:
        send_alert(f"失败率 {rate:.0%},需要处理")   # 紧急
    elif failures:
        send_alert(f"{len(failures)} 个失败")        # 普通

注意

  1. 超时设置:SERP 调用设 10s 超时,避免卡死
  2. 重试:失败重试 1-2 次再告警,网络抖动不误报
  3. 幂等:重试带幂等 key,不重复扣费

效果

一套跑下来:每天自动跑 4 次,失败自动告警,结果按小时存,全程不落地。

完整参数和响应字段参考:serpbase.dev/docs。搭好之后,这套东西可以几个月不用管。

posted @ 2026-08-12 11:25  蜘蛛人  阅读(3)  评论(0)    收藏  举报