搜索抓取

多跳跳转的代价:重定向链、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 发现靠的是入口和链接。如果从入口到目标页要经过两次以上跳转,实际效果相当于把点击深度又加了一层:蜘蛛到达目标页的概率和频率都会下降,新页面被发现的时间也会往后拖。

所以站点运营里一个很朴素的习惯值得保留:新增页面直接给最终地址,旧地址一次性重定向到位,跳转规则集中管理并定期清理。链路短了,蜘蛛走过的路才会更接近你期望的那条。