在網站运营中,搜尋蜘蛛能否顺利發現新頁面,决定了内容能否尽快進入索引。很多站点在重新设計或開發时,會采用單頁應用(SPA)的hash路由,比如把連結寫成 https://example.com/#/news/123 的形式。這種寫法對用戶也许能正常跳轉,但搜尋蜘蛛在抓取URL时往往只把#之前的部分视為有效地址,#之後的内容不會作為獨立URL請求。于是,真正的頁面内容就成了“看不见的角落”,抓取路径被重新定向到一個入口頁面上,後續的連結和價值流動也會受阻。
hash片段是URL的一部分吗?
根據HTTP协议,片段标识符(即#)後面的一切内容,都不會被發送到服務器。這意味着服務器收到的請求只有 https://example.com/ 的路径,至于 #/news/123,只是浏览器内部使用的參數。搜尋引擎蜘蛛無论是直接請求,還是從内鏈中提取地址,通常都會截断#後的部分。所以,如果站内所有實质頁面的URL都建立在hash之上,那么蜘蛛能提取到的只有那一個入口URL,而無法形成多個獨立頁面。
對抓取路径的影响
当蜘蛛無法识別獨立URL时,整個站点的連結结构就退化成一层:所有“頁面”都依赖入口頁的脚本来展示。如果蜘蛛不执行JavaScript,它就得不到任何子連結,更谈不上URL發現。即便有些蜘蛛具备一定的渲染能力,它們也倾向把带hash的連結视為同一頁面内的锚点,不會当作新的抓取目标。于是,站点里哪怕有几千篇内容,對蜘蛛来说可能只是一張白纸。
典型表現
- 所有内容都寫在同一個html文档里,用hash切換顯示;
- 内鏈中的URL形如 /#/category/product,其中關键字不是獨立路径;
- 通過服務器日誌發現,蜘蛛只請求了首頁或少量路由,其余頁面從未被抓取。
让URL恢复可發現性
根治的办法是让每個内容拥有真實、獨立的URL。如果是传统多頁站,直接去掉hash路由,改為形如 /news/123 的静態路径。如果是單頁應用,建议使用History API(HTML5的 pushState 和 replaceState),這样浏览器地址栏會顯示标准路径,但需要注意:服務器必须對用戶訪問的路径返回正确的頁面,至少對蜘蛛請求要返回预渲染的HTML。否則蜘蛛依然只能拿到空的Shell,種子頁面里可能没有任何指向具体内容的連結。
落地清單
- 放弃hash控制业務视图,僅將hash用于頁面内定位,例如 #comments、#tab1,不要让它承载内容狀態。
- 每個内容都應有一個可獨立訪問的URL,並确保该URL直接返回對應内容,而不是跳回首頁。
- 用普通标簽构建站内鏈,並避免使用 onclick 跳轉。让連結的 href 指向真實地址,蜘蛛才能顺着抓取。
- 在Sitemap中列出規范URL,使用不受hash影响的地址。
- 為SPA增加服務端渲染或预渲染方案,至少在入口HTML中輸出主要内容連結,给蜘蛛提供线索。
驗證你的抓取路径是否畅通
改造之後,可以用模拟蜘蛛的工具去抓取一個入口頁面,查看返回的HTML中是否包含文字連結。如果看到 href="/news/123" 這样的真實地址,且不带 #/,那就說明連結可以被正常提取。也可以借助爬虫日誌观察蜘蛛請求的URL集合,確認新頁面的請求次數在提高。蜘蛛池运营者可以把這種測試方法纳入日常巡检,用低成本抓取来發現URL發現的盲区。
重要提示:不要依赖hash做内容切換,也不要為了让連結“看起来變化”而滥用hash。真實、可訪問的URL才是持續获得抓取的基础。
合理規划URL结构、减少對前端框架剪影的依赖,是运维健康站点的一份持續工作。当蜘蛛能准确發現每一個獨立頁面时,你的站内信息才有机會走得更遠。