抓取线索的来源比“連結”两個字更宽
很多人检查内鏈结构时只盯着 a 标簽,觉得頁面上没有可点的連結,蜘蛛就没有路可走。實际抓取时,蜘蛛解析 HTML 的過程中會遇到一批带 URL 的字段,它們不一定可点击,但同样可能被记錄下来,進入後續的抓取队列。理解這一点,能解释一些看起来奇怪的現象:某個頁面谁也没鏈過,服務器日誌里却出現了它的抓取记錄。
除了 a 标簽,還有哪些位置带着 URL
iframe 與 frame 的 src
内嵌框架的地址是一串完整的 URL。如果 iframe 指向站内某個頁面,這條地址有較大概率被讀走,成為一條獨立线索。反過来,第三方 iframe(广告位、客服组件、統計插件)指向的外部地址也會被解析,只是跟不跟、抓不抓是另一回事。不少站点日誌里出現的陌生路径,追根溯源就是這個位置漏出去的。
form 的 action
搜尋框、篩選表單、订阅组件的提交地址,通常寫在 action 属性里。蜘蛛一般不會真的去提交表單,但 action 里的地址仍是一串可解析的 URL,尤其是当它自带一串查询參數时,容易被当成可訪問頁面。
canonical 與 hreflang
rel 為 canonical 的 href 是一條明确的 URL 声明,蜘蛛會讀,也可能顺着去確認两個地址的關系。hreflang 的 href 同理,多語言站点里,它會把一批本不打算重点抓的版本一並带出来。這些地址如果指向 404 或者參與重定向鏈,等于给自己制造額外的抓取负担。
结构化資料與脚本里的字符串
JSON-LD 中的 url、@id、sameAs 等字段,往往直接寫在 HTML 里,讀取成本很低。除此之外,首屏脚本里的路径字符串也可能被解析到,但這取决于渲染是否完整——渲染不充分时,這部分线索等于没寫。
资源類地址
img 的 src、video 的 poster、link 标簽指向的地址,主要作為资源被請求,一般不會單獨当成頁面抓取。但如果這類地址指向的其實是 HTML 頁面,性质就變了。
這類线索和 a 标簽的差別
- 上下文缺失。没有锚文本,蜘蛛拿不到“這個頁面讲什么”的提示,判断價值时缺少依據。
- 可信度不同。a 标簽是被明确推荐的入口;canonical 是归一化声明,不是推荐,不能混為一谈。
- 触發條件不同。寫在脚本里的地址要等渲染,寫在属性里的地址解析时就能拿到。
- 數量容易失控。一個篩選表單、一個广告位,可能带出成百上千條带參數的地址。
實际运营中怎么處理
- 该被發現的入口,用 a 标簽明寫在 HTML 里,不要只挂在点击事件上。
- canonical、hreflang 指向的地址要真實可用,別寫成 404,也別接進重定向鏈。
- 第三方 iframe 和外鏈资源尽量收敛,用不到的就別放。
- 參數類地址(排序、篩選、追踪碼)用 robots 規則或規范化處理,避免被当成獨立頁面反复抓。
- 定期翻服務器日誌,確認抓取量集中在哪些 URL 形態上,偏差往往從這里看出来。
蜘蛛愿意讀一條 URL,和它愿意把這條 URL 当成重要入口,是两件事。前者是解析,後者才涉及抓取優先級的分配。
几個常见誤区
第一個誤区,是以為藏起来的連結蜘蛛一定看不到。只要地址出現在 HTML 或渲染後的 DOM 里,就有被讀到的可能。第二個誤区,是以為所有被讀到的地址都會被大量抓取。單次抓取的額度有限,非 a 标簽的线索通常排在後面。第三個誤区,是把 canonical 当成必须执行的指令——它更像一種建议,蜘蛛會參考,但不保證照做。
归根结底,URL 线索的入口比大多數站点负责人以為的要多。與其事後排查“這條地址是怎么進来的”,不如在寫頁面时就先决定好:哪些地址该被看见,哪些该留在外面。