给蜘蛛池入口頁加連結时,有人會在 URL 後面顺手带上 # 片段:有的是想指向目标頁面的某個位置,有的是沿用了前端路由的寫法。這類片段在浏览器地址栏里看得到,但放到搜尋蜘蛛那一侧,它几乎不會改變什么。
片段不會發给服務器
URL 里的 # 及其後面的内容,按規范属于由客戶端處理的片段标识,浏览器不會把它放進 HTTP 請求發给服務器。搜尋蜘蛛抓取时遵循的是同一套規則:解析到带 # 的連結後,請求的實际路径會停在 # 之前,後面的部分被丢掉。也就是说,某個 URL 後面接 #a 還是接 #b,對爬虫而言都是同一個地址。
它既不增加發現机會,也不額外消耗配額
由此可以推出两個常见誤解:
- 带不同 # 的連結不會各自算成新 URL,不會凭空多出几次發現机會;
- 同时也不會因為多寫了几種片段就吃掉抓取配額,爬虫不會對同一個路径反复請求。
換句话说,片段對“目标 URL 有没有被看到”這件事基本是中性的,用不用都不影响發現,只是没必要把它当成技巧。
那前端路由里的 #!/path 呢
這里的邊界稍微模糊一点。有些站点用 #!/ 或 #/ 做路由,真正的頁面路径藏在片段里。主流搜尋引擎對這類寫法有一定處理能力,會尝试渲染頁面並识別等價路径,但這個环节並不稳定,取决于渲染资源是否到位、實現是否規范,也不适合当成一條可控的發現通道。
如果入口頁上的連結恰好是這種形式,比較稳妥的做法是同时给出對應的真實路径版本,让爬虫不必依赖片段解析。
怎么確認爬虫請求里到底带了什么
想驗證的话,看服務器訪問日誌就够:
- 找到入口頁對應的請求记錄,查看搜尋蜘蛛請求的完整路径;
- 確認路径里是否出現 # 及其後面的内容,正常情况下几乎不會出現;
- 對比同一路径的請求次數,如果带不同片段的連結没有让請求數變多,說明處理方式和预期一致。
如果日誌工具本身對 # 做了截断,也可以做一次最小實驗:在入口頁放两個只差片段的連結,看日誌里产生一條還是两條請求记錄。
真正值得花心思的地方
片段本身没什么可優化的空間,與其纠结它,不如把精力放在更直接影响發現的因素上:
- 連結是否出現在 HTML 可解析的位置,而不是只靠脚本或交互才出現;
- 入口頁能否正常返回,响應是否稳定,是否存在長時間超时;
- 鏈出的目标 URL 是否唯一、可直接訪問,有没有绕来绕去的重定向鏈條;
- 入口頁本身是否還在被搜尋蜘蛛定期回訪。
片段是给浏览器看的,不是给爬虫看的。把 URL 的“真實部分”做干净,比在片段上做文章有用得多。