常见問题

入口頁把目标連結放進 iframe,搜尋蜘蛛還會跟進發現吗?

入口頁用 iframe 承载目标連結,是不少蜘蛛池的常见做法。但 iframe 的 src 和 iframe 内部的連結,對搜尋蜘蛛来说並不是一回事。本文拆解几種 iframe 寫法的差异,說明它為什么不适合作為連結發現的主要载体,並给出用日誌驗證抓取路径的方法。

常见問题

入口頁把目标連結放進 iframe,搜尋蜘蛛還會跟進發現吗?

做蜘蛛池入口頁时,有些做法是把目标連結放進 iframe,或者用 iframe 把几個頁面拼成一個入口頁。動机通常是省事:一套框架套多個目标。但搜尋蜘蛛對這種结构的處理,和把連結直接寫在 HTML 里並不一样,需要分開看。

先分清两件事:iframe 的 src 和 iframe 里的連結

iframe 有一個 src 属性,它本身就是一個完整的 URL。搜尋蜘蛛解析入口頁 HTML 时能讀到這個地址,並且有可能把它当作一個待抓取的 URL 排队。這一点和 img 的 src、a 的 href 類似。

但如果你想要的是「让蜘蛛通過入口頁發現 iframe 内部頁面里的連結」,情况就复杂了。iframe 内文档的連結属于 iframe 所加载的那個頁面,它的發現路径是「先抓 iframe 的 src,再在那個頁面里解析連結」。中間多了一跳,每一跳都可能因為 robots、狀態碼、渲染能力等原因断掉。

简單说:iframe 的 src 更容易被当成 URL 發現;iframe 内部的連結,不保證會被跟進。

不同 iframe 寫法,差异很明顯

  • 静態 HTML 里的 iframe:src 寫在源碼中,蜘蛛解析 HTML 时就能看到,是相對最可控的一種。
  • JavaScript 動態插入的 iframe:源碼里没有 src,要靠渲染执行後才出現。能不能被發現,取决于搜尋引擎是否渲染该頁面、渲染是否完整。
  • srcdoc 形式的 iframe:内容直接寫在属性里,不是獨立 URL。蜘蛛通常不會把它当作一個可抓取的地址来處理,里面的連結更谈不上稳定發現。
  • 带 loading="lazy" 的 iframe:懒加载依赖滚動或视口條件,抓取环境不一定触發,可能出現「你看得到、蜘蛛没加载」的情况。
  • 加了 sandbox 属性的 iframe:部分限制會影响脚本和導航行為,進一步降低内部連結被正常解析的概率。

對蜘蛛池来说,iframe 不是理想载体

入口頁的核心目的,是让搜尋蜘蛛在解析頁面时看到指向目标 URL 的連結。連結寫在 iframe 里,等于把「發現」這件事外包给了另一层文档,你失去了對解析顺序和抓取路径的控制。

另外,iframe 内的連結在归属上通常被算作 iframe 源頁面的内容,而不是父入口頁的内容。如果你希望入口頁本身承载連結關系,把連結放在 iframe 里往往達不到预期效果。

用日誌確認蜘蛛到底走了哪一步

不要只看入口頁的訪問日誌就下结论。建议同时观察三類记錄:

  1. 入口頁自身的蜘蛛請求,確認頁面被正常抓取、返回 200。
  2. iframe 的 src 指向的地址是否出現蜘蛛請求。如果没有,說明第一跳就没走通。
  3. 目标 URL 是否出現蜘蛛請求,以及請求時間是否在入口頁抓取之後。

把三條日誌按時間排序,就能看出蜘蛛是停在入口頁、停在 iframe 的 src,還是真的跟到了目标連結。如果目标 URL 一直没出現,先排查中間那一跳。

更稳妥的做法

  1. 把需要被發現的目标連結直接寫在入口頁的 HTML 里,用正常的 a 标簽。
  2. 确實需要用 iframe 承载其他内容时,只把它当作辅助,不要作為唯一的連結出口。
  3. 避免用 JS 動態插入關键連結,除非你已经驗證過目标搜尋引擎能完整渲染。
  4. 入口頁改動後用日誌复核一次抓取路径,而不是改完就預設生效。

iframe 不是不能用,但它更适合承载展示型内容,而不是承担「让蜘蛛發現目标 URL」這個任務。把連結放在能被直接解析的 HTML 里,路径更短,排查也更简單。