前言
企业内部常需要周期性抓取外部网页文档、资讯、公开资料,自动归档、同步至内部知识库。早期团队自研了一套批次爬虫框架,依赖大量中间数据表、状态缓存、配置监听,任务大多串行执行,链路冗长、维护成本极高。
为此我们重构了轻量化定时爬虫模块,基于 Golang 原生 cron 实现极简调度,剔除冗余数据库操作,支持多采集任务并行,统一兼容网页、PDF/Word/Excel 附件两类资源,内置增量去重、文件归档、邮件告警完整能力。本文从架构、业务流程、落地价值三方面分享整套设计思路。
一、整体调度架构设计
1. 统一服务入口
所有爬虫任务共用服务data-adapter-crawler-service-worker,新旧两套调度逻辑完全隔离。 新版爬虫启动流程极简:
- 服务启动后单独开启协程运行定时调度器,不阻塞主服务;
- 读取配置批量注册多站点采集任务;
- 内置任务互斥机制:上一轮任务未完成,到达定时时间直接跳过,避免重复抓取;
- 服务重启 / 下线时通过信号优雅关闭调度器,释放浏览器、数据库等资源。
2. 云原生配置托管
所有业务配置统一放在 K8s ConfigMap,无需改代码、重新打包即可调整规则:
- 定时规则:每个采集站点独立配置 cron 表达式,灵活自定义执行频次;
- 邮件通知:统一 SMTP 配置,抓取完成自动推送汇总、异常告警;
- 存储平台鉴权:内部知识库账号密钥,用于上传抓取后的文件。
3. 新旧爬虫核心对比
表格
| 对比维度 | 新版轻量化 Cron 爬虫 | 旧版自研批次爬虫 |
|---|---|---|
| 调度依赖 | 原生 cron,无中间任务表 | 大量任务缓存、状态数据表 |
| 执行效率 | 多站点任务并行执行 | 批次间串行,单批次最多 2 并发 |
| 维护难度 | 代码精简,故障链路短 | 层级复杂,配置变更需监听刷新缓存 |
| 部署成本 | 随服务自动启动,无额外程序 | 状态流转多,日志排查繁琐 |
二、标准化通用采集流程
外部站点资源分为两类,统一以页面 URL 作为唯一标识做增量过滤,全流程标准化处理:
- 纯网页内容(无下载附件)通过无头 Chrome 完整渲染页面,调用浏览器原生 API 导出 PDF,完整保留页面排版、图文内容。
- 附件资源(PDF/Word/Excel 下载链接)直接下载原始文件,保留原有格式,不做格式转换。
增量去重逻辑
- URL 作为每条资源唯一 ID;
- 对生成 / 下载的文件计算 MD5 哈希,判断内容是否更新;
- 三重判断:
- 从未抓取过:完整执行抓取、转存、入库流程;
- URL 存在但 MD5 变更:页面内容更新,重新归档;
- URL 与 MD5 均无变化:直接跳过,节约服务器资源。
完整业务链路
- 初始化日志、数据库、无头浏览器,统一标准化页面链接为 HTTPS;
- 解析站点列表页,提取全部待抓取条目;
- 逐条处理资源,生成对应文件并校验版本;
- 登录内部知识库上传文件,绑定文件唯一 ID;
- 将标题、发布时间、原文链接、文件 ID 等元数据存入数据库;
- 统计抓取指标,任务结束自动发送邮件通知对接人。
三、方案核心优势
- 架构轻量化,无过度设计摒弃重型分布式爬虫框架的复杂调度、中间存储,仅依靠原生定时能力完成需求,代码量大幅缩减,新人上手快,线上故障定位简单。
- 高复用通用采集逻辑网页转 PDF、附件下载、MD5 去重、文件上传、邮件通知全部封装为公共能力,新增采集站点仅需编写页面解析逻辑,无需重复开发基础工具。
- 工程化配套能力齐全原生适配 K8s 云原生部署,支持动态修改定时、通知、存储配置;自带任务互斥、优雅退出、增量更新、异常通知,满足企业长期稳定运行要求。
- 多任务并行提升效率不同站点抓取任务独立运行、互不阻塞,对比旧框架串行执行模式,大幅缩短整体采集耗时。
四、适用场景与优化方向
适用场景
这套轻量化爬虫适合企业中小型周期性采集需求:
- 行业资讯、公开政策文档每日自动归档;
- 白皮书、公开报表、竞品资料定期抓取留存;
- 外部公开数据、榜单定时同步至内部知识库。
后续可优化方向
- 增加抓取失败自动重试、网络异常退避策略;
- 接入代理 IP 池,解决站点反爬封禁问题;
- 增加随机 UA、页面延时加载,降低拦截概率;
- 接入监控大盘,上报抓取总量、失败率、运行时长等指标;
- 区分成功 / 失败邮件通知,异常单独推送运维人员。
五、选型总结
对于中小规模内部定时采集场景,重型分布式爬虫框架存在资源浪费、运维复杂的问题;简单一次性脚本又无法满足长期稳定运行、增量更新、告警归档等工程化要求。
基于 Go 原生 cron 的轻量化爬虫方案刚好平衡两者:轻量无冗余、稳定性强、复用性高,业务开发仅聚焦页面解析,是企业内部文档、资讯周期性抓取的最优落地方案。