常见問题

入口頁用跳轉把搜尋蜘蛛送往目标頁,301、302、meta refresh 各有什么坑

入口頁用跳轉把搜尋蜘蛛引到目标頁,301、302、meta refresh 和 JS 跳轉的表現並不一样。本文說明各類跳轉的跟随情况、常见誤用,以及如何從日誌判断跳轉是否被真正抓到。

常见問题

入口頁用跳轉把搜尋蜘蛛送往目标頁,301、302、meta refresh 各有什么坑

做蜘蛛池入口頁时,有人不直接放目标 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 就能解决的事變成三次請求,抓取预算本来就紧張的话,损失很明顯。能一跳到位就別做两跳。

實操建议

  1. 優先用普通的 a 标簽直接指向目标 URL,這是最容易被發現的形態。
  2. 确實需要跳轉时,先想清楚要的是“临时引導”還是“永久迁移”,再選 302 還是 301。
  3. meta refresh 的延迟寫 0,不要寫几秒。
  4. 不要設定多級跳轉鏈,也不要让跳轉依赖 Cookie 或 UA 判断做差异化返回。
  5. 不要给搜尋蜘蛛和真實用戶返回不同的跳轉目标,這類差异化處理一旦被识別,風險遠大于收益。

怎么從日誌確認跳轉有没有被跟到

看入口頁日誌里的狀態碼分布:如果只有 200 而看不到 3xx,說明搜尋蜘蛛可能压根没請求這個入口頁;如果入口頁有 3xx 记錄,再去目标 URL 的日誌里找同一来源 IP、時間相近的請求。两者對得上,說明跳轉被跟随了;只看到入口頁的 3xx 却始终没有目标 URL 的請求,就要回头检查跳轉方式或中間环节是不是被拦住了。