蜘蛛發現一個新 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 發現靠的是入口和連結。如果從入口到目标頁要经過两次以上跳轉,實际效果相当于把点击深度又加了一层:蜘蛛到達目标頁的概率和频率都會下降,新頁面被發現的時間也會往後拖。
所以站点运营里一個很朴素的习惯值得保留:新增頁面直接给最终地址,舊地址一次性重定向到位,跳轉規則集中管理並定期清理。鏈路短了,蜘蛛走過的路才會更接近你期望的那條。