HTTP内容编码全解析:从乱码排查到Gzip/Brotli实战应用
1. 从一次诡异的乱码排查说起那天下午我正在调试一个数据采集脚本目标是一个看似普通的资讯网站。脚本逻辑很简单发送一个HTTP GET请求然后解析返回的HTML内容。代码跑起来很顺畅状态码200一切看起来都很美好。直到我尝试打印响应的文本内容时控制台输出了一堆完全无法辨认的“天书”——不是中文乱码而是一堆夹杂着奇怪符号的二进制数据。我的第一反应是编码问题立刻祭出response.encoding ‘utf-8’大法甚至尝试了gbk、gb2312结果毫无变化。接着我检查了响应头里的Content-Type明明白白写着text/html; charsetutf-8编码声明是对的。这就奇怪了声明了UTF-8内容却是乱码问题出在哪我习惯性地打开了浏览器的开发者工具重新访问这个页面。在“Network”标签页下我点开这个请求仔细查看响应头。这时一个平时不太注意的字段跳了出来Content-Encoding: br。我心里“咯噔”一下原来是你问题瞬间清晰了服务器返回的响应体不是原始的HTML文本而是经过Brotli算法压缩后的二进制数据。我的脚本直接把这些压缩后的字节流当成普通文本去解码自然就得到了乱码。解决起来也简单只需要在发起请求时在请求头里明确告诉服务器我能接受哪些压缩格式比如Accept-Encoding: gzip, deflate, br然后我的HTTP客户端库如Python的requests会自动帮我解压。加上这个头之后脚本立刻输出了清晰可读的HTML。这次经历让我意识到Content-Encoding和Accept-Encoding这对HTTP头字段虽然不像Content-Type那样广为人知却是现代Web通信中保证效率和正确性的幕后功臣。很多人遇到乱码第一反应就是字符集却忽略了内容编码即压缩这个同样关键的环节。今天我们就来彻底搞懂这对字段让你下次遇到类似问题时能直击要害。2.Content-Encoding与Accept-Encoding一对高效的“压缩快递员”我们可以把浏览器或客户端与服务器之间的HTTP通信想象成收发快递。Content-Encoding和Accept-Encoding就是这对快递流程中专门负责“打包”和“拆包”的两位关键角色。Accept-Encoding是“收件人”的声明。当客户端比如你的浏览器或爬虫脚本向服务器发送请求时它会在请求头里带上Accept-Encoding。这个头的值是一个或多个压缩算法标识符用逗号分隔例如gzip, deflate, br。它的潜台词是“嘿服务器我这边支持gzip、deflate和Brotli这几种解压方式。你发过来的数据如果用这些方式压缩了我能自己解开。” 客户端通过这个头告知服务器自己具备的解码能力为服务器选择压缩方式提供了依据。Content-Encoding是“发件人”的标签。当服务器准备好响应内容后它会决定是否压缩以及用什么算法压缩。如果压缩了它就会在响应头里设置Content-Encoding字段值就是所使用的压缩算法比如gzip。这个标签告诉客户端“注意我发给你的货物响应体是用gzip打包的你需要用对应的工具解压算法拆开才能看到里面的真实内容。” 如果服务器没有压缩响应体它通常会省略这个头或者其值为identity表示“原始身份”即未压缩。它们的工作流程是这样的客户端发起请求在Accept-Encoding中列出自己的“解压工具清单”。服务器收到请求查看清单并综合考虑自身支持情况、资源类型文本压缩效果好图片/视频可能已压缩、CPU负载等因素决定是否压缩及采用哪种算法。服务器生成响应如果压缩了则在Content-Encoding中贴上对应的“压缩标签”然后将压缩后的数据发出。客户端收到响应先看Content-Encoding标签。如果标签是gzip而自己的清单里有gzip就调用gzip解压器处理响应体得到原始内容如果标签是brBrotli但清单里没写可能就无法正确解压导致我开头遇到的“乱码”问题。注意这里说的“乱码”特指因未解压而将压缩二进制流误当作文本解码产生的乱码它与因字符集如UTF-8、GBK设置错误导致的文本编码乱码是两回事但表象可能类似。3. 主流内容编码算法详解与选型考量理解了基本概念我们来看看市面上常见的几位“打包师傅”。选择哪种算法不仅仅是技术选型更直接关系到网站的性能和兼容性。3.1 Gzip经久不衰的行业标准gzip可以说是Web压缩领域的“老大哥”基于DEFLATE算法。它的普及率接近100%几乎所有浏览器、服务器和HTTP库都支持。工作原理简述Gzip会先使用LZ77算法进行重复字符串的替换滑动窗口查找然后再用霍夫曼编码对结果进行进一步压缩。它对文本类资源HTML、CSS、JS、JSON、XML的压缩效果非常显著通常能将体积减少70%左右。实战配置示例Nginx服务器gzip on; # 开启gzip压缩 gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xmlrss text/javascript; # 指定压缩的文件类型 gzip_min_length 1024; # 小于此值的响应不压缩避免压缩小文件反而增加开销 gzip_comp_level 6; # 压缩级别1-9级别越高压缩比越大但CPU消耗也越高通常6是一个平衡点为什么选它兼容性是它的王牌。在Accept-Encoding中写上gzip是绝对安全的做法。如果你的用户群体覆盖了非常古老的设备或浏览器gzip是唯一可靠的选择。3.2 Brotli新一代的高效王者Brotli常缩写为br是Google推出的开源压缩算法旨在提供比gzip更高的压缩比特别适合在HTTPS环境下使用。核心优势更高的压缩率在相同质量下Brotli压缩后的文件通常比gzip小15%-25%。这意味着更少的数据传输更快的页面加载速度尤其是对移动网络用户意义重大。预定义静态字典Brotli内置了一个包含大量常见HTML、CSS、JavaScript词汇的静态字典。对于Web内容这个字典能极大提升重复模式的匹配效率这是它高压缩比的秘诀之一。灵活的压缩模式提供了从0到11共12个压缩级别。级别越高压缩比越大但压缩速度越慢。通常对于静态资源如.css, .js文件可以在构建时使用最高级别11进行预压缩一次性消耗时间换取最佳压缩效果对于动态内容可以使用较低级别如4-6以平衡CPU开销。兼容性现状与部署策略Brotli的支持度已非常高。所有现代浏览器Chrome、Firefox、Edge、Safari等均已支持。服务器端Nginx可通过ngx_brotli模块支持CDN服务商如Cloudflare、阿里云、腾讯云也普遍支持。Nginx配置Brotli示例首先需要安装ngx_brotli模块通常通过动态模块或重新编译实现。brotli on; # 开启Brotli压缩 brotli_types text/plain text/css application/json application/javascript text/xml application/xml application/xmlrss text/javascript; # 压缩类型 brotli_comp_level 6; # 压缩级别 # 注意服务器需要同时配置gzip作为降级方案最佳实践在现代Web应用中理想的Accept-Encoding头应该是br, gzip, deflate。服务器优先使用br进行压缩如果客户端支持且资源适合如果不支持则回退到gzip。这样可以确保新用户获得最佳性能老用户也能通过gzip正常访问。3.3 Deflate与Zopfli特定场景的利刃Deflate这里指HTTP标准中的deflate编码它使用DEFLATE算法但封装格式与gzip不同。由于历史上一些服务器和客户端实现存在混淆它的支持度和可靠性不如gzip纯粹。在现代Web开发中通常不建议主动使用或优先声明deflate坚持gzip和br即可。Zopfli它不是一种独立的HTTPContent-Encoding而是Google推出的一个压缩库/算法可以生成比标准zlib库更小的gzip兼容文件。Zopfli的压缩速度非常慢但解压速度与普通gzip文件无异。因此它非常适合用于预压缩静态资源。你可以在构建流程中使用Zopfli压缩你的CSS、JS、SVG等文件然后将这些.gz文件直接部署到服务器。当客户端请求时如果支持gzip服务器直接发送这些预压缩文件无需实时压缩兼顾了高压缩比和低服务器CPU开销。算法选型决策树面对一个项目如何选择压缩策略你可以遵循以下思路目标用户是谁如果必须兼容IE8等古董浏览器gzip是唯一选项。资源是静态还是动态静态资源.css, .js, .svg等在构建阶段使用Zopfli生成最优的.gz文件同时使用Brotli最高级别生成.br文件。服务器配置同时支持br和gzip并优先提供.br。动态内容API响应、SSR页面在服务器端开启实时压缩。优先配置Brotli级别设为4-6并启用gzip作为后备。确保Accept-Encoding头被正确传递和处理。服务器性能如何对于CPU资源紧张的服务器可以适当降低Brotli的压缩级别或者对动态内容仅使用gzip将静态资源的压缩负担转移到构建环节。4. 实战在爬虫与后端开发中正确处理内容编码理论说得再多不如一行代码。无论是写爬虫抓取数据还是构建API服务正确处理内容编码都是基本功。4.1 客户端视角如何确保你的爬虫拿到正确内容以Python的requests库和Node.js的axios为例大多数现代HTTP客户端库会自动处理Accept-Encoding和响应解压。Pythonrequests库requests库默认会在请求头中加入Accept-Encoding: gzip, deflate并自动解压gzip和deflate编码的响应。对于Brotli需要额外安装brotli或brotlicffi库。import requests # 最简单的情况requests自动处理gzip/deflate response requests.get(https://example.com) print(response.text) # 文本内容已自动解压解码 # 如果需要支持并自动解压Brotli确保已安装 pip install brotli 或 pip install brotlicffi # requests库在检测到brotli库可用后会自动将其加入Accept-Encoding并解压。 # 你可以手动验证或设置头 headers { Accept-Encoding: gzip, deflate, br # 明确声明支持br } response requests.get(https://example.com, headersheaders) # 如果服务器返回br编码且brotli库已安装response.content是压缩数据但response.text会自动解压。关键检查点检查response.headers[‘Content-Encoding’]如果看到br但输出是乱码首先检查是否安装了brotli库。手动处理压缩响应在某些极少数情况下如使用更底层的urllib或自定义客户端你可能需要手动解压。import gzip import brotli # 需要先安装 response_raw ... # 获取原始响应字节流 content_encoding response_headers.get(Content-Encoding, ) if gzip in content_encoding: original_data gzip.decompress(response_raw) elif br in content_encoding: original_data brotli.decompress(response_raw) else: original_data response_raw # 然后再对original_data进行字符集解码 text_content original_data.decode(utf-8)Node.jsaxios库axios默认也会处理gzip和deflate。对于BrotliNode.js环境本身从v10.16.0开始就内置了zlib模块支持Brotli压缩但axios默认可能未开启。你需要确保请求头正确并可能需要在响应转换器中处理。const axios require(axios); const zlib require(zlib); async function fetchWithBrotli(url) { const response await axios.get(url, { headers: { Accept-Encoding: gzip, deflate, br // 声明支持 }, responseType: arraybuffer // 重要获取Buffer以便手动解压 }); const encoding response.headers[content-encoding]; let data response.data; if (encoding br) { data await new Promise((resolve, reject) { zlib.brotliDecompress(data, (err, result) { if (err) reject(err); else resolve(result); }); }); } else if (encoding gzip) { data await new Promise((resolve, reject) { zlib.gunzip(data, (err, result) { if (err) reject(err); else resolve(result); }); }); } // deflate 处理类似... // 将Buffer转换为字符串假设编码是UTF-8 const text data.toString(utf-8); console.log(text); }4.2 服务端视角如何正确配置与压缩响应作为服务端开发者你的目标是尽可能为支持的客户端提供压缩响应同时避免错误。Nginx动态压缩配置进阶http { # 开启gzip作为基础兼容保障 gzip on; gzip_vary on; # 在响应头中添加“Vary: Accept-Encoding”这对CDN和浏览器缓存至关重要 gzip_proxied any; # 即使请求来自代理只要条件满足也压缩 gzip_comp_level 6; gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xmlrss application/xml image/svgxml; # SVG是文本格式压缩效果好 # 开启Brotli压缩需模块支持 brotli on; brotli_types text/plain text/css application/json application/javascript text/xml application/xml application/xmlrss text/javascript image/svgxml; brotli_comp_level 6; # 设置Brotli压缩的最小长度避免小文件负优化 brotli_min_length 1024; }Vary: Accept-Encoding头的重要性这个头告诉缓存系统如CDN、浏览器缓存响应的内容会根据请求头中的Accept-Encoding不同而不同。如果一个不支持br的客户端请求了资源CDN缓存了未压缩或gzip压缩的版本那么当另一个支持br的客户端来请求时CDN会因为Vary头的存在而识别这是不同的请求从而可能回源获取或缓存一个br压缩的版本。没有这个头缓存可能会错误地分发内容导致客户端收到无法解码的响应。后端应用层压缩以Node.js/Express为例对于动态API响应你可以在应用层进行压缩。const express require(express); const compression require(compression); // 需要安装 npm install compression const app express(); // 使用compression中间件它会根据Accept-Encoding头自动选择gzip或deflate // 注意compression中间件默认不支持Brotli如需Brotli需使用如shrink-ray等中间件 app.use(compression({ level: 6, // 压缩级别 threshold: 1024, // 仅当响应体大于此字节数时才压缩 filter: (req, res) { // 可选过滤函数例如对某些请求不压缩 if (req.headers[x-no-compression]) { return false; } return compression.filter(req, res); } })); app.get(/api/data, (req, res) { const largeData { /* ... 大量JSON数据 ... */ }; res.json(largeData); // 中间件会自动压缩 });一个常见的坑双重压缩。如果你在Nginx层面开启了gzip同时后端应用如上面的Express也使用了压缩中间件那么响应体可能会被压缩两次。最终客户端收到的是Content-Encoding: gzip, gzip这样的响应导致无法解压。解决方案是确保压缩只发生在一层通常建议在反向代理Nginx层做压缩后端应用关闭压缩中间件或者通过响应头X-Accel-Buffering等机制让Nginx识别并避免二次压缩。5. 高级话题与故障排查手册掌握了基础应用后我们再看一些深入的问题和排查技巧。5.1 内容编码与传输编码Transfer-Encoding的区别这是另一个容易混淆的概念。Content-Encoding内容编码描述的是整个响应实体主体entity-body使用的编码转换目的是为了压缩。而Transfer-Encoding传输编码描述的是消息主体message-body在HTTP连接中是如何被传输的目的是为了适应网络传输比如分块传输chunked。Content-Encoding: gzip表示“这个响应的内容本身被gzip压缩了你得先解压才能得到原始内容。”Transfer-Encoding: chunked表示“这个响应的数据是一块一块传过来的每块有大小标识方便边生成边传输。” 它和内容本身的格式无关。一个响应可以同时具有Content-Encoding: gzip和Transfer-Encoding: chunked。这意味着服务器一边生成数据一边用gzip压缩然后分成多个块传输给客户端。客户端需要先按照chunked规则重组数据再根据gzip规则解压。5.2 排查“乱码”问题的标准化流程当你从HTTP响应中得到的文本是乱码时请遵循以下步骤可以快速定位问题第一步检查Content-Encoding响应头。如果存在且值为gzip、br、deflate等那么你看到的“乱码”极大概率是未解压的二进制数据。这是最常见的原因。解决方案确保你的HTTP客户端库支持该算法并自动解压或者手动解压。第二步检查Content-Type响应头的charset参数。如果Content-Encoding不存在或已正确处理解压后文本仍然乱码比如中文变成问号或奇怪符号那么问题出在字符集。查看Content-Type: text/html; charsetGBK。如果charset是GBK而你的代码用UTF-8去解码就会乱码。解决方案使用响应头中声明的字符集进行解码。很多库如requests的response.text会自动根据响应头或HTML meta标签猜测编码但有时会猜错。你可以使用response.encoding ‘GBK’来显式指定或者用response.content.decode(‘GBK’)。第三步检查原始字节数据。如果以上两步都正确但仍有问题直接打印或查看原始的响应字节数据如response.content。用十六进制查看工具检查文件开头是否有BOM字节顺序标记如EF BB BF对应UTF-8 BOM或者是否符合某种编码的字节特征。第四步网络抓包确认。使用Wireshark、Fiddler或Charles等抓包工具直接查看网络上传输的原始HTTP报文。这可以排除客户端库处理可能引入的问题确认服务器实际发送的头部和体是什么。5.3 性能、安全与缓存考量性能权衡压缩消耗服务器CPU节省网络带宽。对于高并发、CPU密集型的服务需要谨慎评估压缩级别。静态资源强烈建议预压缩。动态API可以考虑对响应体大小设置阈值如只压缩大于1KB的响应。安全考虑压缩本身可能带来安全风险例如CRIME和BREACH攻击它们利用压缩特性来窃取HTTPS协议下的敏感信息如Cookie。对于包含高度敏感信息的响应可以考虑禁用压缩。不过在现代TLS协议和合理的缓解措施下这种风险对于大多数Web应用是可控的。缓存影响如前所述务必设置Vary: Accept-Encoding响应头。否则一个缓存了gzip版本的CDN节点可能会把该版本分发给请求br的客户端导致错误或性能下降。回顾开头的那个乱码问题其根源就在于我的脚本没有正确声明支持BrotliAccept-Encoding头不完整而服务器恰好优先使用了br压缩。服务器返回了压缩数据Content-Encoding: br我的客户端却不认识这个“打包方式”试图直接“阅读”压缩后的二进制流自然就读出了一堆乱码。解决之后我养成了一个习惯在编写任何HTTP客户端代码时都会下意识地检查一下压缩头的处理。这看似是一个小细节却实实在在地影响着应用的健壮性和性能。在Web这个庞大的生态里正是这些协议细节的精准把控构成了稳定、高效用户体验的基石。

