搜尋抓取

蜘蛛抓到了頁面却没带走連結:解析环节的常见断点

蜘蛛抓取不只看服務器是否返回 200,還取决于頁面里的連結能否被解析並進入队列。本文梳理連結未被识別、被识別却没被跟的常见原因,並给出關閉 JS 查看源碼、對比抓取與發現量、检查 rel 與 base 等排查方法,以及從全局導航到兜底 Sitemap 的修复顺序。

搜尋抓取

蜘蛛抓到了頁面却没带走連結:解析环节的常见断点

很多站点运营者盯着服務器日誌看狀態碼,却忽略了蜘蛛抓取流程里的一個關键环节:連結解析。蜘蛛把頁面抓回去之後,要從 HTML 里抽出可訪問的 URL,放進待抓队列。如果這一步没有抽到連結,後續的抓取、回訪、收錄都無從谈起。頁面能返回 200,不等于路径能繼續往下走。

解析环节發生了什么

一次完整的抓取大致是:發現入口、排入队列、發起請求、拿回响應、解析内容、再發現新連結。解析环节主要做两件事:识別頁面里的連結,以及判断這些連結是否值得繼續抓取。常见問题往往不是服務器拒绝,而是連結没有被识別出来,或者识別後又被過滤掉。

連結没有被识別的常见原因

  • 連結由脚本生成。導航、列表、相關推荐如果依赖客戶端 JS 渲染,蜘蛛拿到的原始 HTML 里可能没有這些地址。關键路径最好服務端輸出,或者至少保留一份静態連結兜底。
  • 可点击元素不是标准連結。用 div、span、button 加点击事件跳轉,蜘蛛不會把它当成連結。需要给可跳轉元素加上真實的 href。
  • href 為空或指向脚本。href 寫成 javascript:void(0)、只寫 #、依赖 onclick 的寫法,通常無法進入抓取队列。
  • rel 属性誤用。整站導航加了 nofollow,或者把内鏈批量标成 ugc、sponsored,相当于告诉蜘蛛不必跟。检查模板里是否被全局加上了這些值。
  • 相對路径、base 與编碼問题。相對地址寫错、base 标簽指向其他域、中文或空格未编碼,都可能让連結指向 404 或無效地址。連結最好用绝對路径,或确保相對規則稳定。

連結被识別但没被跟

還有一種情况:連結在 HTML 里,蜘蛛也看到了,但没有繼續抓。常见原因包括連結指向的頁面在 robots.txt 里被禁止、連結嵌套在需要交互才出現的组件里、分頁和加载更多依赖异步請求,以及同一頁面連結數量過多導致重要路径被稀释。解析环节不是孤立的,它和抓取队列的優先級、去重規則一起工作。

怎么排查解析断点

  1. 關閉 JS 查看頁面源代碼,確認核心導航和列表里是否有可点击的真實連結。
  2. 用抓取工具模拟蜘蛛,對比抓到的頁面數和從頁面里抽到的連結數。如果前者正常、後者很少,優先怀疑解析。
  3. 抽查日誌中回訪频繁的頁面,看它是否持續带来新 URL。長期只被抓取、不贡献新發現的頁面,往往在解析輸出上有問题。
  4. 核對模板中的 rel 属性、base 标簽和全局連結規則,確認没有批量屏蔽内鏈。

修复顺序與兜底

修复时先處理全局導航、面包屑和列表頁,這些位置决定蜘蛛能否走到深层頁面。然後處理詳情頁里的相關推荐、上下篇等辅助路径。對于确實依赖 JS 的模块,可以用服務端渲染、预渲染或静態連結兜底。Sitemap 可以作為补充渠道,但不要把全部發現压力都交给它;内鏈结构仍然是蜘蛛理解站点路径的主要依據。

頁面返回正常只是第一步,連結能被识別並進入队列,抓取路径才算真正打通。

最後,解析問题通常不會在服務器监控里报警。它表現為抓取量還行、新 URL 發現變慢,或者某些栏目長期没有新增抓取。定期做一次源碼連結体检,比事後猜测蜘蛛為什么不来更有效。