蜘蛛池里的入口頁本身不是给人看的内容頁,它的作用是把搜尋蜘蛛引到目标 URL。所以「連結以什么形式出現」直接决定了這次抓取有没有意义。除了最常见的 a 标簽,有人會用 meta refresh 跳轉、iframe 嵌套,甚至让入口頁直接 302 到目标頁。對搜尋蜘蛛来说,這三種方式的處理逻辑差別很大,混用之前最好先搞清楚各自能做到什么。
重定向是「頁面代替」,不是「頁面内連結」
HTTP 301/302 是頁面級別的跳轉。搜尋蜘蛛确實會跟随重定向,但它的理解方式是:這個地址最终指向另一個地址,抓取结果记在那個目标 URL 上,入口頁本身不會被当成一個「包含若干連結的頁面」来看待。
這就带来一個限制:一次重定向只能指向一個 URL。如果入口頁的职责是罗列几十個目标地址,用重定向根本做不到,只能一個入口頁對一個目标頁,池子的規模會成倍膨胀。另外 302 表示临时跳轉,搜尋蜘蛛可能反复回訪入口頁確認跳轉是否變化,相当于把抓取次數花在確認上。跳轉鏈拉長时(A 跳 B,B 再跳 C),跟随意愿通常也會下降,中間任何一环出错都會断掉。
meta refresh 能识別,但只适合單线场景
meta refresh 属于 HTML 层面的跳轉,搜尋蜘蛛一般能识別一部分,但通常只處理頁面里第一條、延迟較短的跳轉。這里有两個現實問题:一是 HTML 規范上同一頁面寫多條 meta refresh 是不合法的,浏览器只會采用其中一條,所以它天然無法承载「一頁多連結」;二是 0 秒跳轉虽然看起来干脆,却容易被理解為「這個頁面已经轉移了」,而不是「這個頁面里有一批 URL」。
換句话说,meta refresh 适合的是舊站迁移那種單入口對單目标的场景,用它来分發目标 URL,等于把入口頁退化成一條重定向记錄。
iframe 里的連結,经常不算在這一頁上
iframe 的内容是按自己的 URL 獨立對待的。很多抓取系統不會把 iframe 内的連結算作外层入口頁的出鏈,即使跟随,归属也可能记在 iframe 的源地址上,而不是入口頁。用 iframe 把連結藏起来,收益通常不如直接把 a 标簽寫在正文里;如果因為模板原因必须用 iframe,建议在入口頁正文再补一份同样的 a 标簽,让連結有一個明确的出處。
更稳妥的入口頁寫法
- 批量目标 URL 一律用 a 标簽,href 寫完整的绝對地址,不要用 javascript: 或空值。
- 不要用 302 承载批量連結,重定向是單线的,不适合做分發。
- meta refresh 只保留给單入口對單目标的迁移頁面,延迟不必强求 0 秒。
- iframe 里的連結当作不存在,需要时在正文重复一份。
- 連結文本、title 和周围的一两句话给点语义,方便判断這條 URL 大概是什么内容。
- 入口頁的連結形式保持稳定,不要今天 a 标簽、明天改成跳轉,频繁變動會让抓取行為變得难以判断。
怎么確認搜尋蜘蛛真的跟過去了
最直接的办法是看訪問日誌:在入口頁被搜尋蜘蛛訪問之後的一段時間内,目标 URL 上有没有出現對應的抓取记錄。如果日誌里只有入口頁被反复讀取,目标 URL 迟迟没有動静,就回头检查連結形式、robots.txt 限制、nofollow 属性以及目标站本身的响應狀態,而不是先急着加大入口頁數量。
重定向回答的是「這個頁面去哪」,a 标簽回答的是「這個頁面里有哪些 URL」。想批量分發目标地址,只能用後者。
把跳轉和連結分開看待,能省掉很多排查時間。每次動手前先想清楚:這一次抓取,你是希望搜尋蜘蛛记住入口頁,還是希望它顺着入口頁记住目标 URL。目的不同,寫法就不该一样。