相关新闻

气泡、白团、压痕:从缺陷标签到工艺特征的系统化管控

气泡、白团、压痕:从缺陷标签到工艺特征的系统化管控

1. 项目概述:从“瑕疵”到“工艺特征”的认知转变在制造业,尤其是涉及注塑、压铸、表面处理等工艺的领域,我们经常会听到一线工程师或质检员提到“气泡”、“白团”、“压痕”这些词。乍一听,这似乎是产品缺陷的代名词&#xff0c…

2026/10/9 21:10:15 阅读更多 →
Mac Studio 升级 25G 以太网:测试遇散热难题,改造后性能提升几何?

Mac Studio 升级 25G 以太网:测试遇散热难题,改造后性能提升几何?

Mac Studio 实现 25 Gbps Thunderbolt 以太网连接:测试遇难题,散热改造后性能提升几何? 2026 年 7 月 31 日,博主 Jeff Geerling 在其博客分享为 Mac Studio 实现 25 Gbps Thunderbolt 以太网连接的过程。 多年来,Jeff…

2026/9/29 19:42:51 阅读更多 →
Windows C++/Qt进程间通信:共享内存与消息机制实战详解

Windows C++/Qt进程间通信:共享内存与消息机制实战详解

1. 项目概述:为什么需要跨进程通信?在桌面应用开发,尤其是基于Windows平台的C/Qt项目中,我们经常会遇到一个核心需求:让两个独立的应用程序能够“对话”。比如,一个后台数据处理服务需要将结果实时推送给前…

