做站内结构的时候,很多人会把“页面上有多少入口”和“蜘蛛能走多少条路”当成一回事。实际跑一遍抓取日志就会发现,两者差距常常不小:导航里明明有二十个链接,蜘蛛只走了十二个;列表页上有翻页按钮,它一次都没点。问题多数不出在结构设计上,而是出在链接的写法上。
蜘蛛判断“能不能走”,基本只看 href
对绝大多数搜索引擎蜘蛛来说,一条链接是否可抓取,最核心的判断依据是页面的 HTML 里有没有一个带有效 href 的 a 标签。它在解析阶段拿到的是一份 HTML,不是渲染之后、也不是用户点击之后的 DOM。所以凡是需要“点一下才生效”的东西,对蜘蛛来说都可能不存在。
href 里的地址也要是蜘蛛能直接请求的形式。写成 href="javascript:void(0)"、href="#"、href="" 这类,等于告诉蜘蛛这里没有目标地址。后面挂一个 onclick 或者 data-href,浏览器会跳,蜘蛛不会。
四种常见的“人点得动、蜘蛛走不了”
1. 用 JS 做跳转
onclick="location.href=..." 或者给 div 绑一个点击事件,是最常见的写法。用户点击没问题,但 HTML 里没有可抓取的地址。如果这类跳转遍布列表页和分类页,站内很大一块 URL 就只能靠外链或 Sitemap 被发现,抓取频次通常也会明显偏低。
2. 按钮和伪链接
把导航做成 button,或者用 div 加 role="link" 模拟链接,样式上更自由。如果里面的 a 标签 href 还在,问题不大;一旦为了样式方便把 a 换成 div,可抓取性就丢了。判断标准很简单:源码里有没有那个 a 和 href。
3. 渲染后才生成的链接
前端框架的项目里,列表项的 href 常常是客户端渲染后才挂上去的。能不能被抓到,取决于搜索引擎是否对该页面做了渲染、渲染后的内容是否进入索引流程。这中间有延迟,也有不确定性,不适合当成稳定的 URL 发现通道。对重要的分类页、详情入口,尽量让链接出现在初始 HTML 里。
4. 被主动挡掉的链接
rel="nofollow"、rel="ugc"、rel="sponsored",在 robots.txt 里屏蔽掉的目录,以及页面里被 meta robots nofollow 覆盖的区域,都会让蜘蛛即使看到 href 也选择不走。这类“挡”很多时候是历史遗留:早期为了防止权重流失,给评论区、筛选区都加了 nofollow,后来结构改了却没清理,结果把本该被发现的一批 URL 也一起挡住了。
锚文本和位置,影响它“愿不愿意走”
能走和愿意走是两件事。蜘蛛在决定一条 URL 的抓取优先级时,会参考链接所在的位置、锚文本的信息量,以及这个链接在全站的分布情况。
- 位置:全站导航、面包屑、正文首屏的链接,通常比页脚一大片、侧栏推荐位更容易被优先处理。
- 锚文本:写着“点击这里”“更多”的链接信息量低;写清目标主题的锚文本,既帮助蜘蛛理解目标页,也帮助它判断这个 URL 值不值得抓。
- 重复度:同一个 URL 在页面里出现十几次、每次锚文本都不一样,不会让蜘蛛多抓几遍,反而可能拉低整页的链接信噪比。
- 上游页面本身的抓取情况:一条链接放在很少被抓的深层页上,即使写法完全标准,也可能长期排在待抓队列后面。页面收录少,有时不是链接写法的问题,而是入口页本身就被抓得少。
怎么自查
- 关掉 JavaScript,直接查看页面源码,看关键入口是否还在。还在的链接,基本都能被抓到。
- 用抓取工具跑一遍站内核心路径,对比“页面上的链接数”和“实际能跟到的 URL 数”,差在哪一栏,通常问题就在哪一栏。
- 对照抓取日志,看蜘蛛是否访问过某个入口的目标页。如果整块目录几乎没有蜘蛛访问记录,先查该目录上游链接的写法,而不是急着单独提交 URL。
- 检查 robots.txt 和页面级 nofollow 的历史配置,把已经不再需要的屏蔽规则清理掉。
链接可抓取性是 URL 发现的地基。地基上少一个入口,后面补多少条外链和 Sitemap 都只能算补救。
处理顺序上的建议
不用一次把全站翻新。优先处理三类:一是全站导航和面包屑这类主路径上的链接,二是分类页、列表页里指向详情页的链接,三是新栏目上线时新铺的入口。这三类写法标准了,站内大部分 URL 的发现通道就通了。其余部分,比如页脚、侧栏、活动位,可以按抓取日志的实际表现慢慢调,没必要为了“看起来干净”大动干戈。