01 / 背景
客户要做竞品站,需要把对方 3000 页内容扒下来。
2022 年有个客户找我:他看好一个国外的评测站,想做一个中文版,内容结构一样但产品换国产。 他需要把那个站3000 多页内容全部扒下来,翻译后排进 WordPress。 市面上的采集工具(八爪鱼、后羿采集器)能抓列表,但抓不出结构化字段, 图片还是外链的,URL 是乱的。
我花了一周写了个 Python 脚本,用 Playwright 渲染动态页面,自定义解析器提取标题、 正文、图片、评分、价格,输出成 JSON。客户拿到后直接导进 WordPress, 3000 页内容两天上线。这个脚本就是 Gather 的原型。
02 / 架构
四层管道,每一层可独立替换。
-
01
抓取层 · Playwright 渲染
用 Playwright 启动无头浏览器,等页面动态内容加载完再抓。 支持 SPA(React/Vue 站点)、延迟加载图片、登录后内容。 自带请求拦截,过滤广告和分析脚本,提速 3 倍。
-
02
解析层 · 自定义选择器
每个站点配一份 YAML 规则文件,定义标题、正文、图片、元数据的 CSS/XPath 选择器。 支持正则提取、字段拼接、HTML 清洗。规则文件可复用、可版本管理。
-
03
资产层 · 图片本地化
下载所有图片,压缩转 WebP,上传到本地或 OSS。自动重写 HTML 中的图片 URL 指向本地。支持图片去重(MD5)、懒加载标记、alt 文本生成。
-
04
导出层 · 多格式输出
支持 WXR(WordPress 标准导入格式)、JSON、CSV、Markdown。 URL 自动重写(保留目录结构或按规则映射)。分类和标签自动归类。
03 / 过程
反爬是最耗时间的部分。
采集最大的敌人不是技术,是反爬。Cloudflare 的 JS Challenge 挡掉 80% 的 简单爬虫。Gather 用 Playwright 真实浏览器渲染,能过 Cloudflare 基础防护; 遇到 Turnstile 验证码就接入 2Captcha API 自动解码;遇到 IP 封禁就走代理池轮换。
最难的一个case 是个日本电商站,每个商品页有 47 个 AJAX 请求才能加载完价格和库存。 我写了请求依赖图,分析出哪几个请求是关键数据,只等这几个完成就抓,其余的拦截掉。 最终把单页抓取时间从 12 秒压到 3 秒。
"采集这活,合规比技术重要。我接采集单之前先问客户:源站是不是你自己的、 或者有没有授权。扒别人的站来赚钱,我不接。Gather 主要用于内容迁移、 竞品分析、数据聚合这些合规场景。"
04 / 结果
120+ 站点采集,平均 2000 页/站。
120+
已采集站点
2k
平均页数/站
3s
平均单页抓取
采集的站点类型包括:电商商品页(45%)、资讯博客(30%)、企业官网(15%)、论坛帖子(10%)。 最大单站采集量是 18000 页(一个中文论坛全量归档),跑了 14 小时完成。
05 / 技术栈