有些站点在浏览器里訪問一切正常,但從抓取日誌看,蜘蛛大量落在 /login、/verify 這類地址上,目标内容頁的抓取量始终上不去。這種“路径偏移”很多时候不是連結寫错,而是會话狀態在作怪。
一、常见的偏移表現
- 蜘蛛請求内容頁,返回 302 或 307,最终落到登入頁、驗證頁或地区選擇頁;
- 同一個内容地址每次被抓取都带上不同的會话參數,一個入口被拆成很多份;
- 目錄頁對未登入用戶開放,但列表與分頁連結只在登入後才輸出,蜘蛛看不到後續入口。
二、為什么會發生
服務端若用 Cookie 判断訪問者身份,而蜘蛛通常不携带站点 Cookie,就會被当成“未登入訪客”。如果規則寫得過粗,比如“未登入訪問内容目錄一律跳登入”,自然抓取也會被一並拦下。另一種情况是框架在首次响應时下發 Set-Cookie,並把會话号寫進 URL;這些带參數的連結一旦被複製到頁面里,就會形成一批带會话串的入口,既浪費抓取量,也让入口归並變得混乱。
三、排查顺序
- 用不带 Cookie 的請求訪問几個典型内容頁,记錄狀態碼與最终地址;
- 在抓取日誌里筛 3xx,統計 Location 指向的域名與路径分布,確認是否集中指向登入或驗證頁;
- 检查頁面中出現的連結,是否带 sid、jsessionid、token 一類參數;
- 確認 CDN、WAF、反向代理层是否也存在基于 Cookie 的跳轉或人机校驗規則;
- 對比登入前後的 HTML,判断分頁與列表連結是否属于登入後才渲染的部分。
四、處理方式
- 把公開内容頁從“必须登入”的規則里摘出来;确需權限的内容用明确的 403 回應,而不是跳轉登入頁;
- 關閉 URL 重寫中的會话串附加,避免带參數連結被複製扩散;
- 分頁與列表尽量在未登入狀態下輸出可抓取的連結,需要交互的部分再交给脚本;
- 确實不想被抓取的路径,用 robots 規則明确排除,减少無效請求占用。
跳轉到登入頁並不會隐藏内容,只會让抓取预算花在一個没有正文的地址上。
五、驗證與持續观察
調整後不要只看一天的資料。观察目标目錄的狀態碼分布是否從 3xx 轉為 200,落到登入頁的請求占比是否下降,带會话參數的 URL 數量是否收敛,以及内容頁的單日抓取次數是否回到合理区間。同时留意新上线的功能是否又引入了 Cookie 判断,把“無 Cookie 訪問内容頁返回 200”作為上线前的固定自检項,會比事後翻日誌省事得多。