蜘蛛发现一个新 URL 的过程,往往不是一步到位。从入口页点到目标页,中间可能夹着一层或多层跳转。每多一次跳转,就多一次请求、多一次等待,也多一个可能出错的环节。把跳转链路理顺,是提高 URL 发现效率里成本最低的一件事。
蜘蛛怎么处理不同类型的跳转
常见的跳转有三类,蜘蛛对待它们的方式并不一样。
- HTTP 重定向(301/302/307/308):服务器直接在响应头里给出新地址,蜘蛛拿到状态码和目标 URL 后,会继续请求新地址。这是最容易被正确识别的一类。
- meta refresh:写在 HTML 的 head 里,蜘蛛必须先把整个页面抓下来、解析完 HTML 才知道要跳去哪。相当于花了一次完整抓取的成本,只换来一个地址。
- JS 跳转:靠脚本执行完成,取决于渲染能力与脚本是否被屏蔽,能不能被跟上本身就不确定。
三类跳转里,HTTP 重定向的开销最小,后两类都要先付出一次页面抓取。
每多一跳,成本怎么叠加
一跳本身不致命,问题在于链式叠加。常见的坏例子是:http 跳到 https,https 跳到带 www,带 www 又跳到另一个域名,最后再补一次末尾斜杠——同一个目标页,蜘蛛要发四次请求。
带来的影响大致有三点:
- 每次跳转都要重新做 DNS、建连、等响应,抓一个页面的时间被拉长数倍。
- 跳转链本身会占用抓取配额,尤其是列表页、栏目页这种高频访问的入口。
- 链路中间任何一环超时或返回错误,后面的 URL 就发现不了。
能在一个响应头里给完的信息,不要拆成三次跳转。
就地自查:把重定向链压到一跳
排查并不复杂,用命令行就能看到完整链路:
- 用 curl -IL 或同类工具跟一次完整跳转,把每一跳的状态码和 Location 打印出来;
- 检查站点是否同时存在 http、https、www、非 www 四个入口,把其中一个设为唯一入口,其余一次跳到位;
- 留意 CDN、负载均衡、应用层各自加的规则,避免同一条链路上叠加两次重定向;
- 抽查站内链接,确认它们直接指向最终地址,而不是指向会被重定向的中间地址。
内链指向中间地址是很常见的问题:页面本身没问题,但站内所有链接都先打到旧域名,等于每次点击都多绕一圈。
meta refresh 与 JS 跳转尽量少用
这两类跳转在改版、临时活动页、登录态判断里出现得比较多。如果只是想做地址迁移,用服务器端重定向更直接。确实需要保留时,注意几点:
- 不要把跳转目标藏在多层脚本里,第一层 HTML 就能看到的地址更容易被跟上;
- 避免跳转链循环,A 跳 B、B 又跳回 A,蜘蛛走几次后通常就会放弃;
- 跳转页面不要同时输出大段正文,否则容易和真实目标页形成内容重复的错觉。
跳转与 URL 发现的关系
URL 发现靠的是入口和链接。如果从入口到目标页要经过两次以上跳转,实际效果相当于把点击深度又加了一层:蜘蛛到达目标页的概率和频率都会下降,新页面被发现的时间也会往后拖。
所以站点运营里一个很朴素的习惯值得保留:新增页面直接给最终地址,旧地址一次性重定向到位,跳转规则集中管理并定期清理。链路短了,蜘蛛走过的路才会更接近你期望的那条。