很多人把蜘蛛池入口页的工作理解成“把 URL 丢进去等蜘蛛来”,但观察服务器日志会发现,入口页从被蜘蛛发现到真正被抓完,中间有一段并不短的链路。这段链路里任何一环出问题,入口页看起来还在运行,实际却没有起到引路作用。这篇文章只讲首次抓取这一段。
首次抓取和持续抓取是两件事
首次抓取指的是蜘蛛第一次拿到你的 URL、发起请求、收到响应并决定要不要留下记录。持续抓取则是之后基于内链、sitemap、更新信号形成的回访。两者的失败原因并不相同:首次抓取更多卡在“发现”和“可达”,持续抓取更多卡在“值不值得再来”。入口页数量再多,如果首次抓取阶段就断掉,后面的事情无从谈起。
被发现有几种常见路径
- 外部链接:其他站点上指向入口页的链接,是最传统也最慢的一种;
- sitemap 与主动推送:适合数量可控、更新频繁的入口页,提交不等于抓取,但能缩短发现时间;
- 站内互链:入口页之间互相链接,蜘蛛从已抓过的页面顺着链接走到新页面;
- 入口聚合:聚合页、列表页把新入口页暴露在蜘蛛面前。
这几种路径不是互斥的,实际中往往叠加使用。需要注意的是,站内互链如果全是同一批模板、同一批 IP,蜘蛛顺着走一遍之后很容易停止继续扩展。
从发现到爬完,中间要过几道关
- DNS 解析:解析不稳定或 TTL 太短,蜘蛛的第一次请求可能直接失败;
- 连接与响应:超时、连接重置、首字节时间过长,都会让蜘蛛提前放弃;
- 状态码:403、429、5xx 会让这次抓取被判为无效,也可能影响后续访问频率;
- robots 与 meta 指令:被误拦的页面,蜘蛛看到了 URL 也不会取内容;
- 内容可读性:正文靠 JS 渲染、主要内容放在 iframe 里,蜘蛛拿到的可能只有空壳。
这几关里最容易被忽略的是第二关。很多人只盯状态码,日志里 200 一片,但响应时间长期在两三秒以上,蜘蛛实际取到的内容可能不完整,或者在超时重试几次之后就不来了。
首次抓取通常很浅
即使一切正常,首次抓取一般也不会把入口页的所有链接全部爬完。常见表现是:日志里只有少量请求、只抓了首页或列表页、目标 URL 一次都没被访问。这不一定是入口页有问题,更常见的原因是蜘蛛还在评估这个站点,抓取深度和频率都被压着。
这时候急着加页面、加链接,收益往往很小。更值得做的是保证已抓过的页面能正常返回、能顺着链接走到下一层,让这次浅抓变成长一点的第一步。
让首次抓取更容易完成的一些做法
- 入口页首屏内容用服务端直接输出,少依赖异步加载;
- 目标链接放在 HTML 里,而不是等 JS 执行后再插入;
- 保持解析稳定,避免频繁更换 IP 或解析记录;
- 控制单页链接数量,避免把大量出口挤在同一页;
- 对明知会失败的 URL 做处理,别让蜘蛛反复撞上 404 或 5xx。
首次抓取的成功率更多取决于“可达性”,而不是内容有多丰富。先把路修通,再谈页面质量。
首次抓取之后看什么
首次抓取完成后,判断入口页有没有起作用,可以看几个信号:日志里是否出现对目标 URL 的请求、请求是否来自同一个蜘蛛、后续几天是否还有回访。如果只有入口页被抓、目标 URL 始终没有动静,问题通常出在链接层级、链接形式或跳转方式上,而不是蜘蛛没来。
如果连入口页本身都只有一次请求,就要回头检查响应速度、状态码和解析稳定性。把这些基础项固定下来,再谈批量扩展入口页,顺序会顺很多。