爬虫部署到 Linux 服务器后出现中文乱码,通常是服务器 locale 设置、Python 脚本编码声明或 SSH 终端编码不一致导致的。最推荐的处理方向是统一服务器环境为 UTF-8,并在代码中显式指定编码格式,风险边界在于修改系统 locale 可能影响其他服务,建议先在测试环境验证。
先说结论:乱码本质是编码链断裂,需同步系统、脚本、终端三端设置。
- 适合:Linux 服务器部署爬虫且涉及中文数据处理场景
- 先准备:检查当前 locale 状态与 Python 脚本编码声明
- 验收:以日志输出中文正常且无报错为准
命令速用版
以下命令可快速检查并临时设置编码环境,适用于大多数 Linux 发行版:
# 查看当前系统编码设置
locale
# 临时设置当前会话为 UTF-8
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
# Python 脚本中强制指定编码
import requests
response = requests.get(url)
response.encoding = 'utf-8' # 或 response.apparent_encoding
为什么会这样
Linux 中文乱码不是单一问题,而是编码链上多个环节断裂的结果。
服务器默认可能使用 POSIX 或 en_US 编码,而爬虫抓取的内容多为 UTF-8 或 GBK,若系统 locale 未声明支持中文,程序输出到终端或日志时就会变成问号或方块。此外,SSH 客户端(如 Xshell、PuTTY)若未设置为 UTF-8 解码,即使服务器设置正确,本地显示依然会乱码。
分步处理
1. 检查并设置系统 locale
执行locale命令,若 LANG 或 LC_CTYPE 显示为 C 或 POSIX,需生成中文 locale。
Ubuntu/Debian 系统运行sudo locale-gen zh_CN.UTF-8并修改/etc/default/locale;CentOS/RHEL 系统修改/etc/locale.conf写入LANG=zh_CN.UTF-8。
2. 修正爬虫代码编码处理
Python 爬虫需显式处理响应编码。使用 requests 库时,不要依赖默认解码,建议根据网页 meta 标签或apparent_encoding属性设置response.encoding。
若抓取内容包含 HTML 实体,需使用html.unescape还原。
3. 同步 SSH 终端编码
远程连接工具必须与服务端编码一致。PuTTY 在 Window → Translation 选 UTF-8;SecureCRT 在 Session Options → Appearance 设 Character Encoding 为 UTF-8。
怎么验证是否生效
在终端执行locale确认输出包含zh_CN.UTF-8。
运行爬虫脚本打印中文测试字符串,观察终端显示是否为正常汉字而非问号。
检查爬虫日志文件,使用file `--mime-encoding` logfile.log确认日志文件编码为 utf-8。
常见坑
- SSH 环境变量覆盖:客户端可能发送 LANG=en_US 覆盖服务器设置,需在
/etc/ssh/sshd_config注释掉 AcceptEnv LANG。 - 文件名乱码:iconv 只能转文件内容,文件名乱码需用 rsync `--iconv` 或 mv 重命名。
- Vim 编辑配置:若用 Vim 修改脚本,需确保 Vim 自身编码为 utf-8,避免保存时损坏文件。
常见问题
设置了 LANG 为什么还是乱码?
可能是 SSH 客户端编码未同步或 LC_ALL 变量覆盖了 LANG 设置。
爬虫日志文件乱码怎么解决?
检查日志写入时的编码参数,Python 打开文件需指定 encoding='utf-8'。
CentOS 7 找不到 zh_CN.UTF-8 怎么办?
需安装语言包,运行 yum groupinstall "Chinese Support" 生成对应 locale。
参考来源
- Linux 怎么解决中文乱码问题 Linux 系统语言编码设置详解
- 如何解决网络爬虫抓取中文页面时的乱码问题?
- Linux 系统解决中文乱码问题详细教程 (全网最详细,看完包懂)