智能手表网站,wordpress修改源代码,成都代做网站,地方网站 域名选择前面两篇讲了有关爬虫系统的搭建以及爬虫中需要的代理ip池的搭建的全过程#xff0c;接下来我将写一个爬虫系统以及代理ip池异常监控的程序#xff0c;主要功能就是监控是否发生异常#xff0c;及时通过邮件提醒管理员排查故障#xff0c;这样整体的一套流程就全部清晰了接下来我将写一个爬虫系统以及代理ip池异常监控的程序主要功能就是监控是否发生异常及时通过邮件提醒管理员排查故障这样整体的一套流程就全部清晰了能够完美适配任何项目。 在Linux系统上监控爬虫运行状态并实现异常邮件通知可以通过以下方案实现
一、监控爬虫运行状态的核心方法
1、进程存活监控
# 检查爬虫进程是否存在
pgrep -f spider.py /dev/null
if [ $? -eq 0 ]; thenecho 爬虫进程运行中
elseecho 爬虫进程已停止需要告警
fi2、心跳检测机制
在爬虫代码中添加心跳记录
# spider.py
import time
import jsondef record_heartbeat():heartbeat {timestamp: time.time(),status: running,items_scraped: 1000 # 实际抓取数量}with open(/var/log/spider_heartbeat.json, w) as f:json.dump(heartbeat, f)# 在爬虫主循环中定期调用
while True:# ...爬虫工作...record_heartbeat()time.sleep(60) # 每分钟记录一次3、日志关键词监控
# 检查日志中是否包含成功标记
tail -n 100 /var/log/spider.log | grep Scraped 100 items /dev/null
if [ $? -ne 0 ]; thenecho 日志无更新需要告警
fi4、数据产出监控
# 检查数据库最新数据时间
last_data_time$(mysql -uuser -ppass -e SELECT MAX(created_at) FROM items spider_db)
current_time$(date %s)
if [ $(($current_time - $(date -d $last_data_time %s))) -gt 3600 ]; thenecho 数据超过1小时未更新需要告警
fi二、邮件告警系统实现
1、安装邮件发送工具
sudo apt install mailutils -y2、配置邮件发送脚本 send_alert.sh
#!/bin/bash
# send_alert.shALERT_SUBJECT爬虫系统异常告警
ALERT_CONTENT$(cat EOF
服务器: $(hostname)
时间: $(date)
异常类型: $1
详细信息:
$2
EOF
)echo $ALERT_CONTENT | mail -s $ALERT_SUBJECT adminexample.com3、完整监控脚本 spider_monitor.sh
#!/bin/bash
# spider_monitor.sh# 1. 进程检查
if ! pgrep -f spider.py /dev/null; then./send_alert.sh 进程停止 爬虫进程未运行exit 1
fi# 2. 心跳检查
HEARTBEAT_FILE/var/log/spider_heartbeat.json
if [ ! -f $HEARTBEAT_FILE ]; then./send_alert.sh 心跳丢失 心跳文件不存在exit 1
fitimestamp$(jq -r .timestamp $HEARTBEAT_FILE 2/dev/null)
current_time$(date %s)
if [ -z $timestamp ] || [ $(($current_time - $timestamp)) -gt 1200 ]; then./send_alert.sh 心跳超时 心跳超过20分钟未更新最后时间: $(date -d $timestamp)exit 1
fi# 3. 日志检查
if ! tail -n 100 /var/log/spider.log | grep Scraped [0-9]\ items /dev/null; then./send_alert.sh 日志异常 最近100行日志未发现抓取记录exit 1
fi# 4. 数据产出检查
last_data_time$(mysql -uuser -ppass -e SELECT MAX(created_at) FROM items -NB spider_db 2/dev/null)
if [ -z $last_data_time ]; then./send_alert.sh 数据库错误 无法获取最新数据时间exit 1
fidb_time$(date -d $last_data_time %s)
if [ $(($current_time - $db_time)) -gt 7200 ]; then./send_alert.sh 数据异常 数据超过2小时未更新最后数据时间: $last_data_timeexit 1
fiecho $(date) - 爬虫运行正常4、设置定时任务
# 每5分钟执行一次监控
crontab -e
*/5 * * * * /path/to/spider_monitor.sh /var/log/spider_monitor.log 21三、高级监控方案使用Prometheus Grafana Alertmanager
1、在爬虫中暴露监控指标
# metrics.py
from prometheus_client import start_http_server, Counter, Gauge# 定义指标
PAGES_SCRAPED Counter(spider_pages_scraped, 已抓取页面数)
ITEMS_SCRAPED Counter(spider_items_scraped, 已抓取数据项)
LAST_SUCCESS Gauge(spider_last_success, 最后成功时间戳)# 在爬虫中更新指标
def record_success(items):ITEMS_SCRAPED.inc(len(items))LAST_SUCCESS.set_to_current_time()# 启动指标服务器在8888端口
start_http_server(8888)2、Prometheus配置
# prometheus.yml
scrape_configs:- job_name: spiderstatic_configs:- targets: [spider-server:8888]3、Alertmanager邮件配置
# alertmanager.yml
route:receiver: email-alertsreceivers:
- name: email-alertsemail_configs:- to: adminexample.comfrom: alertmanagerexample.comsmarthost: smtp.example.com:587auth_username: userauth_password: passsend_resolved: true4、告警规则
# spider_alerts.yml
groups:
- name: spiderrules:- alert: SpiderDownexpr: up{jobspider} 0for: 5mlabels:severity: criticalannotations:summary: 爬虫服务下线description: 爬虫服务 {{ $labels.instance }} 已停止运行超过5分钟- alert: NoRecentDataexpr: time() - spider_last_success 3600for: 15mlabels:severity: warningannotations:summary: 爬虫数据停止更新description: 爬虫服务 {{ $labels.instance }} 已超过1小时未产生新数据四、异常自动恢复机制
# 在监控脚本中添加重启逻辑
if ! pgrep -f spider.py /dev/null; then./send_alert.sh 进程停止 尝试重启爬虫...cd /path/to/spidersource .venv/bin/activatenohup python spider.py /var/log/spider.log 21 sleep 10if pgrep -f spider.py; then./send_alert.sh 重启成功 爬虫进程已恢复else./send_alert.sh 重启失败 爬虫重启失败需要人工干预fi
fi五、增强型监控建议
1、多维度监控
系统资源CPU/内存/磁盘使用率网络状态代理IP可用性、请求成功率业务指标抓取速率、数据质量
2、分级告警
轻微异常发送邮件通知严重故障增加短信/钉钉通知灾难性故障电话通知
3、告警收敛
# 避免重复告警
if [ -f /tmp/last_alert ] [ $(($(date %s) - $(stat -c %Y /tmp/last_alert)) -lt 3600 ]; thenecho 1小时内已发送过告警跳过exit 0
fi
touch /tmp/last_alert4、可视化看板 #mermaid-svg-3E2IcACgOCPe8Aqg {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3E2IcACgOCPe8Aqg .error-icon{fill:#552222;}#mermaid-svg-3E2IcACgOCPe8Aqg .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-3E2IcACgOCPe8Aqg .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-3E2IcACgOCPe8Aqg .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-3E2IcACgOCPe8Aqg .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-3E2IcACgOCPe8Aqg .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-3E2IcACgOCPe8Aqg .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-3E2IcACgOCPe8Aqg .marker{fill:#333333;stroke:#333333;}#mermaid-svg-3E2IcACgOCPe8Aqg .marker.cross{stroke:#333333;}#mermaid-svg-3E2IcACgOCPe8Aqg svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-3E2IcACgOCPe8Aqg .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-3E2IcACgOCPe8Aqg .cluster-label text{fill:#333;}#mermaid-svg-3E2IcACgOCPe8Aqg .cluster-label span{color:#333;}#mermaid-svg-3E2IcACgOCPe8Aqg .label text,#mermaid-svg-3E2IcACgOCPe8Aqg span{fill:#333;color:#333;}#mermaid-svg-3E2IcACgOCPe8Aqg .node rect,#mermaid-svg-3E2IcACgOCPe8Aqg .node circle,#mermaid-svg-3E2IcACgOCPe8Aqg .node ellipse,#mermaid-svg-3E2IcACgOCPe8Aqg .node polygon,#mermaid-svg-3E2IcACgOCPe8Aqg .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-3E2IcACgOCPe8Aqg .node .label{text-align:center;}#mermaid-svg-3E2IcACgOCPe8Aqg .node.clickable{cursor:pointer;}#mermaid-svg-3E2IcACgOCPe8Aqg .arrowheadPath{fill:#333333;}#mermaid-svg-3E2IcACgOCPe8Aqg .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-3E2IcACgOCPe8Aqg .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-3E2IcACgOCPe8Aqg .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-3E2IcACgOCPe8Aqg .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-3E2IcACgOCPe8Aqg .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-3E2IcACgOCPe8Aqg .cluster text{fill:#333;}#mermaid-svg-3E2IcACgOCPe8Aqg .cluster span{color:#333;}#mermaid-svg-3E2IcACgOCPe8Aqg div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-3E2IcACgOCPe8Aqg :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 抓取指标 Prometheus Grafana 实时监控看板 请求速率 数据产出 错误率 通过以上方案可以实现对爬虫系统的全面监控在出现异常时及时通知管理员确保爬虫服务的稳定运行。生产环境推荐使用PrometheusGrafanaAlertmanager的组合方案它提供了更强大的监控能力和可视化效果。