Scrapyd部署需用scrapyd-client将含setup.py的项目打包上传,API调用须严格匹配project名、正确传参jobid,并通过list_jobs.json和日志协同监控状态,同时配置scrapyd.conf限制并发防堆积。

怎么用 scrapyd-client 部署爬虫到 Scrapyd
Scrapyd 不接受本地文件,必须打包成 egg 或 wheel(实际只认 setup.py 构建的 egg),直接丢代码过去会 400 错误。常见错是把项目根目录当包传,结果 scrapyd-client deploy 报 ValueError: No setup.py found。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 确保项目里有
setup.py,内容至少含from setuptools import setup; setup(name="myproject") - 运行
scrapyd-client deploy default前,先cd到含setup.py的目录(不是scrapy.cfg所在目录) -
scrapy.cfg中的[deploy]段要写对url和project,否则部署成功但调 API 时找不到 project - 部署后用
curl http://localhost:6800/list_projects.json确认 project 名是否和setup.py里一致
怎么用 API 启动/停止一个爬虫任务
Scrapyd 的 API 是纯 HTTP 接口,不带鉴权、不返回结构化错误,容易因参数拼错或状态没查清就“以为跑起来了”。比如发了 schedule.json 请求却没看响应体,结果返回 {"status": "error", "message": "Spider not found"} 却当成成功。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 启动:用
POST /schedule.json,必传project和spider,可选setting、jobid;别漏Content-Type: application/x-www-form-urlencoded - 停止:用
POST /cancel.json,必须同时传project、spider和正在运行的jobid(从list_jobs.json拿);停错 jobid 会返回{"status": "error", "message": "Unknown job" - 查状态别只靠
list_jobs.json:它只显示“running/pending/finished”,不反映爬虫是否真卡死或被信号终止,得结合日志logs/{project}/{spider}/{jobid}.log
为什么 scrapyd-client 上传后爬虫不出现
最常踩的坑是 setup.py 和 scrapy.cfg 里的 project 名不一致,或者 scrapy.cfg 写了 [deploy:prod] 却用 deploy default——Scrapyd 根本收不到这个 project。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 检查
scrapy.cfg是否有[deploy]段,且project = myproject和setup.py里setup(name="myproject")完全一致(大小写、下划线都算不同) - 部署时加
-v参数:scrapyd-client deploy -v,能看到实际上传的 egg 文件名和解析出的 project 名 - Scrapyd 默认只监听
127.0.0.1,远程部署要改scrapyd.conf的bind_address = 0.0.0.0,并确认防火墙放行 6800 端口 - 重启 Scrapyd 后旧任务不会自动恢复,
list_jobs.json返回空不等于没 bug,可能是进程崩了
怎么安全地批量启停、避免任务堆积
Scrapyd 自身不控制并发数,scheduler.json 连续发 100 次请求,它全塞进 pending 队列,后续爬虫可能因内存耗尽崩溃。而且没有“暂停全部”接口,只能单个 cancel。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 用
max_proc和max_proc_per_cpu在scrapyd.conf里硬限并发,例如max_proc = 3,比靠外部脚本轮询更可靠 - 启动前先查
list_jobs.json?status=running,running 数超阈值就拒发新任务 - 停止任务别只依赖 jobid:如果爬虫已退出但 jobid 还在 running 列表里,cancel 会失败;应加超时逻辑,比如 5 分钟没日志更新就强制标记为 dead
- 所有 API 调用必须带重试(最多 2 次)和超时(
timeout=10),Scrapyd 在高负载时经常 503 或卡住
Scrapyd 的 API 表面简单,但 project 名匹配、jobid 生命周期、并发控制这三处全是隐性依赖,稍不注意就会出现“看着在跑,其实没干活”或者“停不掉、删不了”的情况。


















