在搭建蜘蛛池入口頁时,把目标連結塞進 iframe、用 meta refresh 自動跳轉,或者寫一段 JavaScript 做 location.href 跳轉,都是很常见的做法。這類寫法到底能不能被搜尋蜘蛛發現目标 URL,没有一個统一的答案,關键看連結是不是以可抓取的形式出現在 HTML 里。
先区分「承载方式」和「連結形式」
很多讨论會把两件事混在一起:
- 承载方式:iframe、meta refresh、JS 跳轉、302 等,决定頁面如何呈現或轉向;
- 連結形式:目标 URL 是不是寫在 a 标簽的 href 属性里,是不是标准的超連結。
搜尋蜘蛛發現新 URL,主要依赖 HTML 中可以直接解析出来的連結。承载方式只影响它能不能讀到這段 HTML,以及讀到之後愿不愿意繼續走下去。
iframe 里的連結
iframe 的内容是一份獨立文档,需要蜘蛛額外發起一次請求去抓取。多數搜尋引擎能處理 iframe 里的内容,但優先級和稳定性通常低于主文档里的連結。如果 iframe 的 src 指向被 robots.txt 屏蔽、需要登入、或者返回错誤狀態的地址,里面的連結基本不會被發現。把目标連結只放在 iframe 里,相当于多绕了一层,能不能被看到带有不确定性。
meta refresh 和 JS 跳轉
meta refresh 属于頁面級的跳轉指令,搜尋引擎一般能识別並跟随,但跟随的前提是它愿意繼續抓取跳轉後的頁面。JavaScript 跳轉需要渲染能力,主流搜尋引擎可以执行一部分 JS,但渲染是有成本的,不會對每個入口頁都完整跑到最後一步,尤其当入口頁數量多、质量參差时。
更現實的做法是:跳轉照做,但把目标連結同时以普通超連結的形式寫在頁面里,让蜘蛛在渲染之前就能看到。
把連結放回可抓取的位置
如果入口頁确實需要给訪客做跳轉,可以保留跳轉逻辑,同时补一份纯 HTML 連結列表:
- 每個目标 URL 用标准的 a 标簽輸出,href 是完整可訪問的地址;
- 不要用 onclick 或 javascript: 伪协议代替 href;
- 連結不要先隐藏再靠 JS 顯示,尽量在初始 HTML 中就可见;
- 入口頁本身返回 200,並且允许被抓取。
這样即使 iframe 没被加载、跳轉没被执行,連結仍然留在 HTML 里,被發現的概率會明顯提高。当然,被發現只是第一步,是否抓取、後續是否被编入索引,還取决于目标 URL 本身的内容质量和服務器响應情况,這部分不是入口頁能决定的。
常见的几個誤区
- 以為跳轉鏈越長越隐蔽越好,實际上每一层都可能让蜘蛛提前停下;
- 用整套图片或 canvas 承载連結,蜘蛛讀不到 href;
- 入口頁開了防爬規則,把搜尋引擎的 UA 也一並挡住;
- 跳轉目标经常變化,導致日誌里全是 302,很难判断真實抓取结果。
怎么驗證
- 用浏览器查看網頁源代碼,確認連結出現在原始 HTML,而不是只在渲染後的 DOM 里;
- 禁用 JavaScript 再打開入口頁,看連結是否仍然可见;
- 在服務器日誌里观察搜尋蜘蛛對入口頁和目标 URL 的請求记錄;
- 對比不同入口頁的寫法,看哪種结构下的抓取记錄更连續、更稳定。
總结一句:iframe、meta refresh 和 JS 跳轉都只是頁面行為,不是發現 URL 的可靠通道。真正起作用的是入口頁 HTML 里有没有一條能被直接解析出来的連結。