尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
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或者其他第三方编码库。调试时可以逆向解码验证结果是否正确避免接口报参数解析失败。
RELATED

相关推荐

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

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

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

📅 2026/9/30 7:11:51
YOLOv13改进策略【卷积层篇】| CVPR2024 UniRepLKNet Block,大核感受野的可重参数化卷积

YOLOv13改进策略【卷积层篇】| CVPR2024 UniRepLKNet Block,大核感受野的可重参数化卷积

本文基于 YOLOv13 官方仓库(iMoonLab/yolov13,ultralytics 8.3.63 fork) 实测整理,Windows/CPU 全程可跑。UniRepLKNet(Ding et al., CVPR 2024《UniRepLKNet: A Universal Perception Large-Kernel ConvNet》,官方源码 github.com/AILab-CVC/UniRepLKNet)给"大核卷…

📅 2026/9/30 7:06:50
YOLOv13改进策略【卷积层篇】| CVPR2023 DCNv3 可变形卷积,采样点第三次进化

YOLOv13改进策略【卷积层篇】| CVPR2023 DCNv3 可变形卷积,采样点第三次进化

本文基于 YOLOv13 官方仓库(iMoonLab/yolov13,ultralytics 8.3.63 fork) 实测整理,Windows/CPU 全程可跑。DCNv3(Wang et al., CVPR 2023《InternImage: Exploring Large-Scale Vision Foundation Models with Deformable Convolutions》,官方源码 github.com/OpenGVLab/…

📅 2026/9/30 7:06:50
MORE NEWS

更多资讯

📰

段式内存管理地址变换与越界检查:课堂练习4.1复盘

课堂练习4.1 的题目发下来的时候,我第一反应是这题应该不难——段式内存管理翻来覆去就那几个公式:拆地址、查段表、做检查、加基址。结果真拿起笔算第一道小题,还是卡了两分钟。卡的点不在于公式本身,而在于题干给的那组数字里藏…

📰

基于YOLOv8的舰船目标检测系统:从数据集标注到PyQt5界面集成

舰船目标检测这个方向,我前后折腾过三套方案,从最早的 YOLOv5 改配置文件,到后来用 YOLOv8 重新搭一套带界面的完整系统,中间踩的坑足够写一本小册子。很多人第一次接触这类项目,会觉得"不就是拿个预训练权重跑一…

📰

JMeter实战入门:以飞致云平台为靶标快速掌握接口测试核心技能

1. 为什么飞致云平台成了JMeter入门的“黄金练兵场”很多人第一次打开JMeter,面对空白的测试计划树和密密麻麻的线程组、HTTP请求、断言、监听器,第一反应是:这玩意儿到底在测什么?测谁?测完又怎么知道对不对&#xff…

📰

Mac读写NTFS移动硬盘的三种实用方案:从驱动到exFAT

朋友抱着一块移动硬盘来找我:“这个盘在Windows上拷满了资料,插到你Mac上试试能不能读?”我接过硬盘插上去,系统确实认出了分区,可当我试着往盘里拖新文件夹时,Mac直接弹窗拒绝。这块盘是NTFS格式&#xff…

📰

逐行拆解one-skill-to-rule-them-all的bash脚本:ID推导、归档扫描,以及你必须防住的三种静默失败

逐行拆解one-skill-to-rule-them-all的bash脚本:ID推导、归档扫描,以及你必须防住的三种静默失败 【免费下载链接】one-skill-to-rule-them-all The meta-skill that builds and improves all your skills, including itself. Watches your work session…

📰

银河麒麟v10 SP1安装Docker:前置问题、内核参数与离线部署指南

简介:银河麒麟V10 SP1 Server上安装Docker的实操手册,面向国产化服务器环境下的运维与开发人员,专门解决官方源未收录Docker服务端软件包、直接yum安装失败的问题。资料包含一个docx格式文档,压缩包体积仅17KB,篇幅短小…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