很多站点上线时为了可读性,直接把中文标题放进 URL,或从后台复制带空格的链接。浏览器能打开,不代表爬虫能稳定抓到。URL 编码处理不当,会带来一系列收录问题。
浏览器会自动编码,但爬虫看到的是另一层
在地址栏输入含中文或空格的 URL,浏览器通常会在发送请求前自动做百分号编码。你复制出来的可能仍是中文,实际请求已经变成 %E4%B8%AD 之类。服务器日志里记录的也是编码后的形式。如果站内链接、sitemap 和 canonical 里混用了未编码与已编码两种写法,爬虫就会把它们当成不同 URL。
- 未编码:https://example.com/标签/网站收录
- 编码后:https://example.com/%E6%A0%87%E7%AD%BE/%E7%BD%91%E7%AB%99%E6%94%B6%E5%BD%95
两者在多数系统里不自动等价。若都返回 200,容易形成重复内容;若其中一种 404,则部分入口会失效。
最容易出问题的几类字符
空格与加号
空格在 URL 中应编码为 %20,而不是直接留空或用 + 代替。+ 在查询字符串里常被解释为空格,在路径中却可能被当作普通字符。内链里出现空格,复制到某些编辑器或模板后会被截断。
& 与参数分隔
& 是查询参数的分隔符。如果参数值本身包含 &,必须编码为 %26,否则爬虫会把后半段当成新参数。比如 ?q=a&b 会被解析成 q=a 和 b 两个参数,页面内容可能完全不同。
# 片段标识
# 之后的内容不会发送给服务器,只用于页内定位。如果误把筛选条件写在 # 后面,爬虫和服务器都看不到这个条件。单页应用用 hash 路由时,要确认是否有对应的可抓取 URL。
百分号大小写与双重编码
%E4 与 %e4 在部分系统里被视为不同字符串。更麻烦的是双重编码:%25E4 表示的是字面量 %E4,而不是“中”。一旦链接被多次编码,服务器解码后得到的可能是错误路径。
编码问题会怎样伤到收录
- 同一内容对应多条 URL,权重分散,canonical 难以统一。
- sitemap 里提交的是编码地址,站内链接指向未编码地址,爬虫在两者之间反复切换,抓取预算被浪费。
- 日志里同一页面出现多种编码形态,统计抓取频次和状态码时容易误判。
- 部分编码写法返回 404 或 500,导致本可收录的页面被排除。
- 分享、外链和统计工具记录不一致,后续排查来源时对不上号。
自查:从日志和模板两头看
先不要急着批量替换。可以按下面顺序确认。
- 导出服务器日志,筛选包含百分号、中文或空格的请求,看状态码分布。
- 在 Search Console 的页面报告或索引覆盖里,找“已发现但未编入索引”“重复网页,用户未选定规范网页”等状态,观察是否集中在带编码的 URL。
- 抽查站内链接、导航、分页、面包屑、sitemap 和 canonical,确认同一页面是否出现两种以上写法。
- 用抓取工具或 curl 直接请求未编码与已编码地址,对比返回状态和最终 URL。
- 检查后端路由和 CDN 规则,确认解码顺序与重写规则是否一致。
修复顺序:先统一,再重定向
如果已经产生两种以上可访问写法,比较稳妥的处理是选一个规范版本,其余 301 到规范版本。规范版本建议使用小写、已编码、不带多余参数的绝对地址。不要只改 sitemap,而放任站内链接继续混用。
- 模板里的链接统一走编码函数,避免手工拼接。
- sitemap 与 canonical 使用同一套生成逻辑。
- 服务器对错误编码返回 404 还是 301,要想清楚,避免把有效页面误伤。
- 更新后观察日志中两种写法的请求量是否逐步收敛。
URL 编码不是洁癖,它决定了爬虫、服务器和统计系统看到的是不是同一个地址。先把地址统一,再谈收录和索引,会少很多来回。
URL 里出现中文、空格和特殊符号并不必然导致不收录,但会给抓取、去重和索引带来额外噪声。把编码规范固定下来,让站内入口、sitemap、canonical 和日志里的地址一致,是比反复提交更有效的做法。