不少人搭好入口頁後检查一遍:浏览器打開,目标 URL 的連結一條不少、点着都能跳。可抓取日誌里始终没有蜘蛛来過的痕迹。問题往往不在蜘蛛池本身,而在于這些連結是用 JavaScript 在客戶端拼出来的——搜尋引擎爬虫第一次拿到的,通常是没有执行脚本的原始 HTML。
蜘蛛拿到的第一份内容是什么
主流搜尋引擎的抓取流程大致分两步:先請求並儲存服務端返回的原始 HTML,把其中的 URL 放進待抓取队列;至于脚本执行和頁面渲染,属于後續按需處理,成本更高、排队更久。對入口頁這種纯連結集合的頁面来说,如果原始 HTML 里一條 href 都没有,URL 發現這一步實际上就没有發生。
常见的高風險寫法包括:
- 源碼里只有 script 标簽和一個空的容器 div,連結全靠前端框架渲染
- 用点击事件绑定跳轉,a 标簽没有 href,或者寫成 href="javascript:void(0)"
- 連結地址存在接口返回的 JSON 里,頁面加载後再异步插入
- 依赖懒加载,連結要滚動到可视区域才生成
JS 渲染不是完全没机會,但不该当成主路径
具备渲染能力的搜尋引擎确實有机會执行脚本、讀到渲染後的連結。但這里有前提:渲染服務要有額度、頁面要在超时時間内加载完、脚本和样式文件不能被 robots.txt 拦掉。任何一环出問题,連結就等于不存在。
比較常见的失敗环节
- robots.txt 屏蔽了 js 或 css 目錄,渲染出来的 DOM 不完整
- 脚本依赖境外 CDN,抓取节点加载超时
- 渲染队列积压,入口頁這類低優先級頁面被排到很後面
- 頁面在無头环境中报错,接口請求被風控拦截
渲染是一項有成本、有條件的能力,不是預設承诺。把 URL 發現全押在它身上,等于把结果交给別人当天的负载情况。
更稳的做法:让連結出現在原始 HTML 里
- 改成服務端輸出。入口頁用後端模板或静態生成,連結在返回 HTML 时就寫進 a 标簽,不依赖任何脚本。
- 保持最朴素的連結结构。一個 a 标簽、一個可訪問的 href,不加 onclick、不套多层容器。相對路径和绝對路径都可以,關键是連結真實存在。
- 保留一條 sitemap 通道。sitemap 和入口頁連結是两條並行的 URL 發現路径,互為补充,不要只留一條。
- 不要為了保險而堆砌。入口頁動辄几千條連結反而會分散抓取,控制數量、保證每條都能正常打開更有意义。
怎么判断自己的入口頁有没有這個問题
最直接的办法是用 curl 之類的工具拉一次源碼,搜尋 href 看連結是否出現在原始响應里。如果源碼里干干净净、只有脚本,那就基本可以確認。也可以借助搜尋资源平台的抓取測試工具查看返回的 HTML,或者检查訪問日誌里有没有對 js、css 文件的請求记錄——如果连這些资源都没被請求過,說明渲染大概率没發生。
几個容易忽略的细节
- 連結被 JS 寫進 DOM 之後,還要看是否存在 href 属性,纯文本或 data 属性不算連結
- 入口頁如果做了移動端适配,注意两套 DOM 輸出的連結是否一致
- 改動後给一点時間再观察日誌,抓取行為的反馈通常不是即时的
總结起来一句话:蜘蛛池能起作用的前提,是目标 URL 真正出現在蜘蛛能直接拿到的 HTML 里。把連結從脚本里搬回源碼,是投入产出比最高的一步排查。