Python URL编码踩坑:单层编码、双重编码实战解析

发布时间:2026/9/30 7:11:44

Python URL编码踩坑:单层编码、双重编码实战解析 很多爬虫、接口对接时都会踩URL编码的坑尤其是双重URL编码乍一看很诡异%25到底是什么本文结合真实业务场景讲清楚原理与Python实现。一、什么是URL编码urlquoteURL中部分字符属于保留字符不能直接放在查询参数里例如{ } : ,等。URL编码作用将特殊字符转为%十六进制格式。常见对照表→%22{→%7B}→%7D:→%3A,→%2C%→%25重点百分号本身编码后变成 %25这就是双重编码的核心根源Python内置模块urllib.parse.quote用来做URL编码无需额外安装第三方包。quote 关键参数safequote(string, safe/, encodingNone, errorsNone)safe设置不需要编码的字符默认是/也就是斜杠不会被编码。safe强制所有字符全部编码不保留任何原始字符爬虫对接很多后端接口时必须用这个。示例单层编码fromurllib.parseimportquoteimportjson data{articleId:89c46c77f90e61ff7df01e3cc18eae9349f619f697ca4366e94fad724d913ee6,columnId:268f86fdf61ac8614f09db38a2d0295253043b03e092c7ff48ab94290296125c}json_strjson.dumps(data,separators(,,:))# 单层URL编码encode_1quote(json_str,safe)print(encode_1)# 输出%7B%22articleId%22%3A%2289c46c77f90e61ff7df01e3cc18eae9349f619f697ca4366e94fad724d913ee6%22%2C%22columnId%22%3A%22268f86fdf61ac8614f09db38a2d0295253043b03e092c7ff48ab94290296125c%22%7D二、双重URL编码是什么本次业务场景很多老旧Java/PHP后端、门户站点接口会在服务端自动做一次URL解码。如果前端传递JSON字符串作为URL参数前端把JSON编码一次 →%7Bxxx%7D浏览器/网关还会再自动编码一遍把里面的%编码成%25最终就变成我们看到的%257B%2522articleId%2522...%257D本质对已经编码后的字符串再执行一次quote# 双层URL编码encode_1quote(json_str,safe)encode_2quote(encode_1,safe)final_paramfparams{encode_2}print(final_param)# params%257B%2522articleId%2522%3A%252289c46c77f90e61ff7df01e3cc18eae9349f619f697ca4366e94fad724d913ee6%2522%2C%2522columnId%2522%3A%2522268f86fdf61ac8614f09db38a2d0295253043b03e092c7ff48ab94290296125c%2522%257D完整链路从原始URL提取参数 双重编码业务场景从一个url链接中提取query参数组装成json再双重url编码拼成paramsxxxfromurllib.parseimporturlparse,parse_qs,quote,unquoteimportjson url[https://www.chinaisa.org.cn/gxportal/xfgl/portal/content.html?articleId89c46c77f90e61ff7df01e3cc18eae9349f619f697ca4366e94fad724d913ee6columnId268f86fdf61ac8614f09db38a2d0295253043b03e092c7ff48ab94290296125c](https://www.chinaisa.org.cn/gxportal/xfgl/portal/content.html?articleId89c46c77f90e61ff7df01e3cc18eae9349f619f697ca4366e94fad724d913ee6columnId268f86fdf61ac8614f09db38a2d0295253043b03e092c7ff48ab94290296125c)# 1. 解析url提取查询参数parsedurlparse(url)query_dict_rawparse_qs(parsed.query)# parse_qs返回值是列表取第一个值转为普通字典data{k:v[0]fork,vinquery_dict_raw.items()}# 2. 字典压缩成json字符串去掉多余空格json_strjson.dumps(data,separators(,,:))# 3. 双重URL编码encode1quote(json_str,safe)encode2quote(encode1,safe)resultfparams{encode2}print(result)三、解码双重编码反向还原调试的时候我们拿到params%257B...字符串需要还原回原始字典解码顺序反过来先unquote一次再unquote第二次fromurllib.parseimportunquoteimportjson encoded_strparams%257B%2522articleId%2522%3A%252289c46c77f90e61ff7df01e3cc18eae9349f619f697ca4366e94fad724d913ee6%2522%2C%2522columnId%2522%3A%2522268f86fdf61ac8614f09db38a2d0295253043b03e092c7ff48ab94290296125c%2522%257D# 截取params后面部分valencoded_str.split(params)[1]# 两次解码d1unquote(val)d2unquote(d1)origin_dictjson.loads(d2)print(origin_dict)四、常见踩坑总结忘记safe默认safe//不会编码很多接口校验严格会直接报错。分不清单层和双层编码接口返回参数带有大量%25基本就是双重URL编码。parse_qs返回list同一个参数允许多次出现{k:v[0]}只适用于参数唯一场景。json序列化带空格json.dumps(data)默认带换行空格编码后后端识别异常务必用separators(,,:)压缩json。quote_plus和quote的区别quote_plus会把空格编码成常用于application/x-www-form-urlencoded表单quote空格编码成%20url路径参数优先使用quote。五、什么时候会遇到双重URL编码老项目Java后端服务端自动做一次decode多层网关、Nginx转发每层都会自动解码一次前端JS先编码浏览器请求时又自动编码一遍爬虫对接政务、国企门户网站本次案例就是典型场景调试小技巧看到编码串大量%25第一反应这不是普通url编码是双重编码。六、小结URL编码本质就是特殊字符转义单层编码是基础而双重URL编码是爬虫对接老旧网站高频遇到的特殊场景。核心逻辑JSON字符串 → quote一次 → quote第二次。Python依靠urllib.parse内置库就能全部实现无需requests或者其他第三方编码库。调试时可以逆向解码验证结果是否正确避免接口报参数解析失败。
延伸阅读

