把目标頁面用 iframe 嵌進入口頁,是不少人试過的省事做法:入口頁本身内容不多,靠一個 iframe 把目标站挂上去,看上去既完成了展示,又好像顺手做了 URL 發現。問题在于,搜尋引擎對 iframe 的處理方式和普通連結不一样,想靠 iframe 让搜尋蜘蛛發現並抓取目标 URL,多數情况下並不可靠。
iframe 在爬虫眼里是另一個獨立文档
iframe 在 HTML 里是一個獨立的文档容器,它的 src 指向的頁面會被当作單獨的资源去請求。搜尋引擎解析入口頁时,一般能识別到 iframe 的 src 地址,但是否真的去抓取、是否會繼續跟進里面的連結,取决于各家搜尋引擎的實現和渲染策略,並不像普通 a 标簽那样确定。
更關键的一点是,即使搜尋引擎抓取了 iframe 里的頁面,里面的連結也未必被当成入口頁的出鏈来對待。連結的归属、發現路径和你预期的都不一样,URL 發現的效果會打很多折扣。
几種常见的失效情况
- 跨域 iframe:当 iframe 的域名和入口頁不同时,部分爬虫只會记錄 src 這一個地址,内层内容不深入處理。
- 延迟加载:設定惰性加载(lazy loading)或用 JS 動態寫入 src,爬虫可能在渲染結束前就收工,内层連結完全没看到。
- 内层本身是 JS 渲染:iframe 里的頁面是前端渲染的單頁應用,連結要执行脚本才出現,被發現的概率更低。
- 目标站禁止被嵌套:目标站响應头里带了禁止嵌套的設定,iframe 根本加载不出来,自然也谈不上抓取。
為什么這類做法效果不稳定
普通 a 标簽是 HTML 里最明确的「這里有一個 URL」的信号,解析成本低、识別率高。iframe 属于嵌套文档,需要額外的抓取和渲染预算。對爬虫来说,抓 iframe 内层的優先級通常低于正文里的正常連結,在抓取预算有限时更容易被放弃。
判断一種 URL 發現手段有没有用,不是看用戶端能不能打開,而是看爬虫日誌里有没有對内层 URL 的獨立請求记錄。
更稳妥的替代做法
- 把目标 URL 寫成普通的 a 标簽連結,放在入口頁正文里,确保地址直接出現在 HTML 源碼中,而不是脚本拼出来的。
- 确實需要展示目标頁面内容时,在 iframe 之外再补一條同地址的文本連結,给爬虫留一個明确入口。
- 避免把 src 交给 JS 或懒加载去填,能静態寫在源碼里就静態寫。
- 控制入口頁上的 iframe 數量,別让大量嵌套文档把抓取预算消耗在渲染上。
怎么驗證有没有真的抓到
先看服務器日誌,目标 URL 所属域名有没有来自搜尋引擎爬虫的請求,請求的 Referer 是不是入口頁。再用搜尋引擎提供的 URL 检查工具,看目标 URL 是否被發現。如果日誌里只有入口頁被訪問、目标 URL 一直没動静,說明 iframe 這條路径没起效,換成正文里的普通連結再观察一轮。
小结
iframe 适合做頁面展示,不适合当作 URL 發現的主要手段。把目标連結寫成真實的 a 标簽、放在能被静態解析的位置,再配合 sitemap 提交等常規方式,比依赖 iframe 更可控,也更容易從日誌里判断效果。