常见问题

入口页链接里的中文和空格没做 URL 编码,搜索蜘蛛还能跟到目标 URL 吗

入口页链接里出现中文、空格、未转义的 & 或孤立的 %,浏览器能打开并不代表搜索蜘蛛会按同样方式解析。这篇文章说明抓取程序解析 URL 的基本顺序、几种常见写法的实际表现、如何用标准解析函数自查,以及服务端输出链接时应该怎么编码。

常见问题

入口页链接里的中文和空格没做 URL 编码,搜索蜘蛛还能跟到目标 URL 吗

入口页里的链接既要给人点,也要给蜘蛛看。当链接地址里出现中文、空格、括号、& 这类字符,而 HTML 里又没做 URL 编码时,不同抓取程序给出的结果可能并不一致:有的能正常解析,有的会截断,还有的干脆跳过整条链接。这不是玄学,而是 URL 解析规则和浏览器容错能力之间的差距。

搜索蜘蛛解析链接的大致顺序

一条链接被发现的流程通常是:读取 href 里的原始字符串,按文档编码把非 ASCII 字符转成字节,与页面 base 或当前地址拼成绝对 URL,再做规范化(大小写、默认端口、路径中的点段、百分号编码统一),最后去重后进入抓取队列。

浏览器为了兼容写得糟糕的网页,做了大量容错,能猜就猜。抓取程序一般更严格,遇到它认为非法的字符,常见处理是截断、丢弃整条链接,或者按自己的规则转义后再试一次。所以同一个链接,浏览器能打开,不代表蜘蛛一定按你预期的方式跟过去。

几种常见写法的实际表现

路径或参数里有空格

href 写成 /news/my page.html 这种形式,规范做法是把空格写成 %20。不少解析器会把空格当成 URL 的结束标志,于是实际请求的是 /news/my,后面的文件名被丢掉,结果是 404 或者一个不相关的页面。

中文路径或中文参数

href 里直接写中文,是否被正确编码取决于解析器按什么字符集处理。有的会按 UTF-8 编码成 %E8%9C%98%E8%9B%9B%E6%B1%A0 这样的形式,有的会按本地编码处理,生成一个完全不同的地址。同一个链接在不同环境下指向不同 URL,这是最容易埋雷的一种情况。

& 没有转义成 &

查询参数里出现多个 & 时,HTML 解析阶段会把它当作实体开头。大多数解析器会容错,但严格解析时可能吞掉一部分参数,导致抓到的地址缺少必要参数,返回错误页。所以属性值里的连接符要按 HTML 规则转义,这一步和 URL 编码不是同一件事。

单独出现的 % 或不成对的 %xx

一个孤立的 % 后面不是两位十六进制数字,属于非法的百分号编码。有的解析器直接报错丢弃,有的原样保留,等到真正请求时被服务端返回 400。

怎么快速自查入口页

  1. 抓取入口页 HTML,把所有 href 抽出来,逐条用标准解析函数跑一遍,比如把相对地址和页面地址做一次 urljoin,看结果是不是和你想的一样。
  2. 直接搜索 href 里是否存在空格、中文、未转义的连接符、孤立的百分号。
  3. 拿抓取日志核对:蜘蛛实际请求的路径,和入口页里写的路径能不能一一对应。
  4. 看 400 和 404 的占比。编码问题往往表现为一批 URL 集中报错,或者多个链接最后都落在同一个地址上。

修复建议

  • 服务端输出链接时就做编码,路径段和查询参数分开处理,用对应的编码函数,不要靠手工拼字符串。
  • HTML 属性里的连接符按 HTML 规则转义,URL 部分按 URL 规则编码,两步都要做,不能只做一步。
  • 参数值尽量别用中文和空格,能换成 ID、拼音或英文短词的,就不要留中文。
  • 入口页内的链接格式尽量统一,协议、是否带 www、结尾有没有斜杠都保持一致,减少同一目标出现多条地址的情况。
  • 改完后重新让蜘蛛抓一次入口页,把修复前后的 URL 列表拉出来对比,确认差异符合预期。

别把编码问题当成收录问题的全部

编码写对,只保证蜘蛛看到的地址和你想要的一致。抓取频率、内容质量、站点整体情况才是决定收录的主要变量。修好编码,日志里的请求路径会干净很多,但不等于收录马上变好。

小结

入口页链接的编码问题,本质是「浏览器容错」和「解析器严格」之间的差异。把 href 当成程序要处理的字符串来对待,输出前统一编码、统一格式,再用标准解析函数验证一遍,比反复猜测蜘蛛会不会跟过去要靠谱得多。