做蜘蛛池时,最让人困惑的不是蜘蛛不来,而是日誌里明明有訪問记錄,目标 URL 却迟迟没有被抓取。這種情况可以叫無效抓取:蜘蛛确實進了入口頁,但没有沿着頁面上的連結繼續走。它不一定是池子坏了,更多时候是入口頁、鏈路或蜘蛛自身策略中的某一环出了問题。
先明确無效抓取的判断依據
不要只看入口頁的訪問次數。把日誌里同一 IP 或同一 UA 的訪問序列拉出来,看它是否請求了入口頁,是否請求了頁面里的静態资源,是否出現了後續目标頁請求。如果只有入口頁的 200,没有资源請求,也没有跳轉或連結点击,基本可以归入無效抓取。把這類记錄單獨标出来,比笼统看總抓取量更有用。
常见原因
連結對蜘蛛不可见
入口頁大量使用 JS 渲染、連結放在折叠区域、用按钮代替 a 标簽,或者連結被 CSS 隐藏,都可能導致蜘蛛看到的是空頁面。蜘蛛抓取的是 HTML 源碼,不是浏览器渲染後的结果,這一点在排查时经常被忽略。
响應與狀態碼不合适
入口頁返回 302 跳轉到目标頁,但目标頁又跳回入口頁;或者入口頁返回 200 但内容是驗證碼、空模板、错誤提示;又或者服務器對蜘蛛 IP 返回 403、429。蜘蛛拿到這些响應後,往往不會繼續跟連結。
抓取预算與深度限制
搜尋引擎對每個站点的抓取是有预算的。如果入口頁里塞了几千條連結,蜘蛛可能只挑其中一小部分,剩下的連結即使存在也不會被立即抓取。入口頁連結數量過多、目标頁质量參差,都會让無效抓取的比例升高。
指令與規則拦截
robots.txt 里的 Disallow、頁面 meta 里的 nofollow、連結上的 rel=nofollow,都會明确告诉蜘蛛不要跟。還有一種情况是 robots.txt 本身返回 5xx,蜘蛛可能暂时停止抓取整個目錄。
排查顺序
- 用文本浏览器或查看源碼,確認入口頁的連結在 HTML 里真實存在,而不是渲染後才出現。
- 模拟蜘蛛 UA 請求入口頁,检查返回狀態碼、响應体長度和内容是否正常。
- 检查 robots.txt 是否可訪問、是否誤拦了入口頁或目标頁路径。
- 查看頁面里的連結是否带 nofollow、是否用了 JS 跳轉或 meta 刷新。
- 從日誌中確認蜘蛛是否請求過静態资源,判断它是只抓了入口頁還是完整加载。
- 控制入口頁連結數量,把重点目标放在更靠前、更顯眼的位置。
調整建议
- 入口頁尽量稳定返回 200,正文里用普通的 a 标簽輸出目标連結。
- 一次入口頁上的連結不要過多,優先放目前最需要發現的目标頁。
- 不要用 302、JS 跳轉和 meta 刷新层层套娃,蜘蛛跟不了几跳就會放弃。
- 用日誌观察調整後的變化,關注目标頁是否開始出現請求,而不是只看入口頁訪問量。
- 如果多個入口頁共用同一套模板和連結,先改一個做對照,確認有效再铺開。
無效抓取不是單一故障,更像一個信号。它提醒你去看入口頁是否對蜘蛛友好、連結是否真實可跟、抓取预算是否被浪費。
把無效抓取的比例降下来,蜘蛛池的利用率才會提高。與其反复增加入口頁數量,不如先把現有入口頁的連結可见性、响應狀態和連結數量控制好,让每一次蜘蛛訪問都更有可能走到目标頁。