URL 是爬虫进入页面的入口。字符写法不统一,同一个页面就可能以多个地址被抓取,也可能直接抓不到。中文、空格、大写字母、尾斜杠这些细节,在浏览器里几乎看不出来,在日志和索引里却会放大成重复地址和抓取浪费。
一、URL 里常见的四类字符问题
中文和空格
在地址栏输入中文或空格,提交时会自动转成百分号编码。问题在于,分享出去的链接可能保留原文形式,也可能已经是编码后的形式。如果服务器只处理其中一种,另一种就会返回 404;如果两种都能正常打开,就会形成两份内容相同的地址。
大小写
域名不区分大小写,但路径通常区分。/News/2024 和 /news/2024 在多数服务器上是两个不同地址。程序生成链接时随手写了大写,或者用户手动输入时首字母大写,都会额外产生变体。
保留字符
& = ? # 这些符号在 URL 里有固定含义。如果标题里自带 & 或 #,没有正确编码就拼进路径,参数会被截断,锚点会被当成页面片段,请求到的内容和预期可能完全不同。
尾斜杠与默认文件名
目录型 URL 加不加结尾斜杠,以及 /index.html 与根目录,很多站点会同时返回 200。这些写法会被当成多个地址,最终要靠规范化处理来收敛。
二、编码不一致会带来什么
- 重复内容:同一篇文章出现编码版和原文版两个地址,点击和权重被拆散。
- 抓取浪费:爬虫把时间花在跳转和重复变体上,真正需要更新的页面被推迟。
- 信号互相矛盾:内链指向一个地址,站点地图写另一个,canonical 又指向第三个。
三、收敛顺序:先统一,再跳转,最后看日志
- 固定生成规则。让模板、CMS、接口输出 URL 时统一大小写、统一百分号编码、统一是否带尾斜杠,尽量输出绝对地址。
- 服务器兜底。对已经存在的变体做 301 跳转到规范地址,不要长期用 302。
- 页面级声明。在规范 URL 上写 canonical 并指向自身,变体页面不要自指。
- 对外渠道统一。内链、站点地图、RSS、分享按钮都使用同一形式,避免再次制造变体。
- 用日志核对。筛选状态码为 301、404 的 URL,以及同一路径的不同写法,确认数量在下降。
四、几个容易踩的边界
- 中文路径本身不是错误,但要确认服务器、日志分析工具和站点地图都能正确处理编码后的形式。
- 大小写跳转要避开静态资源。图片、CSS、JS 的路径在部分环境中区分大小写,改错会直接导致页面白屏。
- 带参数的筛选、排序链接,不要只靠 canonical 硬压,先判断这些地址是否真的需要被抓取。
- 不要为了“看起来干净”批量重写历史 URL,老地址没做跳转就下线,已经收录的页面会直接丢掉。
URL 字符问题很少单独造成明显波动,但会持续制造重复地址和抓取浪费,属于典型的“小毛病、长期消耗”。
五、从哪一步开始
如果站点规模不大,可以先做三件事:导出服务器日志里返回 301 和 404 的 URL,看哪些属于编码变体;用索引报告核对同一篇文章是否存在多个地址;检查站点地图和主导航里的链接写法是否完全一致。这三步做完,通常就能定位大部分字符层面的收录问题,再按前面的顺序逐条收敛,并在一段时间后用日志复查效果。