要写出一套稳定、好用的采集规则,核心不是记住某个工具的按钮,而是掌握一套从页面分析、参数配置、选择器编写到数据清洗的完整流程。无论你用的是现成爬虫软件还是自己写脚本,思路都相通:先搞清楚页面怎么组织数据,再决定怎么提取、怎么翻页,最后把抓回来的脏数据整理成能直接用的样子。
任何采集规则的第一步都应该是打开浏览器的开发者工具,认真看一眼页面的 DOM 结构。你要找的不只是某个字段的标签,而是整条数据块重复出现的规律。比如,一个商品列表页,每个商品都是一个 <div class="product-item">,那么你的容器选择器就锁定这个 class,再在这个容器内部去定位标题、价格、链接等子字段。
判断一条选择器是否合格,有个简单的检查办法:如果它匹配到了多个不相关的元素,说明路径太宽泛;如果一条都匹配不到,那大概率是页面采用了 AJAX 异步加载,数据并不在初始 HTML 里,这时候就需要考虑使用渲染工具或直接抓取背后的接口。另外,建议多翻几页看看,确认不同页面下结构是否有变化,有些站点列表页和详情页的结构完全不同,需要分别处理。
参数配置直接决定采集的覆盖率和成功率,最需要花心思的是下面三个部分。
翻页逻辑:如果分页 URL 呈现规律性变化,比如 ?page=2、?page=3,直接做一个递增变量是最简单可靠的。但如果分页依赖点击“加载更多”按钮,或者页面是无限滚动的,就得通过模拟滚动或直接调用分页接口来实现,这时的规则复杂度会明显上升。一个实用经验:优先找页面底部的“下一页”链接,或者查看网络请求里返回 JSON 的翻页接口,往往比模拟点击更稳定。
请求头与延迟:带着浏览器常见的 User-Agent 和 Referer 访问,能减少被基础防护拦截的概率。同时,每次请求之间设置 2 至 5 秒的随机延迟,既是对目标网站的礼貌,也是避免触发频率检测的必要手段。
字段预定义:在真正开始抓取前,想清楚每个字段的提取方式。比如时间字段,原始值是“2024-03-15 10:30:00”,而你只需要日期,那就在规则里直接做截取或正则匹配,后续清洗会轻松很多。
选择器的编写建议采用“先整体后局部”的策略,具体操作可以按以下步骤来:
一个比较容易踩坑的地方是:不要过度依赖全局唯一的 class 名。有些站点的页面结构混乱,同一个 class 在不同页面代表不同类型的内容。遇到这种情况,优先使用容器内的相对选择器,比如 ./h3/a,比写一长串绝对路径要稳妥得多。
采集完成只是第一步,原始数据里通常混着大量换行符、空格和多余的 HTML 标签,清洗这一步直接决定数据能不能用。
先确认数据是否真的在初始 HTML 中。打开浏览器开发者工具的网络面板,刷新页面后查找返回 JSON 或 XHR 类型的请求。如果数据是由接口返回的,优先直接调用该接口地址,这通常比模拟浏览器渲染更快也更稳定。只有接口加密或签名复杂时,才考虑启用渲染引擎来执行 JavaScript。
如果页面没有规律的 URL 参数,可以观察“下一页”按钮对应的链接或触发的事件。在浏览器里点击翻页,同时观察 Network 面板发出的新请求,找到返回数据的那条接口。很多站点的翻页本质上是 POST 请求,携带页码或游标参数,直接构造这些参数即可实现循环翻页。如果实在找不到接口,录制鼠标点击动作也是一个可行的替代方案。
漏字段最常见的原因是页面结构在不同页面间存在细微差异,比如某些列表项缺少价格标签,或者不同分类的页面 DOM 结构不一致。建议在编写规则时,不要将所有页面都放进同一个选择器里,先按页面类型分组,再分别定义解析逻辑。同时,将所有字段都设为可空,在写入前增加缺省值填充逻辑,这样即使个别字段丢失,也不会导致整条数据流中断。
一套高质量的采集规则,从来不是一次写成的。你可以先花 10 分钟在开发者工具里把页面结构摸清,再花 20 分钟完成选择器编写和单页测试,最后添加分页、延迟和清洗逻辑。如果中途发现选择器匹配异常,优先回到页面源码里核实结构变化,而不是盲目调整正则表达式。把这套流程固化下来,每次面对新的采集目标,你都能快速产出可复用、易维护的规则。