先说结论:该轉的要轉,但關键是別轉两次
搜尋蜘蛛抓取时,會把 URL 按規范做百分号编碼(percent-encoding)後再發請求。中文、空格、引号、與号這類字符如果不编碼就寫進連結,浏览器、編輯器、CMS 各自按自己的規則补全,最终可能生成两個甚至更多地址,指向同一個頁面却被当成不同 URL 統計。所以投放前要做编碼處理,但重点不在“轉不轉”,而在统一:入口頁上寫的是什么形式,目标站内部連結和服務端接收的就该是什么形式。
编碼不统一會带来什么問题
- 浏览器地址栏顯示的是已解碼的中文,複製出来却可能是编碼後的形式,两種寫法混用;
- 不同工具預設規則不一样,有的把中文轉成 UTF-8 百分号编碼,有的按 GBK 處理;
- 服務端按错誤字符集解碼时路径匹配失敗,返回 404,或者干脆 302 跳到首頁。
结果就是:連結本身能打開,但每次打開的都可能是“另一個地址”,抓取和統計對不上。
投放前建议逐項检查
检查一:有没有双重编碼
例如把已经编碼過的串再编一次,百分号本身變成 %25,服務端解碼一次得到的是字面的百分号字符串,路径自然對不上。批量生成連結後,抽样在浏览器里打開,看地址栏變化和返回内容是否正常。
检查二:空格與特殊符号
空格應编碼為 %20,加号只在查询串中按 application/x-www-form-urlencoded 的语义表示空格,用在路径里容易出错。井号後面的部分属于片段,不會發送给服務器,如果頁面渲染依赖井号後的參數,蜘蛛抓到的永遠是片段之前那個地址。
检查三:大小寫、尾斜杠、預設端口
Linux 环境下路径通常区分大小寫,尾斜杠同理,带與不带可能各自返回 200,形成重复。這些不算编碼問题,但和编碼一样都属于“同一頁面對應多個 URL”的范畴,投放前最好定死一種寫法,其余用跳轉或 canonical 收敛。
检查四:字符集声明是否一致
頁面里的 charset 声明或响應头里的字符集,要和實际輸出一致。声明 UTF-8 實际輸出 GBK,入口頁上的中文連結在解析阶段就可能變形。
怎么快速驗證
- 用 curl 直接請求编碼後的地址,看返回碼是不是 200,有没有 Location 跳到別處;
- 在服務器日誌里按搜尋蜘蛛 UA 過滤,看它請求的路径是编碼形式還是原样中文;
- 把 sitemap 里的寫法和頁面内鏈寫法對一遍,不一致时以能稳定返回 200 的那個為准,然後统一到這一種。
编碼問题的本质不是“能不能抓”,而是“抓到的是不是同一個地址”。同一頁面被拆成多個 URL,抓取预算和權重都會被摊薄,反馈到資料上就是投了却看不出變化。
投放时具体怎么處理
入口頁和目标連結尽量都使用已编碼、且服務端能正确解碼的形式。如果目标站自己都處理不好中文路径,與其反复調编碼,不如把固定連結改成 ID 或拼音形式,長期更省事。歷史頁面已经存在多種寫法时,先用 canonical 指向規范地址,再按規范地址投放,不要几種形式一起投,否則等于自己制造重复 URL。
一個容易忽略的邊界
URL 轉碼問题通常和服務器配置、CMS 路由規則绑在一起,不是蜘蛛池那一侧能解决的。投放前如果發現非 ASCII 路径大面积異常,先修站点,再谈 URL 發現,顺序反了就是白做。