做蜘蛛池入口页时,很容易踩一个坑:页面看上去有链接,但搜索蜘蛛根本没把它当成链接。问题往往不在链接指向哪里,而在链接是怎么写出来的。
搜索蜘蛛识别链接,先看 HTML 源码
抓到一个页面后,第一步是拿到 HTML 源码。在这一步里能被稳定识别的链接形式,基本只有 a 标签加 href 属性。锚文本是什么、在页面里长什么样,都不影响能不能顺着爬,只要 href 能被解析出来就行。
JS 渲染后才出现的链接就不一样了。不少搜索引擎会做二次渲染,但这件事并不免费:渲染要排队、要消耗额外资源,而且不保证每个页面都会被渲染。所以「渲染后能看到」不等于「一定能被抓到」。
几种常见写法,实际表现差别很大
1. 纯文本 URL
页面上直接写 example.com/page 这种形式,对人有用,对蜘蛛则属于不确定信号。部分搜索引擎会做 URL 抽取,但这是附加能力,不是标准行为,也不保证会进入抓取队列。把它当作辅助提示可以,当成主要的链接来源不可靠。
2. 用 JS 拼接或动态插入
例如先取变量拼成地址,再插进 DOM。这种链接在原始 HTML 里根本不存在,必须等渲染。入口页本身如果抓取预算已经很吃紧,再叠加渲染成本,往往得不偿失。
3. onclick、button、data-href
这些是交互写法,搜索蜘蛛不会把它们当成链接。用户点了能跳,蜘蛛看到的却不构成一条可爬的路。
4. 图片、CSS 背景图、图标按钮
图片的 src 是资源请求,不是页面链接。除非外面包了 a 标签,否则不算一条可跟随的链接。
想让链接被稳定识别,按这几条来
- 使用标准的 a 标签加 href 属性,href 写成完整可访问的地址。
- 链接尽量出现在原始 HTML 中,不要依赖渲染后才生成。
- 不要用 JS 跳转替代 a 标签,那属于用户行为,不是链接信号。
- 同一页面里同类链接别堆太多,宁可少而稳定。
- 链接所在页面自己能正常返回 200 且内容可解析,否则后面的事都无从谈起。
几个容易想当然的误区
「页面上明明写了 URL,为什么日志里看不到蜘蛛来?」先确认那个 URL 是不是真的以 a 标签形式存在,而不是一段文本或 JS 变量。
- 以为文本里出现 URL 就等于给出了链接。
- 以为渲染后的 DOM 和原始 HTML 在蜘蛛眼里是一回事。
- 以为链接放在弹窗、折叠块、Tab 里,蜘蛛也会点开——它不点,只是解析。
折叠内容如果本来就写在 HTML 里,通常还能被解析到;但如果是点击后才异步加载的,性质就完全变了。
怎么验证
- 用抓取工具或命令行取一次原始 HTML,禁用 JS,看链接在不在源码里。
- 对比渲染前和渲染后的 HTML,判断有多少链接依赖渲染才能出现。
- 查自己入口页的访问日志,确认搜索蜘蛛是否请求过那些目标 URL。没有请求,就先别急着怀疑索引问题。
入口页的作用是把路径铺好,铺得越标准,蜘蛛越省事。写法上的小差别,有时候就是「能被发现」和「发现不了」之间的分界线。