前言在爬虫数据采集过程中网页源码、接口返回内容出现中文乱码是极为普遍的问题。乱码会导致文本数据无法正常解析、关键字提取失败、内容展示异常严重影响数据采集的准确性与可用性。网页乱码的本质是字符编码规则不匹配不同网站、不同服务器、不同静态资源会采用 GBK、GB2312、UTF-8、ISO-8859-1 等多种编码格式若爬虫程序解码方式与网页原始编码不一致字符就会出现错位、问号、方框等乱码形态。requests库虽具备自动编码识别能力但受网页标签不规范、响应头缺失编码标识、混合编码等因素影响自动识别常常出现偏差。本章从字符编码基础理论出发梳理主流网页编码格式、乱码产生的核心诱因结合多场景实战代码讲解自动修正、手动指定编码、二进制转码、编码探测等全套解决方案同时总结不同类型网页、接口、文件的编码处理规范形成可直接复用的编码处理模板。文中相关参考链接如下字符编码标准参考https://www.unicode.org/在线编码识别与转换工具https://www.charset.org/requests 编码机制官方说明https://docs.python-requests.org/en/latest/user/quickstart/#response-content一、网页主流编码格式基础认知1.1 核心编码格式介绍互联网网页使用的字符编码种类有限爬虫开发中只需重点掌握四类主流编码理解其适用范围、字符集特点与使用场景是解决乱码问题的前提。表格编码格式字符集范围主要使用场景特点说明UTF-8全球所有语言字符包含中文、英文、日文、符号等现代网站、移动端页面、接口数据、国外站点、开源项目通用性最强无字符限制目前行业主流编码GBK简体中文、繁体中文、日文、部分特殊符号国内传统企业网站、老旧资讯站、地方门户、部分论坛中文存储体积更小仅适配中文体系字符GB2312仅简体中文与基础英文符号字符集范围小于 GBK超早期静态网页、老旧政府站点、小型个人网站字符容量有限生僻字、繁体字会出现缺失乱码ISO-8859-1仅西欧字母、符号不支持中文部分国外接口、老式服务器默认编码、二进制数据流中文在该编码下必然乱码是爬虫高频异常编码UTF-8 是当下新建网站、前后端分离项目、API 接口的首选编码而大量运营多年的传统国内站点依旧沿用 GBK/GB2312 编码这也是爬虫乱码问题集中出现的场景。1.2 编码与解码核心原理计算机底层仅能识别二进制数据所有文字、符号都需要经过编码转为二进制字节流进行传输、存储客户端接收到字节流后再通过解码还原为可视文字。编码字符 → 二进制字节流服务器发送数据阶段解码二进制字节流 → 字符爬虫接收数据阶段乱码的本质爬虫使用的解码规则和服务器原始编码规则不一致。例如网页原始编码为 GBK爬虫默认按照 UTF-8 解码字符映射关系错乱最终呈现乱码。结合requests库工作流程程序接收服务器返回的二进制字节流response.content再根据内置编码规则自动解码生成字符串response.text解码规则出错就会产生乱码。二、requests 自动编码识别机制2.1 自动识别逻辑requests会按照固定优先级顺序探测网页编码依次从三处位置提取编码信息优先级从高到低如下HTTP 响应头Content-Type优先读取响应头中charset字段这是标准网页声明编码的位置网页 HTML 元标签meta若响应头无编码信息会解析网页源码内的 meta 标签提取charset属性值默认编码兜底若前两处均未获取到编码默认使用ISO-8859-1编码解码该场景下中文一定会乱码。2.2 编码相关核心属性结合前文所学梳理Response对象中和编码强相关的三个属性明确各自用途与区别response.content原始二进制字节流无任何解码操作是数据的原始形态不会产生乱码也是手动转码的基础数据源response.encodingrequests自动探测得到的编码名称可读取、也可手动重新赋值修改编码response.text经过response.encoding解码后的字符串自动解码结果的最终展示载体。2.3 自动识别失效场景在以下场景中requests自动编码会判断错误直接导致乱码响应头Content-Type缺失charset字段HTML meta 标签书写不规范、编码名称拼写错误网页为混合编码局部使用不同字符集老式服务器默认返回 ISO-8859-1未标注实际编码动态接口、JSON 数据未声明编码格式。三、基础乱码修复方案手动指定编码手动指定编码是解决网页乱码最常用、最高效的手段适用于绝大多数静态网页、普通接口场景。核心思路先修改response.encoding属性为网页真实编码再读取response.text完成正确解码。3.1 修复流程与标准代码模板通用操作步骤发起请求获取Response对象根据网页真实编码手动赋值给resp.encoding读取resp.text获取正常显示的网页内容。3.1.1 网页为 GBK 编码国内老旧站点python运行import requests # 目标站点为GBK编码的传统网页 url https://www.example-old-site.com headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/124.0.0.0 Safari/537.36 } resp requests.get(url, headersheaders, timeout5) # 打印自动识别的编码验证识别错误 print(自动探测编码, resp.encoding) # 手动指定真实编码为GBK resp.encoding gbk # 读取解码后的正常文本 html resp.text print(网页内容片段, html[:300])原理说明执行resp.encoding gbk后后续读取resp.text会强制使用 GBK 规则对二进制字节流解码该操作不会修改原始二进制数据resp.content仅改变解码规则安全性高GB2312 编码的网页也可直接使用gbk赋值GBK 完全向下兼容 GB2312。3.1.2 网页为 UTF-8 编码现代主流站点部分现代网页因标签不规范导致自动识别错误手动指定 UTF-8 即可修复python运行import requests url https://www.example-new-site.com headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/124.0.0.0 Safari/537.36 } resp requests.get(url, headersheaders, timeout5) resp.encoding utf-8 print(resp.text[:200])3.2 编码名称书写规范编码名称大小写不敏感但行业内存在标准写法开发中统一规范可避免低级错误简体中文编码gbk、gb2312全小写推荐写法通用国际编码utf-8禁止写为utf8、UTF8等非标准格式西欧编码iso-8859-1。四、进阶乱码修复基于二进制字节流转码当手动修改resp.encoding依然无法解决乱码、网页编码复杂、接口返回纯字节流时使用原始二进制数据content手动转码这是兼容性最强的转码方案覆盖所有极端场景。4.1 转码核心语法Python 字符串与字节流相互转换的两个内置方法字节流.decode (编码格式)二进制字节 → 字符串解码字符串.encode (编码格式)字符串 → 二进制字节流编码爬虫场景核心用法resp.content.decode(真实编码)直接对原始字节流解码绕过requests自带的编码逻辑。4.2 实战案例4.2.1 GBK 编码网页字节流转码python运行import requests url https://www.example-gbk-site.com headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/124.0.0.0 Safari/537.36 } resp requests.get(url, headersheaders, timeout5) # 直接对原始字节流解码指定GBK编码 html resp.content.decode(gbk) print(html[:300])4.2.2 UTF-8 编码网页字节流转码python运行import requests url https://www.example-utf8-site.com headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/124.0.0.0 Safari/537.36 } resp requests.get(url, headersheaders, timeout5) html resp.content.decode(utf-8) print(html[:300])4.3 解码异常处理设置错误忽略部分网页存在混合编码、破损字符、非法字节使用标准解码会直接抛出UnicodeDecodeError解码异常导致程序中断。此时可在decode方法中添加错误处理参数跳过无法识别的非法字符。4.3.1 errors 参数用法errorsignore忽略无法解码的异常字节跳过破损字符继续解析正常内容errorsreplace将异常字符替换为占位符保留文本结构完整性。实战代码python运行import requests url https://www.example-broken-charset.com headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/124.0.0.0 Safari/537.36 } resp requests.get(url, headersheaders, timeout5) # 忽略解码错误跳过非法字符 html resp.content.decode(gbk, errorsignore) print(html[:300])适用场景老旧网页存在残缺字符、特殊隐藏符号采集历史归档页面、非正规静态站点批量采集任务不允许因个别字符异常中断程序。补充说明该方式会丢失少量异常字符若对数据完整性要求极高需溯源修复网页原始编码问题。五、自动编码探测动态识别未知编码实际开发中常会遇到未知编码的网页无法提前确定使用 UTF-8 还是 GBK。此时可以借助第三方编码探测库自动分析二进制字节流识别网页真实编码实现全自动化编码处理适合通用爬虫、批量多站点采集场景。5.1 chardet 编码探测库chardet是 Python 主流编码识别库可根据字节流特征分析字符集支持 UTF-8、GBK、GB2312、ISO-8859-1 等绝大多数网页编码。5.1.1 库安装shellpip install chardet5.1.2 基础探测实战python运行import requests import chardet url https://www.example-unknown-charset.com headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/124.0.0.0 Safari/537.36 } resp requests.get(url, headersheaders, timeout5) # 探测二进制字节流的编码格式 detect_result chardet.detect(resp.content) print(编码探测结果, detect_result) # 提取识别出的编码名称 real_charset detect_result.get(encoding) # 置信度数值越高代表识别结果越可靠 confidence detect_result.get(confidence) print(f识别编码{real_charset}置信度{confidence}) # 使用探测到的编码完成解码 if real_charset: html resp.content.decode(real_charset, errorsignore) print(html[:300])结果字段说明探测返回结果为字典格式包含三个核心字段encoding识别出的编码名称confidence识别置信度取值 0~1越接近 1 结果越准确language网页使用的语言。5.2 cchardet 加速探测库cchardet是chardet的 C 语言加速版本探测速度提升数倍适合大体积网页、高并发爬虫场景用法与 chardet 完全一致。 安装指令shellpip install cchardet调用方式仅修改导入模块python运行import cchardet detect_result cchardet.detect(resp.content)5.3 未知编码通用处理模板整合编码探测、异常忽略、容错判断形成可直接复用的未知编码处理模板python运行import requests import chardet from requests.exceptions import RequestException def get_html(url, headersNone, timeout5): 通用网页获取函数自动识别编码并解码 try: resp requests.get(url, headersheaders, timeouttimeout) # 探测编码 res chardet.detect(resp.content) charset res.get(encoding) # 容错探测失败默认使用utf-8 if not charset: charset utf-8 # 解码并忽略异常字符 html resp.content.decode(charset, errorsignore) return html except RequestException as e: print(f请求异常{e}) return # 调用测试 if __name__ __main__: headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/124.0.0.0 Safari/537.36 } target_url https://www.example-unknown-site.com page_html get_html(target_url, headers) print(page_html[:200])六、不同场景下的编码处理规范结合网页类型、数据载体、请求方式划分不同业务场景制定标准化编码处理方案做到按需选择、统一规范。6.1 静态 HTML 网页场景现代网站主流 UTF-8优先依赖requests自动编码出现乱码则手动指定utf-8国内老旧站点GBK/GB2312直接使用resp.encoding gbk修复简单高效标签不规范、混合编码网页使用resp.content.decode(gbk, errorsignore)字节流转码批量多站点采集使用chardet自动探测编码实现通用适配。6.2 JSON 接口数据场景前后端分离项目、APP 接口大多返回 JSON 格式数据编码以 UTF-8 为主乱码处理规则标准 JSON 接口默认 UTF-8直接读取resp.json()即可requests会自动完成解码接口中文乱码使用resp.content.decode(utf-8)转码后再通过json.loads()解析示例代码python运行import requests import json url https://httpbin.org/json headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/124.0.0.0 Safari/537.36} resp requests.get(url, headersheaders) # 方式1标准接口直接调用json() data1 resp.json() # 方式2解码后手动解析应对解码异常接口 text resp.content.decode(utf-8) data2 json.loads(text) print(data1)6.3 文件、二进制资源场景图片、视频、压缩包、文档等二进制资源禁止进行解码操作直接使用resp.content写入本地文件即可。一旦执行decode转字符串会直接造成文件损坏。正确文件下载编码规范python运行import requests url https://httpbin.org/image/jpeg resp requests.get(url, timeout5) # 二进制文件直接写入content不做任何解码 with open(test.jpg, wb) as f: f.write(resp.content)6.4 POST 请求表单 / 数据场景POST 提交数据出现中文乱码分为请求发送乱码和响应返回乱码两类响应返回乱码处理方式与 GET 请求完全一致使用本章编码修复方案即可提交数据乱码requests会自动完成参数编码一般无需额外处理特殊老旧接口可手动指定编码格式。七、常见乱码问题排查与解决方案7.1 现象一页面中文显示为问号原因网页原始编码为 GBK/GB2312爬虫使用 UTF-8 解码字符集完全不兼容。解决手动指定编码为gbk或通过字节流decode(gbk)转码。7.2 现象二页面中文显示为方框 □□□□原因解码编码与原始编码不匹配同时存在部分生僻字符、特殊符号。解决使用errorsignore参数忽略异常字符优先保证主体内容正常展示。7.3 现象三自动探测编码为 ISO-8859-1全页乱码原因响应头、HTML 标签均未声明编码requests触发默认兜底编码。解决根据站点类型判断编码国内站点优先尝试gbk海外站点优先尝试utf-8或使用 chardet 自动探测。7.4 现象四局部内容乱码大部分内容正常原因网页为混合编码局部区块使用独立字符集。解决整体使用主编码解码配合errorsignore跳过局部异常字符。7.5 现象五解码抛出 UnicodeDecodeError 异常原因字节流中存在非法字符、破损字节无法按照指定规则解码。解决添加errorsignore或errorsreplace参数容错处理。八、综合实战案例全流程编码处理爬虫整合请求伪装、会话保持、编码探测、异常捕获等前文所有知识点编写一套完整的通用网页采集案例适配未知编码网页可作为正式项目基础模板。python运行import requests import chardet import random import time from requests.exceptions import RequestException # UA池配置 UA_LIST [ Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/124.0.0.0 Safari/537.36, Mozilla/5.0 (Macintosh; Intel Mac OS X 14_4_1) Safari/605.1.15 ] # 基础请求头 BASE_HEADERS { Referer: https://www.example.com/, Accept-Language: zh-CN,zh;q0.9 } # 创建会话 session requests.Session() def crawl_page(target_url): 网页采集主函数自动处理编码与异常 # 随机UA current_ua random.choice(UA_LIST) headers BASE_HEADERS.copy() headers[User-Agent] current_ua session.headers headers try: resp session.get(target_url, timeout6) # 自动探测编码 detect_res chardet.detect(resp.content) charset detect_res.get(encoding, utf-8) # 解码忽略异常字符 html_content resp.content.decode(charset, errorsignore) print(f识别编码{charset}) return html_content except RequestException as e: print(f采集失败{str(e)}) return # 主程序执行 if __name__ __main__: # 待采集网址 url_list [ https://www.example-site1.com, https://www.example-site2.com ] for index, url in enumerate(url_list): print(f\n 开始采集第{index1}个页面 ) result crawl_page(url) if result: print(页面内容片段, result[:300]) # 随机延时模拟人工访问 time.sleep(random.uniform(1, 2)) session.close() print(\n所有页面采集完成)
Python 爬虫项目:网页编码与乱码处理
发布时间:2026/6/12 19:31:00
前言在爬虫数据采集过程中网页源码、接口返回内容出现中文乱码是极为普遍的问题。乱码会导致文本数据无法正常解析、关键字提取失败、内容展示异常严重影响数据采集的准确性与可用性。网页乱码的本质是字符编码规则不匹配不同网站、不同服务器、不同静态资源会采用 GBK、GB2312、UTF-8、ISO-8859-1 等多种编码格式若爬虫程序解码方式与网页原始编码不一致字符就会出现错位、问号、方框等乱码形态。requests库虽具备自动编码识别能力但受网页标签不规范、响应头缺失编码标识、混合编码等因素影响自动识别常常出现偏差。本章从字符编码基础理论出发梳理主流网页编码格式、乱码产生的核心诱因结合多场景实战代码讲解自动修正、手动指定编码、二进制转码、编码探测等全套解决方案同时总结不同类型网页、接口、文件的编码处理规范形成可直接复用的编码处理模板。文中相关参考链接如下字符编码标准参考https://www.unicode.org/在线编码识别与转换工具https://www.charset.org/requests 编码机制官方说明https://docs.python-requests.org/en/latest/user/quickstart/#response-content一、网页主流编码格式基础认知1.1 核心编码格式介绍互联网网页使用的字符编码种类有限爬虫开发中只需重点掌握四类主流编码理解其适用范围、字符集特点与使用场景是解决乱码问题的前提。表格编码格式字符集范围主要使用场景特点说明UTF-8全球所有语言字符包含中文、英文、日文、符号等现代网站、移动端页面、接口数据、国外站点、开源项目通用性最强无字符限制目前行业主流编码GBK简体中文、繁体中文、日文、部分特殊符号国内传统企业网站、老旧资讯站、地方门户、部分论坛中文存储体积更小仅适配中文体系字符GB2312仅简体中文与基础英文符号字符集范围小于 GBK超早期静态网页、老旧政府站点、小型个人网站字符容量有限生僻字、繁体字会出现缺失乱码ISO-8859-1仅西欧字母、符号不支持中文部分国外接口、老式服务器默认编码、二进制数据流中文在该编码下必然乱码是爬虫高频异常编码UTF-8 是当下新建网站、前后端分离项目、API 接口的首选编码而大量运营多年的传统国内站点依旧沿用 GBK/GB2312 编码这也是爬虫乱码问题集中出现的场景。1.2 编码与解码核心原理计算机底层仅能识别二进制数据所有文字、符号都需要经过编码转为二进制字节流进行传输、存储客户端接收到字节流后再通过解码还原为可视文字。编码字符 → 二进制字节流服务器发送数据阶段解码二进制字节流 → 字符爬虫接收数据阶段乱码的本质爬虫使用的解码规则和服务器原始编码规则不一致。例如网页原始编码为 GBK爬虫默认按照 UTF-8 解码字符映射关系错乱最终呈现乱码。结合requests库工作流程程序接收服务器返回的二进制字节流response.content再根据内置编码规则自动解码生成字符串response.text解码规则出错就会产生乱码。二、requests 自动编码识别机制2.1 自动识别逻辑requests会按照固定优先级顺序探测网页编码依次从三处位置提取编码信息优先级从高到低如下HTTP 响应头Content-Type优先读取响应头中charset字段这是标准网页声明编码的位置网页 HTML 元标签meta若响应头无编码信息会解析网页源码内的 meta 标签提取charset属性值默认编码兜底若前两处均未获取到编码默认使用ISO-8859-1编码解码该场景下中文一定会乱码。2.2 编码相关核心属性结合前文所学梳理Response对象中和编码强相关的三个属性明确各自用途与区别response.content原始二进制字节流无任何解码操作是数据的原始形态不会产生乱码也是手动转码的基础数据源response.encodingrequests自动探测得到的编码名称可读取、也可手动重新赋值修改编码response.text经过response.encoding解码后的字符串自动解码结果的最终展示载体。2.3 自动识别失效场景在以下场景中requests自动编码会判断错误直接导致乱码响应头Content-Type缺失charset字段HTML meta 标签书写不规范、编码名称拼写错误网页为混合编码局部使用不同字符集老式服务器默认返回 ISO-8859-1未标注实际编码动态接口、JSON 数据未声明编码格式。三、基础乱码修复方案手动指定编码手动指定编码是解决网页乱码最常用、最高效的手段适用于绝大多数静态网页、普通接口场景。核心思路先修改response.encoding属性为网页真实编码再读取response.text完成正确解码。3.1 修复流程与标准代码模板通用操作步骤发起请求获取Response对象根据网页真实编码手动赋值给resp.encoding读取resp.text获取正常显示的网页内容。3.1.1 网页为 GBK 编码国内老旧站点python运行import requests # 目标站点为GBK编码的传统网页 url https://www.example-old-site.com headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/124.0.0.0 Safari/537.36 } resp requests.get(url, headersheaders, timeout5) # 打印自动识别的编码验证识别错误 print(自动探测编码, resp.encoding) # 手动指定真实编码为GBK resp.encoding gbk # 读取解码后的正常文本 html resp.text print(网页内容片段, html[:300])原理说明执行resp.encoding gbk后后续读取resp.text会强制使用 GBK 规则对二进制字节流解码该操作不会修改原始二进制数据resp.content仅改变解码规则安全性高GB2312 编码的网页也可直接使用gbk赋值GBK 完全向下兼容 GB2312。3.1.2 网页为 UTF-8 编码现代主流站点部分现代网页因标签不规范导致自动识别错误手动指定 UTF-8 即可修复python运行import requests url https://www.example-new-site.com headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/124.0.0.0 Safari/537.36 } resp requests.get(url, headersheaders, timeout5) resp.encoding utf-8 print(resp.text[:200])3.2 编码名称书写规范编码名称大小写不敏感但行业内存在标准写法开发中统一规范可避免低级错误简体中文编码gbk、gb2312全小写推荐写法通用国际编码utf-8禁止写为utf8、UTF8等非标准格式西欧编码iso-8859-1。四、进阶乱码修复基于二进制字节流转码当手动修改resp.encoding依然无法解决乱码、网页编码复杂、接口返回纯字节流时使用原始二进制数据content手动转码这是兼容性最强的转码方案覆盖所有极端场景。4.1 转码核心语法Python 字符串与字节流相互转换的两个内置方法字节流.decode (编码格式)二进制字节 → 字符串解码字符串.encode (编码格式)字符串 → 二进制字节流编码爬虫场景核心用法resp.content.decode(真实编码)直接对原始字节流解码绕过requests自带的编码逻辑。4.2 实战案例4.2.1 GBK 编码网页字节流转码python运行import requests url https://www.example-gbk-site.com headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/124.0.0.0 Safari/537.36 } resp requests.get(url, headersheaders, timeout5) # 直接对原始字节流解码指定GBK编码 html resp.content.decode(gbk) print(html[:300])4.2.2 UTF-8 编码网页字节流转码python运行import requests url https://www.example-utf8-site.com headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/124.0.0.0 Safari/537.36 } resp requests.get(url, headersheaders, timeout5) html resp.content.decode(utf-8) print(html[:300])4.3 解码异常处理设置错误忽略部分网页存在混合编码、破损字符、非法字节使用标准解码会直接抛出UnicodeDecodeError解码异常导致程序中断。此时可在decode方法中添加错误处理参数跳过无法识别的非法字符。4.3.1 errors 参数用法errorsignore忽略无法解码的异常字节跳过破损字符继续解析正常内容errorsreplace将异常字符替换为占位符保留文本结构完整性。实战代码python运行import requests url https://www.example-broken-charset.com headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/124.0.0.0 Safari/537.36 } resp requests.get(url, headersheaders, timeout5) # 忽略解码错误跳过非法字符 html resp.content.decode(gbk, errorsignore) print(html[:300])适用场景老旧网页存在残缺字符、特殊隐藏符号采集历史归档页面、非正规静态站点批量采集任务不允许因个别字符异常中断程序。补充说明该方式会丢失少量异常字符若对数据完整性要求极高需溯源修复网页原始编码问题。五、自动编码探测动态识别未知编码实际开发中常会遇到未知编码的网页无法提前确定使用 UTF-8 还是 GBK。此时可以借助第三方编码探测库自动分析二进制字节流识别网页真实编码实现全自动化编码处理适合通用爬虫、批量多站点采集场景。5.1 chardet 编码探测库chardet是 Python 主流编码识别库可根据字节流特征分析字符集支持 UTF-8、GBK、GB2312、ISO-8859-1 等绝大多数网页编码。5.1.1 库安装shellpip install chardet5.1.2 基础探测实战python运行import requests import chardet url https://www.example-unknown-charset.com headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/124.0.0.0 Safari/537.36 } resp requests.get(url, headersheaders, timeout5) # 探测二进制字节流的编码格式 detect_result chardet.detect(resp.content) print(编码探测结果, detect_result) # 提取识别出的编码名称 real_charset detect_result.get(encoding) # 置信度数值越高代表识别结果越可靠 confidence detect_result.get(confidence) print(f识别编码{real_charset}置信度{confidence}) # 使用探测到的编码完成解码 if real_charset: html resp.content.decode(real_charset, errorsignore) print(html[:300])结果字段说明探测返回结果为字典格式包含三个核心字段encoding识别出的编码名称confidence识别置信度取值 0~1越接近 1 结果越准确language网页使用的语言。5.2 cchardet 加速探测库cchardet是chardet的 C 语言加速版本探测速度提升数倍适合大体积网页、高并发爬虫场景用法与 chardet 完全一致。 安装指令shellpip install cchardet调用方式仅修改导入模块python运行import cchardet detect_result cchardet.detect(resp.content)5.3 未知编码通用处理模板整合编码探测、异常忽略、容错判断形成可直接复用的未知编码处理模板python运行import requests import chardet from requests.exceptions import RequestException def get_html(url, headersNone, timeout5): 通用网页获取函数自动识别编码并解码 try: resp requests.get(url, headersheaders, timeouttimeout) # 探测编码 res chardet.detect(resp.content) charset res.get(encoding) # 容错探测失败默认使用utf-8 if not charset: charset utf-8 # 解码并忽略异常字符 html resp.content.decode(charset, errorsignore) return html except RequestException as e: print(f请求异常{e}) return # 调用测试 if __name__ __main__: headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/124.0.0.0 Safari/537.36 } target_url https://www.example-unknown-site.com page_html get_html(target_url, headers) print(page_html[:200])六、不同场景下的编码处理规范结合网页类型、数据载体、请求方式划分不同业务场景制定标准化编码处理方案做到按需选择、统一规范。6.1 静态 HTML 网页场景现代网站主流 UTF-8优先依赖requests自动编码出现乱码则手动指定utf-8国内老旧站点GBK/GB2312直接使用resp.encoding gbk修复简单高效标签不规范、混合编码网页使用resp.content.decode(gbk, errorsignore)字节流转码批量多站点采集使用chardet自动探测编码实现通用适配。6.2 JSON 接口数据场景前后端分离项目、APP 接口大多返回 JSON 格式数据编码以 UTF-8 为主乱码处理规则标准 JSON 接口默认 UTF-8直接读取resp.json()即可requests会自动完成解码接口中文乱码使用resp.content.decode(utf-8)转码后再通过json.loads()解析示例代码python运行import requests import json url https://httpbin.org/json headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/124.0.0.0 Safari/537.36} resp requests.get(url, headersheaders) # 方式1标准接口直接调用json() data1 resp.json() # 方式2解码后手动解析应对解码异常接口 text resp.content.decode(utf-8) data2 json.loads(text) print(data1)6.3 文件、二进制资源场景图片、视频、压缩包、文档等二进制资源禁止进行解码操作直接使用resp.content写入本地文件即可。一旦执行decode转字符串会直接造成文件损坏。正确文件下载编码规范python运行import requests url https://httpbin.org/image/jpeg resp requests.get(url, timeout5) # 二进制文件直接写入content不做任何解码 with open(test.jpg, wb) as f: f.write(resp.content)6.4 POST 请求表单 / 数据场景POST 提交数据出现中文乱码分为请求发送乱码和响应返回乱码两类响应返回乱码处理方式与 GET 请求完全一致使用本章编码修复方案即可提交数据乱码requests会自动完成参数编码一般无需额外处理特殊老旧接口可手动指定编码格式。七、常见乱码问题排查与解决方案7.1 现象一页面中文显示为问号原因网页原始编码为 GBK/GB2312爬虫使用 UTF-8 解码字符集完全不兼容。解决手动指定编码为gbk或通过字节流decode(gbk)转码。7.2 现象二页面中文显示为方框 □□□□原因解码编码与原始编码不匹配同时存在部分生僻字符、特殊符号。解决使用errorsignore参数忽略异常字符优先保证主体内容正常展示。7.3 现象三自动探测编码为 ISO-8859-1全页乱码原因响应头、HTML 标签均未声明编码requests触发默认兜底编码。解决根据站点类型判断编码国内站点优先尝试gbk海外站点优先尝试utf-8或使用 chardet 自动探测。7.4 现象四局部内容乱码大部分内容正常原因网页为混合编码局部区块使用独立字符集。解决整体使用主编码解码配合errorsignore跳过局部异常字符。7.5 现象五解码抛出 UnicodeDecodeError 异常原因字节流中存在非法字符、破损字节无法按照指定规则解码。解决添加errorsignore或errorsreplace参数容错处理。八、综合实战案例全流程编码处理爬虫整合请求伪装、会话保持、编码探测、异常捕获等前文所有知识点编写一套完整的通用网页采集案例适配未知编码网页可作为正式项目基础模板。python运行import requests import chardet import random import time from requests.exceptions import RequestException # UA池配置 UA_LIST [ Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/124.0.0.0 Safari/537.36, Mozilla/5.0 (Macintosh; Intel Mac OS X 14_4_1) Safari/605.1.15 ] # 基础请求头 BASE_HEADERS { Referer: https://www.example.com/, Accept-Language: zh-CN,zh;q0.9 } # 创建会话 session requests.Session() def crawl_page(target_url): 网页采集主函数自动处理编码与异常 # 随机UA current_ua random.choice(UA_LIST) headers BASE_HEADERS.copy() headers[User-Agent] current_ua session.headers headers try: resp session.get(target_url, timeout6) # 自动探测编码 detect_res chardet.detect(resp.content) charset detect_res.get(encoding, utf-8) # 解码忽略异常字符 html_content resp.content.decode(charset, errorsignore) print(f识别编码{charset}) return html_content except RequestException as e: print(f采集失败{str(e)}) return # 主程序执行 if __name__ __main__: # 待采集网址 url_list [ https://www.example-site1.com, https://www.example-site2.com ] for index, url in enumerate(url_list): print(f\n 开始采集第{index1}个页面 ) result crawl_page(url) if result: print(页面内容片段, result[:300]) # 随机延时模拟人工访问 time.sleep(random.uniform(1, 2)) session.close() print(\n所有页面采集完成)