JIMMY
返回项目列表

Harbor

异步采集引擎
Pythonasyncio代理池断点续采

单机 64 协程 · 日采 12 万页 · 成功率 98.5%

harbor — crawl
 

背景与动机

一次学术文献调研需要把近万条页面元数据完整抓回来,现成爬虫框架要么配置繁琐要么一断全断。Harbor 的目标:断点可续、代理可控、失败可归因——把采集当成正经工程做,而不是一次性脚本。

内核是 asyncio 单进程事件循环:64 个协程 worker 消费任务队列,代理池独立成模块,供飞成功的勋章和被封禁的黑名单都落 SQLite。

架构与取舍

没用 Scrapy——它的中间件体系对 403 重试和代理轮换支持要写一堆插件,不如自己一百行讲得清楚。请求调度用信号量限速,指数退避重试三次,三次之后任务进死信表,人工归因。

存储选 SQLite 而不是上数据库服务:单机写入 1,200 行/秒绰绰有余,WAL 模式下读写互不阻塞,备份就是一个文件拷贝。

难点与解决

反爬是最难缠的部分。Harbor 的策略分三层:请求指纹随机化(头序、间隔抖动)、代理池健康度评分自动淘汰、域名级并发上限防止单站打满。被 403 连续拒绝三次的代理自动退役,新代理热插拔进池。

断点续采靠任务表的状态机:pending / running / done / dead,进程崩了重启,running 任务自动重置回 pending 队头。

数据与结果

单机日采 12 万页,成功率 98.5%,全程只吃 130MB 内存。那批文献后来被清洗成结构化数据集,喂给了可视化管线——采集只是起点,数据能说话才是终点。