搜尋抓取

多跳跳轉的代價:重定向鏈、meta refresh 與 JS 跳轉怎样拖慢 URL 發現

蜘蛛到達一個頁面之前,可能要先经過几层跳轉。本文拆解 HTTP 重定向、meta refresh 與 JS 跳轉三種方式的抓取成本,說明鏈式跳轉如何拉長請求時間、占用抓取配額,並给出用 curl -IL 排查、把入口收敛到一次跳轉、清理内鏈中間地址的具体做法。

搜尋抓取

多跳跳轉的代價:重定向鏈、meta refresh 與 JS 跳轉怎样拖慢 URL 發現

蜘蛛發現一個新 URL 的過程,往往不是一步到位。從入口頁点到目标頁,中間可能夹着一层或多层跳轉。每多一次跳轉,就多一次請求、多一次等待,也多一個可能出错的环节。把跳轉鏈路理顺,是提高 URL 發現效率里成本最低的一件事。

蜘蛛怎么處理不同類型的跳轉

常见的跳轉有三類,蜘蛛對待它們的方式並不一样。

  • HTTP 重定向(301/302/307/308):服務器直接在响應头里给出新地址,蜘蛛拿到狀態碼和目标 URL 後,會繼續請求新地址。這是最容易被正确识別的一類。
  • meta refresh:寫在 HTML 的 head 里,蜘蛛必须先把整個頁面抓下来、解析完 HTML 才知道要跳去哪。相当于花了一次完整抓取的成本,只換来一個地址。
  • JS 跳轉:靠脚本执行完成,取决于渲染能力與脚本是否被屏蔽,能不能被跟上本身就不确定。

三類跳轉里,HTTP 重定向的開销最小,後两類都要先付出一次頁面抓取。

每多一跳,成本怎么叠加

一跳本身不致命,問题在于鏈式叠加。常见的坏例子是:http 跳到 https,https 跳到带 www,带 www 又跳到另一個域名,最後再补一次末尾斜杠——同一個目标頁,蜘蛛要發四次請求。

带来的影响大致有三点:

  1. 每次跳轉都要重新做 DNS、建连、等响應,抓一個頁面的時間被拉長數倍。
  2. 跳轉鏈本身會占用抓取配額,尤其是列表頁、栏目頁這種高频訪問的入口。
  3. 鏈路中間任何一环超时或返回错誤,後面的 URL 就發現不了。
能在一個响應头里给完的信息,不要拆成三次跳轉。

就地自查:把重定向鏈压到一跳

排查並不复杂,用命令行就能看到完整鏈路:

  • 用 curl -IL 或同類工具跟一次完整跳轉,把每一跳的狀態碼和 Location 打印出来;
  • 检查站点是否同时存在 http、https、www、非 www 四個入口,把其中一個设為唯一入口,其余一次跳到位;
  • 留意 CDN、负载均衡、應用层各自加的規則,避免同一條鏈路上叠加两次重定向;
  • 抽查站内連結,確認它們直接指向最终地址,而不是指向會被重定向的中間地址。

内鏈指向中間地址是很常见的問题:頁面本身没問题,但站内所有連結都先打到舊域名,等于每次点击都多绕一圈。

meta refresh 與 JS 跳轉尽量少用

這两類跳轉在改版、临时活動頁、登入態判断里出現得比較多。如果只是想做地址迁移,用服務器端重定向更直接。确實需要保留时,注意几点:

  • 不要把跳轉目标藏在多层脚本里,第一层 HTML 就能看到的地址更容易被跟上;
  • 避免跳轉鏈循环,A 跳 B、B 又跳回 A,蜘蛛走几次後通常就會放弃;
  • 跳轉頁面不要同时輸出大段正文,否則容易和真實目标頁形成内容重复的错觉。

跳轉與 URL 發現的關系

URL 發現靠的是入口和連結。如果從入口到目标頁要经過两次以上跳轉,實际效果相当于把点击深度又加了一层:蜘蛛到達目标頁的概率和频率都會下降,新頁面被發現的時間也會往後拖。

所以站点运营里一個很朴素的习惯值得保留:新增頁面直接给最终地址,舊地址一次性重定向到位,跳轉規則集中管理並定期清理。鏈路短了,蜘蛛走過的路才會更接近你期望的那條。