先说结论:搜尋蜘蛛只能顺着它看得见、够得着的連結走。如果入口頁本身需要登入、需要特定 Cookie,或者連結要点击按钮、提交表單才會出現,那么目标 URL 被發現的概率會明顯下降,有时甚至完全走不下去。
為什么藏起来的連結容易被漏掉
抓取程序拿到的通常是一份未经浏览器渲染、或只做有限渲染的 HTML。它會解析頁面里的 href、src 以及部分可识別的跳轉關系,但它不會替你登入、不會点按钮、不會填表單,也很少带着你的會員 Cookie 去訪問。凡是挡在這些動作後面的連結,對机器来说就等于不存在。
三種最常见的藏法,問题各不相同
1. 入口頁需要登入才能看到内容
如果入口頁對所有未登入訪客返回 302 跳轉到登入頁,或者干脆返回一個請先登入的空頁面,那么搜尋蜘蛛拿到的就是登入頁本身,里面没有目标連結可跟。這類情况在後台目錄、會員专区、内網映射頁上很常见。
2. 目标連結靠表單提交後才出現
表單預設是 POST 提交,搜尋蜘蛛不會主動提交。即便提交後服務端返回了含連結的结果頁,這個结果頁也没有一個稳定、可直接訪問的地址,自然無法充当發現入口。同理,需要搜尋框輸入關鍵詞才列出連結的頁面,也很难被稳定跟進。
3. 連結由点击事件動態插入
用 onclick 或事件监听在点击之後才插入連結的寫法,能不能被渲染取决于抓取端是否执行 JS、执行到什么程度,结果不稳定。對一個以稳定發現為主要目标的入口頁来说,不值得把成败押在這上面。
自查方法:用最笨的视角看你的入口頁
- 用 curl 或在關閉 JS 的浏览器里訪問入口頁,直接看 HTML 源碼里有没有 a href 形式指向目标 URL 的連結。
- 不带任何 Cookie 再訪問一次,確認没有跳轉到登入頁,也没有彈出驗證。
- 看服務器日誌里搜尋蜘蛛請求入口頁後的狀態碼:是 200 且带内容,還是 302、401、403。
- 如果入口頁是 JS 渲染的,检查渲染完成後的 DOM 里連結是否存在,同时留意渲染耗时是否偏長。
更稳妥的入口頁做法
- 把目标連結寫成标准超連結,href 直接指向最终地址,不要包装成需要点击才會生效的按钮。
- 入口頁對未登入訪客也返回完整 HTML,把權限控制放到目标 URL 那一层去做。
- 目标 URL 存在多個版本时,入口頁只给規范的那一個,让跳轉鏈尽量短。
- 入口頁保持稳定可訪問,不要频繁改路径、加驗證碼或做频率限制。
把入口頁当成一份给机器看的目錄,而不是给用戶用的交互界面,連結暴露得越直接越好。
如果必须保留登入或表單,怎么留別的路
- 把公開可訪問的頁面作為入口,用站内其它頁面、栏目頁的内鏈去带目标 URL。
- 通過 sitemap 或搜尋资源平台的提交入口,把目标 URL 單獨交出去,不依赖入口頁的頁面解析。
- 對需要地区或 UA 判断的站点,確認搜尋蜘蛛的請求不會被誤判拦截。
- Cookie 下發後如果要求回传才给内容,先测一遍不带 Cookie 的情况下能否正常拿到 HTML。
別忘了發現只是第一步
即便搜尋蜘蛛顺利發現了目标 URL,也只是走完了發現這一环。接下来能不能被抓取、能不能被收錄,還要看目标 URL 本身是否可訪問、内容是否足够、站点整体情况如何。發現做對了,只是把後面的路铺平,並不等于结果自動到手。