常见問题

入口頁連結里的中文和空格没做 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 当成程序要處理的字符串来對待,輸出前统一编碼、统一格式,再用标准解析函數驗證一遍,比反复猜测蜘蛛會不會跟過去要靠谱得多。