2026/10/8 19:37:01 阅读更多 →

最新新闻

Access 2003教学数据库实战:从E-R建模到SQL查询与数据交换

Access 2003教学数据库实战:从E-R建模到SQL查询与数据交换

简介:本资源是一份面向高校数据库课程初学者的《数据库及其应用》实验报告,聚焦Access 2003环境下的数据库设计与实操能力培养,适用于计算机、信息管理等专业学生完成课程实验、备考或巩固关系型数据库核心技能。报告完整覆盖三大核心模块&am…

2026/10/11 14:20:27 阅读更多 →
基于Spark的电影推荐系统实战:协同过滤、ALS与MongoDB落地解析

基于Spark的电影推荐系统实战:协同过滤、ALS与MongoDB落地解析

简介:这份《基于Spark的电影推荐系统设计与实现》论文文档,主要面向大数据、计算机相关专业的高年级学生和开发者,适用于课程设计、毕业设计或推荐系统入门实战。文档以完整论文结构组织,系统讲述了基于Spark的电影推荐系统的开发…

2026/10/11 14:20:27 阅读更多 →
PyTorch实现TCN时间序列预测:从因果卷积到多步预测实战

PyTorch实现TCN时间序列预测:从因果卷积到多步预测实战

简介:一份基于Python与TensorFlow实现时间卷积神经网络(TCN)进行时间序列预测的完整项目实例,面向初级及以上数据科学家、机器学习爱好者及需要落地序列预测的专业人士,也可作为教学辅助材料。资源以TCN的因果卷积和膨…

