把目标連結放進 iframe,是不少蜘蛛池入口頁用来做頁面分块或“藏連結”的做法。它到底能不能被搜尋蜘蛛發現,取决于爬虫是否愿意把 iframe 当成一個獨立文档去請求,以及請求之後怎么處理里面的連結。先说结论:部分场景下可以發現,但稳定性明顯弱于正文里的普通 a 标簽,不适合当作主要的 URL 發現渠道。
iframe 里的連結,搜尋蜘蛛看不看
搜尋引擎在渲染頁面时,通常會把 iframe 视為一個單獨的文档来處理,但這不等于里面的連結一定會進入主頁面的連結图。實际抓取中常见的差异有這几種:
- iframe 的 src 指向同域名文档时,被請求和解析的概率相對較高;
- 跨域 iframe 也能被請求,但其中的連結是否被归到主頁面,各家處理規則不一致;
- src 由 JavaScript 動態寫入时,要等渲染阶段才可能被發現,延迟和不确定性都更大;
- 靠 noscript、懒加载占位符承载的連結,多數情况下會被当作不可见内容處理。
換句话说,iframe 更像是一個“可能被發現”的通道,而不是“會被發現”的通道。把它当成唯一入口,風險偏高。
為什么 iframe 里的連結容易被漏掉
漏抓通常不是單一原因造成的,常见的有以下几類:
- 額外一次請求的成本。爬虫要發現 iframe 内的連結,必须先請求 src 指向的文档,相当于多花一次抓取预算。在配額紧張时,這一步很容易被跳過。
- 連結归因不清。iframe 内的連結属于子文档,部分實現不會把它算作主頁面的出鏈,因此不會從入口頁“传導”到目标 URL。
- 渲染门槛。需要执行 JavaScript 才能寫入 src 的 iframe,只有在渲染型抓取中才可能被處理,而渲染抓取本身是有額度的。
- 属性限制。iframe 上叠加了 sandbox、loading="lazy",或者被 CSS 设為 0×0、display:none 时,解析優先級會進一步降低。
想让 iframe 里的連結更容易被發現
如果确實要保留 iframe,可以尽量把條件简化,减少爬虫的决策成本:
- 使用同域 iframe,src 直接寫在 HTML 属性里,不要靠脚本注入;
- 被 iframe 引用的頁面要正常返回 200,並且内部是标准可解析的 a 标簽;
- 不要在 iframe 上叠加多余的 sandbox 限制或懒加载條件;
- 给 iframe 一個合理的宽高,避免用 0×0 或 display:none 隐藏;
- iframe 内頁面不要再用 robots.txt 屏蔽,否則连請求都不會發生。
更稳妥的做法:別把發現入口只押在 iframe 上
如果目标是让目标 URL 被稳定發現,建议在 iframe 之外再补几條路:
- 在入口頁正文里放至少一個可见的普通連結,作為保底入口;
- 通過 sitemap、RSS 或站点主動提交接口补充 URL 来源;
- 在服務器日誌里分別核對 iframe 内頁與目标 URL 的抓取记錄,確認哪一环断了。
如果日誌顯示爬虫只請求了入口頁,却没有請求 iframe 的 src,說明它没有渲染或直接跳過了這個框架。這種情况下的 iframe 連結基本不具备發現價值,需要換回正文連結或其他提交方式。
排查顺序建议
- 先看 iframe 的 src 有没有被請求,没有請求就不用再往下查連結;
- 再看 src 頁面是否返回 200,是否被 robots.txt 或 meta robots 挡住;
- 然後看 src 頁面里的 a 标簽是否可解析,是否被 JS 動態生成;
- 最後對比目标 URL 的日誌,判断是發現环节還是抓取环节出了問题。
iframe 可以用,但要清楚它的定位:它只是入口頁上的一種补充结构,而不是 URL 發現的主力。把可见連結、站点地图和主動提交组合起来,入口頁的發現效率會更稳定,也更容易從日誌里定位問题。