蜘蛛池入口頁经常承担“把蜘蛛带到目标頁”的角色。入口頁本身内容不多,于是很多人會用跳轉把它和真正想被抓取的頁面连起来。但跳轉不是没有代價:蜘蛛每跟一层,就多一次請求,也多一次中途放弃的可能。理解不同跳轉方式的行為差异,能帮你少浪費抓取预算。
蜘蛛遇到重定向时會怎么做
当蜘蛛請求一個入口頁,服務器返回 301 或 302,並在响應头里给出 Location,蜘蛛通常會繼續請求新地址。它並不“讨厌”重定向,但會把它当成一次額外的 URL 發現過程。鏈路越長,蜘蛛需要串行處理的請求越多,落在目标頁上的抓取机會就越少。
301 表示永久移動,常被用来做域名合並、HTTPS 切換和路径迁移。302、307 表示临时跳轉,蜘蛛一般也會跟随,但在判断規范 URL 时會更谨慎。對入口頁来说,如果目标長期固定,用 301 比用 302 更清晰;如果只是短期活動或測試,才适合临时跳轉。
几種跳轉方式的差別
HTTP 301 / 302
這是蜘蛛最容易處理的方式。响應头里的 Location 明确,蜘蛛不需要解析頁面内容,也不依赖脚本执行。只要目标地址可訪問、返回正常狀態,蜘蛛就能繼續走。需要注意的是,跳轉目标不要再次跳回原地址,否則會形成循环,蜘蛛很快會停止跟随。
meta refresh
meta refresh 寫在 HTML 的 head 里,蜘蛛在解析頁面时可能识別它,但支持程度和响應速度不如 HTTP 头。設定 0 秒跳轉相對直接,設定几十秒延迟則可能让蜘蛛先放弃頁面。更麻烦的是,如果入口頁本身响應慢,meta refresh 還没被解析到,蜘蛛已经結束這次抓取了。
JavaScript 跳轉
不执行脚本的蜘蛛看不到 JS 跳轉的目标。即使部分搜尋引擎會渲染頁面,渲染也要排队,成本更高。如果入口頁只靠 JS 跳轉,又没有 HTML 連結兜底,蜘蛛很可能只看到一頁空壳。可以保留一個可点击的普通連結,或者用 noscript 提供替代連結,但這只是补救,不是首選。
常见的跳轉鏈問题
- 多层跳轉:A 跳到 B,B 跳到 C,C 再跳到 D。每层都消耗請求,蜘蛛可能在 B 或 C 就停下。
- 跳轉成环:入口頁跳到目标頁,目标頁又跳回入口頁,蜘蛛反复請求同一组地址。
- 跳轉带參數:每次跳轉都追加跟踪參數,導致同一個目标出現多個 URL,分散抓取。
- 跳轉到 robots 屏蔽或 noindex 頁面:蜘蛛跟過去却發現不能抓或不想收錄,前面的跳轉就白做了。
- HTTP 與 HTTPS、www 與非 www 来回跳:配置不统一时,蜘蛛可能在不同版本之間被反复引導。
入口頁跳轉的實用建议
- 能用 301 直達就不要用多級跳轉,把层數控制在一到两层。
- 入口頁和目标頁都返回 200,避免跳轉目标本身又是 3xx。
- 如果必须用 JS 跳轉,至少提供 HTML 連結,並确保連結是蜘蛛可抓的普通連結。
- 定期用抓取工具或日誌检查跳轉鏈,看蜘蛛實际請求了哪些地址、在哪一步停止。
- 跳轉目标要稳定,不要今天跳 A、明天跳 B,频繁更換會让蜘蛛重新判断。
- 把跳轉鏈和 sitemap、内鏈结合起来看:如果目标頁已经有正常入口,就不一定非要再绕一层跳轉。
跳轉鏈越短,蜘蛛越容易走到目标頁。但走到不等于收錄,目标頁本身的内容质量、可訪問性和重复度仍然决定最终结果。
蜘蛛池入口頁的跳轉不是越复杂越好。把每一次重定向都当成一次成本,尽量让蜘蛛用最少的請求到達你想让它看到的頁面,剩下的交给頁面本身。