更多相关文章

2026/9/30 7:11:44

裸机开发速记:启动流程|GIC 中断|时钟系统|UART 通信

ARM裸机笔记 ARM启动代码中做的事Cortex‑A7裸机,上电首先执行启动汇编,完成硬件、内核模式、栈、缓存初始化,最后跳转C语言main函数。设置异常向量表 将复位、未定义指令、软中断、预取中止、数据中止、IRQ、FIQ异常的跳转指令放在内存起始处…

2026/9/30 7:06:44

酒店PMS系统升级难点解析与瑞通系统技术应对方案

酒店在考虑更换PMS(Property Management System,物业管理系统)时,普遍面临数据迁移风险、员工适应成本与业务中断的担忧。针对“酒店PMS系统不敢换怎么办”这一核心问题,北京昆仑瑞祺科技发展有限公司旗下的瑞通酒店管…

2026/9/30 8:56:57

云端训练与边端推理:云边协同AI落地的工程实践

1. 项目概述:为什么“云端训练、边端推理”不是概念炒作,而是真实落地的工程选择“云边协同与人工智能AI的深度融合(云端训练、边端推理)”——这个标题里没有一个字是虚的。它不是PPT里的技术愿景,而是我过去三年在工…

2026/9/30 8:56:57

Model-Optimizer:大模型推理优化的软硬协同实践指南

1. 项目概述:Model-Optimizer 不是工具名,而是一类工程实践的统称 “Model-Optimizer”这个词在当前大模型部署生态里,根本不是某个具体开源项目的官方名称,也不是NVIDIA或Hugging Face发布的标准产品。它是一个被社区高频使用的 …

2026/9/30 8:56:57

PyTorch模型压缩实战:QAT、结构化剪枝与知识蒸馏三阶工作流

1. 项目概述:这不是一个“一键压缩”的玩具,而是一套面向真实生产环境的模型瘦身工作流 “Model-Optimizer”这个名字听起来像某个商业软件的注册商标,但在我过去三年深度参与十几个AI落地项目的实操中,它早已不是抽象概念——而是…

2026/9/30 8:56:57

Model-Optimizer:大模型推理部署前的工程化优化本质

1. “Model-Optimizer”不是工具名,而是工程共识的隐性代号 很多人第一次看到“Model-Optimizer”这个词,下意识以为是个开源项目、GitHub仓库名,或者某家公司的商业产品——查遍PyPI、Hugging Face Hub、NVIDIA官方文档甚至GitHub Trending榜…

2026/9/30 8:56:57

TensorFlow不是深度学习框架,而是AI生产流水线操作系统

1. 这不是“又一个深度学习框架”:TensorFlow 的真实定位与它被误读十年的底层逻辑 很多人第一次听说 TensorFlow,是在 2015 年 Google 开源那天。当时朋友圈刷屏的标题是“谷歌发布全新深度学习框架”,配图是一张蓝色流线型的计算图示意图。…

2026/9/30 8:51:56

高级Shell脚本工程化实战:从参数解析到并发控制

老读者都知道,我分享过不少脚本技巧,但每次后台收到的问题里,"有没有完整的高级脚本可以直接参考"总是高频出现。很多人学完 if 、 for 、 awk 这些基础语法之后,反而不知道该往哪个方向使劲,碰到实际…

2026/9/29 11:07:23

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/29 21:48:03

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/29 7:00:49

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 0:01:22

MATLAB+Yalmip+CPLEX实战:综合能源系统优化调度全流程解析

做综合能源系统优化调度这活儿,最痛苦的不是建模本身,而是模型写完之后不知道该怎么求解。看论文里轻飘飘一句“采用Yalmip调用CPLEX求解”,自己上手时却往往卡在环境配置、变量声明、约束写法和求解状态判读上,一耗就是两三天。这…

2026/9/30 0:01:22

I3C比I2C快10倍?RK3576实战:速率、DTS配置与混合总线避坑指南

I3C 比 I2C 快 10 倍?这句话在嵌入式群里传了很久,每次都能吵出一堆截图。前段时间我正好在 RK3576 上调板级 I3C 接口,从控制器寄存器一路摸到 Linux DTS 配置,踩了不少坑,也把这笔速度账彻底算明白了。本文就用 RK35…

2026/9/30 0:01:22

字符串转对象:JSON.parse、new Function与URLSearchParams

“字符串转对象”这几个字,我在技术群里见过的问法至少有十几种:有人拿着一串{a:1,b:2}说 JSON.parse 直接报错,有人要从 URL 里抠出参数,还有人只是想把abc变成能挂属性的东西。js 这门语言里,字符串和对象之间的转换…

2026/9/29 3:53:39

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/29 9:46:12

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/29 6:36:14

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