同一篇文章,浏览器地址栏里复制出来是一串带百分号的长地址,而编辑在后台填内链时写的是中文字符形式。这两种写法如果同时出现在页面里,蜘蛛大概率会把它们当两条 URL 分别入队。URL 编码本身不是问题,编码前后不一致才是。
蜘蛛拿到 URL 字符串之后做了什么
蜘蛛从 HTML 中提取 href 时,通常先按原样保留字符串,之后才做解析和规范化。这个顺序意味着:写链接时的“小随意”会先被当成不同字符串排队,之后才可能被归一化规则合并。而规范化的力度各家引擎不同,不适合当作兜底手段来依赖。
- href 里出现空格,解析常在空格处截断,链接后半段直接丢失。
- 中文、日文等非 ASCII 字符,有的抓取器会自动转成百分号编码,有的按原样记录。
- 查询串里的 & 未正确转义,参数可能被拆错,落地页变成另一个地址。
- 同一路径大小写混用、尾斜杠有无,都会先形成各自独立的入口。
中文路径的两种写法
含中文的目录或文章标题,实际存在两种常见形态:一种是页面源码里直接写中文字符,另一种是百分号编码形式。两者在浏览器地址栏看起来差不多,但作为字符串完全不同。建议站内链接统一成一种形式;如果 CMS 自动生成,就全站保持一致,不要一部分页面写中文、一部分写编码。
核对方法:随机抽取十几个含中文的页面,查看页面源码里的 href,确认是否为同一种形式;再对照服务器日志中实际收到的请求路径。
空格、加号与查询参数
href 中的空格应编码为 %20,直接留空会让解析在空格处断开。查询串里的加号在很多解析实现中等价于空格,如果参数值本身含有加号,通常要写成 %2B。这类细节不处理,容易让筛选页、站内搜索页产生一批形似而不同的地址,白占抓取资源。
内链书写与提交的核对清单
- 抽查首页、栏目页、详情页各若干,检查 href 是否含裸空格或未转义字符。
- 确认同一内容的链接形式统一:编码与否、大小写、尾斜杠三者取其一。
- 检查 Sitemap 中的 URL 与页面内链是否指向同一字符串。
- 核对 canonical 与内链指向的地址写法一致,避免两者各写一套。
- 在服务器日志中统计同一路径的不同编码形式,出现多种即说明存在重复入口。
服务器与日志侧的观察
有些服务器在收到编码后的路径时不做解码,直接按字面量去找文件,结果返回 404;而带中文的请求经过网关解码后又能命中。同一个页面两种结果,会让蜘蛛反复重试,也让人误判站点状态。
- 查看 Nginx 或 Apache 日志中的请求行,确认记录的是原始编码形式还是解码后的形式。
- 对含中文路径的站点,分别测试编码与未编码两种请求,比较返回码是否一致。
- 若出现大量同类 404,优先排查链接书写与解码配置,而不是先怀疑蜘蛛行为。
常见误区
有人以为“浏览器能打开就没问题”,但浏览器会自动补全和转义,蜘蛛不会替站点做这些决定。也有人为了美观把中文路径改成拼音或英文,这本身没问题,但改版时要把旧编码形式的地址做 301,否则旧入口会以 404 或软 404 的形式继续被请求一段时间。
总结一句:URL 编码是抓取链路上容易被忽略的一环,处理方式并不复杂——统一写法,核对三处(页面源码、Sitemap、服务器日志),发现异常返回码及时排查。