做站内结构的时候,很多人會把“頁面上有多少入口”和“蜘蛛能走多少條路”当成一回事。實际跑一遍抓取日誌就會發現,两者差距常常不小:導航里明明有二十個連結,蜘蛛只走了十二個;列表頁上有翻頁按钮,它一次都没点。問题多數不出在结构设計上,而是出在連結的寫法上。
蜘蛛判断“能不能走”,基本只看 href
對绝大多數搜尋引擎蜘蛛来说,一條連結是否可抓取,最核心的判断依據是頁面的 HTML 里有没有一個带有效 href 的 a 标簽。它在解析阶段拿到的是一份 HTML,不是渲染之後、也不是用戶点击之後的 DOM。所以凡是需要“点一下才生效”的東西,對蜘蛛来说都可能不存在。
href 里的地址也要是蜘蛛能直接請求的形式。寫成 href="javascript:void(0)"、href="#"、href="" 這類,等于告诉蜘蛛這里没有目标地址。後面挂一個 onclick 或者 data-href,浏览器會跳,蜘蛛不會。
四種常见的“人点得動、蜘蛛走不了”
1. 用 JS 做跳轉
onclick="location.href=..." 或者给 div 绑一個点击事件,是最常见的寫法。用戶点击没問题,但 HTML 里没有可抓取的地址。如果這類跳轉遍布列表頁和分類頁,站内很大一块 URL 就只能靠外鏈或 Sitemap 被發現,抓取频次通常也會明顯偏低。
2. 按钮和伪連結
把導航做成 button,或者用 div 加 role="link" 模拟連結,样式上更自由。如果里面的 a 标簽 href 還在,問题不大;一旦為了样式方便把 a 換成 div,可抓取性就丢了。判断标准很简單:源碼里有没有那個 a 和 href。
3. 渲染後才生成的連結
前端框架的項目里,列表項的 href 常常是客戶端渲染後才挂上去的。能不能被抓到,取决于搜尋引擎是否對该頁面做了渲染、渲染後的内容是否進入索引流程。這中間有延迟,也有不确定性,不适合当成稳定的 URL 發現通道。對重要的分類頁、詳情入口,尽量让連結出現在初始 HTML 里。
4. 被主動挡掉的連結
rel="nofollow"、rel="ugc"、rel="sponsored",在 robots.txt 里屏蔽掉的目錄,以及頁面里被 meta robots nofollow 覆盖的区域,都會让蜘蛛即使看到 href 也選擇不走。這類“挡”很多时候是歷史遗留:早期為了防止權重流失,给评论区、篩選区都加了 nofollow,後来结构改了却没清理,结果把本该被發現的一批 URL 也一起挡住了。
锚文本和位置,影响它“愿不愿意走”
能走和愿意走是两件事。蜘蛛在决定一條 URL 的抓取優先級时,會參考連結所在的位置、锚文本的信息量,以及這個連結在全站的分布情况。
- 位置:全站導航、面包屑、正文首屏的連結,通常比頁脚一大片、侧栏推荐位更容易被優先處理。
- 锚文本:寫着“点击這里”“更多”的連結信息量低;寫清目标主题的锚文本,既帮助蜘蛛理解目标頁,也帮助它判断這個 URL 值不值得抓。
- 重复度:同一個 URL 在頁面里出現十几次、每次锚文本都不一样,不會让蜘蛛多抓几遍,反而可能拉低整頁的連結信噪比。
- 上游頁面本身的抓取情况:一條連結放在很少被抓的深层頁上,即使寫法完全标准,也可能長期排在待抓队列後面。頁面收錄少,有时不是連結寫法的問题,而是入口頁本身就被抓得少。
怎么自查
- 關掉 JavaScript,直接查看頁面源碼,看關键入口是否還在。還在的連結,基本都能被抓到。
- 用抓取工具跑一遍站内核心路径,對比“頁面上的連結數”和“實际能跟到的 URL 數”,差在哪一栏,通常問题就在哪一栏。
- 對照抓取日誌,看蜘蛛是否訪問過某個入口的目标頁。如果整块目錄几乎没有蜘蛛訪問记錄,先查该目錄上游連結的寫法,而不是急着單獨提交 URL。
- 检查 robots.txt 和頁面級 nofollow 的歷史配置,把已经不再需要的屏蔽規則清理掉。
連結可抓取性是 URL 發現的地基。地基上少一個入口,後面补多少條外鏈和 Sitemap 都只能算补救。
處理顺序上的建议
不用一次把全站翻新。優先處理三類:一是全站導航和面包屑這類主路径上的連結,二是分類頁、列表頁里指向詳情頁的連結,三是新栏目上线时新铺的入口。這三類寫法标准了,站内大部分 URL 的發現通道就通了。其余部分,比如頁脚、侧栏、活動位,可以按抓取日誌的實际表現慢慢調,没必要為了“看起来干净”大動干戈。