给蜘蛛池入口页加链接时,有人会在 URL 后面顺手带上 # 片段:有的是想指向目标页面的某个位置,有的是沿用了前端路由的写法。这类片段在浏览器地址栏里看得到,但放到搜索蜘蛛那一侧,它几乎不会改变什么。
片段不会发给服务器
URL 里的 # 及其后面的内容,按规范属于由客户端处理的片段标识,浏览器不会把它放进 HTTP 请求发给服务器。搜索蜘蛛抓取时遵循的是同一套规则:解析到带 # 的链接后,请求的实际路径会停在 # 之前,后面的部分被丢掉。也就是说,某个 URL 后面接 #a 还是接 #b,对爬虫而言都是同一个地址。
它既不增加发现机会,也不额外消耗配额
由此可以推出两个常见误解:
- 带不同 # 的链接不会各自算成新 URL,不会凭空多出几次发现机会;
- 同时也不会因为多写了几种片段就吃掉抓取配额,爬虫不会对同一个路径反复请求。
换句话说,片段对“目标 URL 有没有被看到”这件事基本是中性的,用不用都不影响发现,只是没必要把它当成技巧。
那前端路由里的 #!/path 呢
这里的边界稍微模糊一点。有些站点用 #!/ 或 #/ 做路由,真正的页面路径藏在片段里。主流搜索引擎对这类写法有一定处理能力,会尝试渲染页面并识别等价路径,但这个环节并不稳定,取决于渲染资源是否到位、实现是否规范,也不适合当成一条可控的发现通道。
如果入口页上的链接恰好是这种形式,比较稳妥的做法是同时给出对应的真实路径版本,让爬虫不必依赖片段解析。
怎么确认爬虫请求里到底带了什么
想验证的话,看服务器访问日志就够:
- 找到入口页对应的请求记录,查看搜索蜘蛛请求的完整路径;
- 确认路径里是否出现 # 及其后面的内容,正常情况下几乎不会出现;
- 对比同一路径的请求次数,如果带不同片段的链接没有让请求数变多,说明处理方式和预期一致。
如果日志工具本身对 # 做了截断,也可以做一次最小实验:在入口页放两个只差片段的链接,看日志里产生一条还是两条请求记录。
真正值得花心思的地方
片段本身没什么可优化的空间,与其纠结它,不如把精力放在更直接影响发现的因素上:
- 链接是否出现在 HTML 可解析的位置,而不是只靠脚本或交互才出现;
- 入口页能否正常返回,响应是否稳定,是否存在长时间超时;
- 链出的目标 URL 是否唯一、可直接访问,有没有绕来绕去的重定向链条;
- 入口页本身是否还在被搜索蜘蛛定期回访。
片段是给浏览器看的,不是给爬虫看的。把 URL 的“真实部分”做干净,比在片段上做文章有用得多。