做蜘蛛池入口頁时,有人不直接放目标 URL 的 a 标簽,而是让入口頁跳轉過去,理由通常是“想控制点击路径”“方便統計”,或者“不想让入口頁和目标頁在 HTML 里直接产生關联”。跳轉本身不是不能用,但不同跳轉方式對搜尋蜘蛛的意义差別很大,用错了容易白做工,甚至把入口頁和目标 URL 绑得更紧。
先分清几種跳轉方式
- HTTP 301:永久跳轉,搜尋蜘蛛通常會把原 URL 的信号归到目标 URL 上,後續可能直接抓目标 URL。
- HTTP 302 / 307:临时跳轉,搜尋引擎一般保留原 URL,但也會跟随到目标 URL 抓取。
- meta refresh:寫在 HTML 的 head 里,延迟為 0 时較容易被跟随,延迟设成几秒以上,很多抓取器可能直接忽略。
- JavaScript 跳轉:需要搜尋引擎渲染頁面後才执行,取决于渲染资源是否分给了這個 URL。
301 和 302 對入口頁意味着什么
如果你希望入口頁本身不被索引,只作為發現目标 URL 的跳板,那么 301 往往适得其反:搜尋引擎會把入口頁和目标 URL 看成同一個资源的迁移關系,入口頁的歷史信号會向目标 URL 轉移,入口頁本身也可能從索引里消失。而当大量入口頁都用 301 指向同一個目标 URL 时,這種“多對一”的跳轉關系在抓取和索引資料里是比較顯眼的模式。
302 相對温和,搜尋引擎一般保留原 URL、同时跟随跳轉抓取目标頁。但它同样是可被识別的跳轉關系,並不是所谓的隐身手段。
跳轉只能改變抓取路径,不能改變“這些 URL 之間存在關联”這個事實。想靠跳轉伪装連結關系,通常得不偿失。
meta refresh 和 JS 跳轉的實际表現
meta refresh 的延迟時間是關键。延迟為 0 的寫法被跟随的概率相對高一些,但不同抓取器的處理並不统一;延迟几十秒的寫法,搜尋蜘蛛基本不會在抓取时等待,等于没寫。JS 跳轉則依赖渲染,如果這個入口頁在抓取队列里没有被安排渲染,跳轉就不會执行,目标 URL 自然也不會被發現。
更稳妥的做法是:即使要用 JS 跳轉,也在頁面里保留一個普通的 a 标簽指向目标 URL,让不执行 JS 的抓取器也能發現連結。跳轉只是给用戶看的体驗层,不该成為唯一的發現路径。
跳轉鏈不要拉長
入口頁 → 中間頁 → 目标頁這種多跳结构,每一跳都要消耗抓取资源,而且跳轉次數超過一定上限後,爬虫會直接停止。原本一個 URL 就能解决的事變成三次請求,抓取预算本来就紧張的话,损失很明顯。能一跳到位就別做两跳。
實操建议
- 優先用普通的 a 标簽直接指向目标 URL,這是最容易被發現的形態。
- 确實需要跳轉时,先想清楚要的是“临时引導”還是“永久迁移”,再選 302 還是 301。
- meta refresh 的延迟寫 0,不要寫几秒。
- 不要設定多級跳轉鏈,也不要让跳轉依赖 Cookie 或 UA 判断做差异化返回。
- 不要给搜尋蜘蛛和真實用戶返回不同的跳轉目标,這類差异化處理一旦被识別,風險遠大于收益。
怎么從日誌確認跳轉有没有被跟到
看入口頁日誌里的狀態碼分布:如果只有 200 而看不到 3xx,說明搜尋蜘蛛可能压根没請求這個入口頁;如果入口頁有 3xx 记錄,再去目标 URL 的日誌里找同一来源 IP、時間相近的請求。两者對得上,說明跳轉被跟随了;只看到入口頁的 3xx 却始终没有目标 URL 的請求,就要回头检查跳轉方式或中間环节是不是被拦住了。