做蜘蛛池入口頁时,有些做法是把目标連結放進 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 里往往達不到预期效果。
用日誌確認蜘蛛到底走了哪一步
不要只看入口頁的訪問日誌就下结论。建议同时观察三類记錄:
- 入口頁自身的蜘蛛請求,確認頁面被正常抓取、返回 200。
- iframe 的 src 指向的地址是否出現蜘蛛請求。如果没有,說明第一跳就没走通。
- 目标 URL 是否出現蜘蛛請求,以及請求時間是否在入口頁抓取之後。
把三條日誌按時間排序,就能看出蜘蛛是停在入口頁、停在 iframe 的 src,還是真的跟到了目标連結。如果目标 URL 一直没出現,先排查中間那一跳。
更稳妥的做法
- 把需要被發現的目标連結直接寫在入口頁的 HTML 里,用正常的 a 标簽。
- 确實需要用 iframe 承载其他内容时,只把它当作辅助,不要作為唯一的連結出口。
- 避免用 JS 動態插入關键連結,除非你已经驗證過目标搜尋引擎能完整渲染。
- 入口頁改動後用日誌复核一次抓取路径,而不是改完就預設生效。
iframe 不是不能用,但它更适合承载展示型内容,而不是承担「让蜘蛛發現目标 URL」這個任務。把連結放在能被直接解析的 HTML 里,路径更短,排查也更简單。