搜索抓取

抓取路径还原:用日志里的 Referer 看蜘蛛怎么走到这一页

蜘蛛抓取不是一堆孤立的 URL,而是一条条有先后顺序的路径。服务器日志里的 Referer 字段,记录的正是蜘蛛在抓这一页之前待在哪一页。本文讲怎么把蜘蛛请求筛出来、按 Referer 分组,找出断头路、孤儿页和环路,再通过内链和重定向把断掉的路接回去。

搜索抓取

抓取路径还原:用日志里的 Referer 看蜘蛛怎么走到这一页

大多数站长看服务器日志,只关心两件事:状态码是不是 200,抓取次数有没有涨。其实每一条蜘蛛请求里还藏着一个字段——Referer,它记录的是“蜘蛛在抓这一页之前,待在哪一页”。把它按时间顺序排开,你看到的就不再是一堆孤立的 URL,而是一条条抓取路径。

Referer 记的是上一步,不是来源网站

对普通浏览器请求,Referer 表示用户从哪个页面点过来的。对蜘蛛请求,含义类似:通常是它发现这个链接的那个页面。所以要分清两种情况:Referer 为空,往往说明这一页是通过 Sitemap、外链或者历史记录直接进来的;Referer 是站内某个列表页,说明它是顺着内链一步步走过来的。这两种进入方式,后续的抓取深度完全不一样。

三步把路径大致还原出来

第一步:把蜘蛛请求单独筛出来

按 User-Agent 或者按已知的蜘蛛 IP 段过滤,得到一个只包含蜘蛛的访问列表。建议把图片、CSS、JS 这类静态资源请求也保留下来,它们虽然不是页面,但能反映蜘蛛在抓某一页时顺手取走了多少东西,对判断页面复杂度有帮助。

第二步:按 Referer 分组

把站内 Referer 相同的请求归到一组,通常会看到明显的“扇出”结构:一条列表页下面挂着一批详情页。这时可以观察每个页面的入链来源数量——来源多,说明路径宽、被发现的概率高;只有一条甚至没有,说明内链太单薄,一旦那条路断了,页面就再也没人走。

第三步:找三类异常

  • 断头路:蜘蛛走进某页后,页面里没有可继续跟随的站内链接,抓完就离开了。
  • 孤儿页:日志里几乎不出现,或者只通过 Sitemap 被访问过一两次。
  • 环路:A 只链向 B,B 又只链回 A,蜘蛛在里面来回打转,浪费抓取次数。

三种常见的进入方式

  • 逐层递进:首页 → 栏目 → 列表 → 详情。这是最理想的路径,但要注意层级别太深,跳数一多,后面的页面被访问的间隔就会拉长。
  • Sitemap 直接投递:路径最短,缺点是看不到内链结构的反馈,页面之间也建立不起关联。
  • 外链或历史地址直入:老站改版后很常见,蜘蛛还拿着几年前的 URL 来敲门,结果撞上 404 或者一连串跳转。

路径断了,多半是这几个原因

改版时把入口链接删掉了;列表页改成异步加载,链接只存在于脚本里;分页用了按钮而不是可点击的链接;页面被加上 nofollow 之后,原本的内链也顺手清空了。这些改动的共同点是:页面本身还在,200 也照常返回,但通往它的那条路没了。

把路接回来:几个小动作

给重要页面补一条从首页出发、最多两三次跳转就能到达的路径;列表和分页尽量保留普通的 a 标签;已经下线的页面用 301 指向内容最接近的替代页,而不是直接丢一个 404;Sitemap 继续维护,但不要把它当成唯一入口,内链才是蜘蛛日常走的那条主路。改动之后,隔一两周再从日志里拉一份路径图对比,比反复猜测“蜘蛛为什么没来”要实在得多。

抓取路径不是设置一次就固定的东西,它会随着内容更新、栏目调整、模板改版不断变化。定期看一眼 Referer 分布,是成本很低的一种体检方式。