蜘蛛池入口页的核心任务很单一:让搜索引擎蜘蛛顺着页面里的链接继续往下走。链接能不能被发现,取决于蜘蛛实际拿到的那份 HTML 里有没有它们。现在不少入口页用前端框架搭建,链接要等浏览器跑完脚本才生成,蜘蛛如果只读原始 HTML,等于看到一张空页。
蜘蛛拿到的是原始 HTML,还是渲染后的页面
主流搜索引擎的渲染能力都在提升,但渲染是有成本的:它需要排队、需要额外资源,通常只在页面被认为值得渲染时才执行。对蜘蛛池这类以量取胜的入口页来说,指望每一个页面都被完整渲染并不现实。更稳的思路是:把关键链接直接写在服务端输出的 HTML 里,让蜘蛛第一眼就能看到,而不是赌它愿不愿意多跑一步。
三种最常见的链接藏在脚本里
点击后才插入的链接
有些入口页为了看起来干净,把正文折叠起来,用户点一下才通过脚本插入链接。人看得见,蜘蛛看不见。这类设计在入口页上几乎没有收益,反而把唯一有价值的输出挡住了。
无限滚动与加载更多按钮
列表页用滚动加载,或者放一个按钮异步取下一页。蜘蛛一般不会去点按钮,也不会主动滚动到底部。结果就是只有第一屏的几条链接能被发现,后面的都被截断。
接口返回 JSON,前端再拼列表
页面本身是空壳,数据由接口返回,链接在浏览器里才被拼成 a 标签。这种结构对用户友好,对蜘蛛不友好。要么把列表在服务端渲染好,要么在 HTML 里保留一份静态的链接列表。
让链接回到 HTML 里的几条路
- 服务端渲染:把链接在服务端拼好再输出,最直接,也最省事。
- 预渲染或静态化:构建时生成好静态 HTML,内容更新频率不高时很划算。
- 静态兜底页:主页面用脚本没问题,但额外给一份纯 HTML 的链接清单页,作为补充入口。
- HTML 里保留基础导航:即使脚本挂了、渲染失败,也还有一批链接能被读到。
不需要全部用上,选一条和现有技术栈匹配的即可。关键是保证服务端输出的源码里,能看到指向下一层的 a 标签。
几个容易判断错的地方
- 用浏览器工具看页面没问题,就以为蜘蛛也没问题。 开发者工具里看到的是渲染后的 DOM,不是蜘蛛最初拿到的响应体,要看的是查看网页源代码。
- 在 noscript 里塞链接。 它的作用有限,很多抓取流程并不会把它当成正常链接来源,当成唯一的兜底手段很危险。
- 链接用 JS 跳转代替 a 标签。 无论是 onclick 跳转还是 window.location,对链接发现都没有帮助。
- 渲染服务开了就万事大吉。 渲染失败、超时、返回空壳的情况并不少见,缺少日志时很难发现。
自检清单
- 关掉 JS,或用抓取工具看原始响应体,页面上还能看到几条链接?
- 入口页指向下一层的链接,是否都在源码里,并且是标准的 a 标签?
- 加载更多里的内容,有没有一个静态的、可直达的列表页版本?
- 日志里蜘蛛请求的是入口页 HTML,还是大量请求接口地址?
判断标准可以很简单:把浏览器的 JS 关掉,如果入口页几乎不剩什么链接,那蜘蛛大概率也只能看到这些。渲染能帮忙,但不该是唯一的指望。