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-reloadsudo 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秒无响应直接终止请求。 - 提前校验响应属性:开启流式请求,拿到响应头后先做两层校验,不满足条件直接关闭链接不下载内容:
- 校验
Content-Type是否为text/html类型,比后缀过滤更精准,避免无后缀的静态资源被误下载 - 校验
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
相关产品推荐
相关产品推荐