2026/10/11 14:20:27 阅读更多 →
药店销售数据分析实战:pandas数据清洗到可视化全流程

药店销售数据分析实战:pandas数据清洗到可视化全流程

简介:这份PDF以朝阳医院2018年药店销售数据为例,系统演示Python数据分析的完整流程,适合刚接触数据分析、希望用真实业务数据练手的初学者。内容覆盖从Excel数据读取、数据清洗(列名重命名、缺失值处理、数据类型转换)…

2026/10/11 14:20:27 阅读更多 →
SAM+YOLOv8开集实例分割实战:特征融合与prompt工程

SAM+YOLOv8开集实例分割实战:特征融合与prompt工程

简介:本资源是一份面向AI方向本科生与初阶研究者的期末大作业实践方案,聚焦开集场景下的实例分割前沿技术融合——将YOLOv8目标检测能力与SAM(Segment Anything Model)零样本分割能力协同集成,解决传统闭集模型泛化性弱…

2026/10/11 14:20:27 阅读更多 →
用ASP.NET MVC开发通讯录系统:EF建表、CRUD与部署避坑

用ASP.NET MVC开发通讯录系统:EF建表、CRUD与部署避坑

简介:这是一份 C# ASP.NET 通讯录系统完整项目,面向初次接触 .NET Web 开发的初学者,帮助理解基于 Web 的联系人管理应用从界面到数据库的完整实现。项目使用 C# 与 ASP.NET Web Forms 构建服务器端逻辑,SQL Server 数据库存储联系…

2026/10/11 14:19:26 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →