搜索抓取

列表页与分页链接:蜘蛛顺着哪条路走到详情页

蜘蛛发现详情页,多数不是从首页直点,而是沿列表页和分页一层层走过去的。本文从源码可见性、分页 URL 写法、详情链接分布、翻页边界与断链排查几个角度,说明怎样让蜘蛛顺着 a 标签一路走到详情页,并把抓取次数花在真正有内容的 URL 上。

搜索抓取

列表页与分页链接:蜘蛛顺着哪条路走到详情页

蜘蛛进入一个内容站,大部分详情页并不是从首页直接点进去的,而是沿着列表页、分页、标签页一层层走过去的。列表页的作用不是展示,而是给蜘蛛提供可走的路径:路径清楚,URL 发现就顺;路径混乱,蜘蛛要么翻不到深处,要么在分页里绕圈。

蜘蛛在列表页上实际看到什么

它不点鼠标,只读 HTML 里的链接。判断标准很简单:把列表页的源码打开,搜详情页的 URL,看它是否存在于可点击的 a 标签里。

  • 数字分页:页号是 a 标签时,蜘蛛能逐页往下翻,这是最容易被跟进的形态。
  • 下一页按钮:写成 a 标签通常会被跟进;用 button 加脚本事件触发跳转的,多数抓取场景看不到目标 URL。
  • 无限滚动:内容随滚动由脚本追加,不执行脚本的抓取只拿到第一屏的链接。
  • 加载更多:同样取决于它背后有没有一个真实存在的分页 URL 作为兜底入口。

分页 URL 的两种写法

常见的是路径式 /list/2/ 和参数式 /list?page=2。路径式层级清晰,日志里也容易判断蜘蛛抓到了第几页;参数式同样能被抓,但有两处容易出问题:一是参数顺序、大小写、多余跟踪参数造成同一页对应多个 URL;二是第 2 页的 canonical 被误指回第 1 页,等于告诉蜘蛛后面的页不必单独存在,页内的详情链接也可能被连带忽略。

详情链接该铺在第几页

不要全部堆在第一页

第一页塞进几百条详情链接,单次抓取能处理的有效链接有限,页面体积还大,反而拖慢对后面链接的发现。

也不要让深页只能靠下一页到达

如果列表只输出一个下一页按钮,第 10 页就要走 10 跳,抓取深度和稳定性都受影响。比较稳的组合是:数字分页露出前若干页号,配合上一页、下一页,让深处页面有较短的入口。

分页要有明确边界

空结果翻页、可以无限翻下去的日期归档,都会持续产生高度相似的 URL,把抓取次数耗在低价值页面上。可行做法:超过一定页数后改为按年月归档的固定入口,在列表尾部停止输出新的下一页链接;翻到末尾时返回明确的空列表状态,而不是永远给出一条还有内容的下一页。

分页路径断没断,按这个顺序查

  1. 日志里看蜘蛛是否访问过第 2、3 页,还是长期只抓第 1 页。
  2. 看分页链接是不是由脚本生成,或被 nofollow、被 robots.txt 屏蔽。
  3. 检查第 2 页及之后的 canonical 是否错误地指回第 1 页。
  4. 检查参数顺序、大小写、跟踪参数是否制造了重复的分页 URL。
  5. 检查服务器在蜘蛛连续翻页时是否出现 5xx 或超时。

列表页本身要扛得住

列表页是枢纽,它响应慢或偶尔报错,蜘蛛翻到一半就停,后面的详情页这一轮就抓不到。列表页尽量轻:少用大图,少依赖接口渲染,把链接直接写在 HTML 里,并保证同一批 URL 返回稳定。

外部引导要建立在站内路径之上

有些站点会借助蜘蛛池或其他外部入口加快 URL 发现。这类手段解决的是第一次被看到,解决不了站内路径的问题。如果外部引导把蜘蛛带到列表页,而列表页的分页链接是脚本生成的,抓取到这里仍然会断。先确认站内从列表到详情的路径是通的,再考虑外部引导是否值得投入。

一个简单的检验:从首页出发,只用 HTML 里的 a 标签,能不能在可控的跳数内走到列表深处的详情页。走得到,分页设计基本合格;走不到,先改路径,再谈其他。