不少蜘蛛池入口頁為了省事,把目标 URL 交给一段 JavaScript,等頁面加载後再用 document.createElement 或 innerHTML 把連結插進 DOM。浏览器里看着正常,但搜尋蜘蛛能不能發現這些連結,並没有一個统一答案。
搜尋蜘蛛處理 JavaScript 的基本流程
多數搜尋引擎的抓取可以拆成两步:先按 URL 取回原始 HTML,再决定是否把頁面放進渲染队列,用無头浏览器执行脚本,最後從渲染後的 DOM 里提取連結和内容。
- 第一步只看原始 HTML,此时 DOM 里還没有 JS 插入的連結。
- 第二步的渲染队列有容量和優先級限制,不是每個頁面都會被渲染,也不是抓完马上渲染。
- 只有渲染完成,JS 生成的 a href 才會進入待抓取队列,之後還要再排一次抓取。
換句话说,鏈路更長,不确定性更多。連結最终被發現,可能比静態輸出晚很多,也可能在某些引擎上根本走不到那一步。
几種常见寫法的差別
原始 HTML 里已经有 a 标簽
這是最稳的情况。即使頁面上還有 JS,蜘蛛在第一步就能拿到連結,渲染與否都不影响發現。
整段連結由 JS 拼接插入
能否發現,取决于该引擎是否执行脚本、渲染队列是否轮到你的頁面。同一個入口頁,在不同搜尋引擎上的结果可能完全不同。批量入口頁更容易被排在渲染队列後面。
用 onclick 或 location.href 跳轉
這類寫法在渲染後的 DOM 里並不存在可提取的 a href,蜘蛛通常無法把它当作連結来發現目标 URL,而只會视為頁面上的一個交互行為。
把連結放進 noscript
部分抓取器不解析 noscript 内容,把它当作唯一輸出方式並不安全。
想让目标 URL 更容易被發現的几種做法
- 入口頁尽量輸出静態 HTML,關键連結直接寫在原始源碼里,用标准的 a 标簽加 href。
- 如果頁面必须用前端框架,考虑服務端渲染或预渲染,让首屏連結出現在返回的 HTML 中。
- 動態渲染要谨慎設定 User-Agent 判断,別把普通訪客也挡在门外,也別漏掉不常见的蜘蛛标识。
- sitemap、主動推送可以作為补充通道,但它們不能替代頁面上的連結發現。
- 同一批目标 URL 不要只藏在 JS 里,至少在入口頁保留一份静態連結版本。
怎么驗證蜘蛛到底有没有拿到連結
- 查看頁面源代碼,搜尋目标域名,確認連結不在 JS 字符串里,而是真實的 href。
- 用支持 JS 渲染的抓取工具跑一遍,看渲染後的 DOM 里連結是否存在、是否可訪問。
- 對照服務器日誌,看搜尋蜘蛛是否請求過頁面,以及是否請求過目标 URL。
- 检查連結是否被 nofollow、X-Robots-Tag 或 robots.txt 影响。
- 自有站点可以用站長平台的 URL 检查工具,看渲染结果和頁面里被發現的連結。
對蜘蛛池入口頁的實际建议
入口頁的核心作用是让搜尋蜘蛛拿到目标 URL,越简單、越接近静態 HTML,越不容易在渲染环节掉鏈子。把連結藏在 JS 里,等于给發現過程多加了一道不确定的關卡。如果确實需要 JS,至少保證原始 HTML 里有一份等價的連結,再考虑用其他提交方式配合。
是否被抓取、抓取後是否收錄,最终由搜尋引擎自行判断。本文只讨论技術實現上的差异,不承诺任何收錄或排名结果。