在蜘蛛池入口頁和普通内容頁里,用 JavaScript 動態插入目标連結很常见:頁面先加载一個空容器,再由脚本請求資料、拼接 HTML,最後把目标 URL 渲染出来。這样做頁面更灵活,但對搜尋蜘蛛来说,多了一道“是否执行脚本、执行到什么程度”的门槛。搜尋蜘蛛能不能發現這些連結,取决于它拿到的 HTML 里有没有可解析的連結,以及後續渲染是否成功。
搜尋蜘蛛會执行 JavaScript,但不是必然
主流搜尋引擎具备一定的 JavaScript 渲染能力,但渲染通常不是抓取的第一步。抓取程序往往先获取原始 HTML,把其中的連結加入待抓取队列;如果連結只存在于脚本执行後的 DOM 里,就要等渲染环节才有机會被發現。渲染可能因為资源限制、超时、頁面复杂度過高、接口返回慢或需要用戶交互而失敗。不同搜尋引擎、不同站点權重、不同抓取预算下,渲染覆盖也不一样。因此,動態插入的連結属于“可能被發現”,而不是“一定被發現”。
JS 插入的連結要满足哪些條件
- 連結最好以带 href 的 a 元素出現,而不是只给 div 绑定点击事件。没有 href 的“連結”對爬虫来说不是連結。
- 目标 URL 本身要可抓取:返回 200 狀態、没有被 robots.txt 禁止、没有 noindex,也不要依赖登入或 Cookie 才能訪問。
- JS 和 CSS 等渲染资源不要被 robots.txt 屏蔽,否則渲染可能不完整,連結也出不来。
- 連結不要放在必须点击、滚動或倒計时後才加载的模块里,爬虫不會主動做這些交互。
- 尽量在首屏同步脚本或服務端輸出的 HTML 中给出連結,减少二次請求和异步等待。
怎样驗證搜尋蜘蛛有没有看到這些連結
- 查看頁面源代碼,搜尋目标 URL 是否出現在初始 HTML 中。如果源碼里没有,說明連結完全依赖脚本生成。
- 使用搜尋引擎提供的 URL 检查或渲染測試工具,观察渲染後的 DOM 中是否出現目标連結。
- 看服務器日誌:搜尋蜘蛛有没有請求 JS 文件、資料接口,有没有在之後請求目标 URL。通常能看出它卡在哪一步。
- 做小范围對照測試:把同一批目标連結改成服務端輸出的静態 a 标簽,观察日誌中的發現和抓取差异。
實操建议:把發現渠道分散開
蜘蛛池入口頁的目标是让搜尋蜘蛛稳定發現目标 URL。最稳妥的做法,仍然是让連結直接出現在可抓取的初始 HTML 中;JavaScript 可以作為增强,但不宜成為唯一通道。如果前端架构必须依赖 JS,優先考虑服務端渲染、预渲染或静態化,至少保證首屏 HTML 里有真實 href。與此同时,可以用 sitemap、站内導航、其他静態入口頁等方式补充發現路径。多個渠道同时存在,某個环节失效时不至于整條鏈路断掉。
需要区分“發現”和“收錄”。連結被搜尋蜘蛛看到,只代表它有机會進入抓取队列;至于是否抓取、何时抓取、是否收錄,還受站点质量、内容價值、抓取预算等因素影响。動態渲染解决的是發現环节的一部分問题,不能替代對目标頁面本身的运营。
常见誤区
- 以為浏览器里能看到連結,搜尋蜘蛛就一定能看到。浏览器會完整执行脚本,爬虫可能不执行或延後执行。
- 把連結放在点击後才出現的彈窗、标簽頁或下拉菜單里,爬虫通常不會主動触發。
- 用前端路由的 hash 地址当作目标 URL,传统爬虫可能不把它当成獨立可抓取地址。
- 只检查渲染工具的结果,不看服務器日誌,忽略了抓取频率、超时和资源屏蔽問题。
總结:入口頁用 JavaScript 動態插入目标連結,搜尋蜘蛛不保證能發現。想让 URL 發現更稳定,優先让連結以可抓取的 a 标簽出現在初始 HTML 中;如果只能用 JS,就做好服務端渲染或预渲染,並用源碼检查、渲染測試和日誌来確認實际效果。