You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS EC2上BeautifulSoup爬虫进程被杀如何提前终止或自动重启?

解决方案

1. 进程异常退出自动重启实现

1.1 Linux原生方案(无需额外AWS服务)

推荐使用systemd管理爬虫进程,配置后只要进程异常退出就会自动重启,实例重启后也会自动拉起进程:

  • 新建service配置文件/etc/systemd/system/crawler.service,写入以下内容:
[Unit]
Description=Python Web Crawler
After=network.target

[Service]
User=ec2-user
WorkingDirectory=/path/to/your/crawler/directory
ExecStart=/usr/bin/python3 /path/to/your/crawler.py
Restart=always
RestartSec=5
MemoryLimit=512M # 可选,限制进程最大内存占用,避免耗尽实例内存触发系统OOM

[Install]
WantedBy=multi-user.target
  • 执行以下命令启动服务并配置开机自启:
    sudo systemctl daemon-reload
    sudo systemctl enable --now crawler.service
  • 可通过systemctl status crawler.service查看运行状态和历史日志。

1.2 AWS原生服务方案

  • 方案1:CloudWatch + SSM Automation:将爬虫进程存活状态作为自定义指标上报到CloudWatch,配置告警规则,当检测到进程退出时,触发SSM Automation命令在EC2实例上执行进程启动操作。
  • 方案2:ECS容器化部署:将爬虫打包为Docker镜像,使用ECS(EC2启动类型或Fargate无服务器启动类型)部署,配置任务重启策略为RESTART_ON_FAILURE,AWS会自动监控任务运行状态,异常退出时自动重新启动任务。

2. 网络请求限制方案(避免流量突增)

首先明确:BeautifulSoup本身是HTML解析库,不具备网络请求能力,你需要对发起请求的库(通常为requests、aiohttp等)做限制:

  • 强制配置请求超时:所有请求统一设置连接+读取超时,避免异常慢链接长期占用带宽。示例(requests):requests.get(url, timeout=10),10秒无响应直接终止请求。
  • 提前校验响应属性:开启流式请求,拿到响应头后先做两层校验,不满足条件直接关闭链接不下载内容:
    1. 校验Content-Type是否为text/html类型,比后缀过滤更精准,避免无后缀的静态资源被误下载
    2. 校验Content-Length,超过你设定的阈值(比如5MB)直接终止请求
      代码示例:
import requests
MAX_RESPONSE_SIZE = 5 * 1024 * 1024 # 可自行调整阈值,此处为5MB
resp = requests.get(url, stream=True, timeout=10)
content_type = resp.headers.get("Content-Type", "")
content_length = int(resp.headers.get("Content-Length", 0))
if "text/html" not in content_type or content_length > MAX_RESPONSE_SIZE:
    resp.close()
    # 标记当前url为异常,跳过后续处理
  • 限制并发请求数:如果使用异步请求库,配置最大并发数(比如aiohttp的TCPConnector(limit=10)),避免同时发起过多请求导致流量突增。
  • 内置流量监控:在代码中统计单位时间内的累计流量,超过设定阈值后自动暂停爬取任务一段时间,主动避免流量峰值。

内容的提问来源于stack exchange,提问作者ardito.bryan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 18:15:05