新闻详情

新闻详情

首页 / 资讯中心 / 详情

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

发布时间:2026/10/1 19:05:43来源:尧图网络
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

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

2026年32位Win7玩Steam老游戏:离线模式、TLS优化与系统配置全指南 2026/10/1 19:05:38

2026年32位Win7玩Steam老游戏:离线模式、TLS优化与系统配置全指南

先说结论:2026年的32位Win7,已经没法像十年前那样痛快地刷Steam商店、逛社区、同步云存档了。但如果你的需求只是“双击桌面图标,进游戏,能玩”,而且玩的以老游戏为主,这条路依然走得通。下面这份折腾记录&…

阅读更多 →
基于LSTM的电影评论情感分析毕设实战:从数据预处理到模型调优 2026/10/1 19:05:37

基于LSTM的电影评论情感分析毕设实战:从数据预处理到模型调优

简介:这份资源面向计算机相关专业正在准备课程设计、期末大作业或毕业设计的学生,提供一套基于LSTM实现电影评论情感倾向分析的完整Python项目。项目已获98分评价,适合需要项目实战练习、希望掌握深度学习文本分类流程的学习者参考。压缩包共…

阅读更多 →
OpenRig 多智能体编排实战:持久化、协作与工程化落地 2026/10/1 19:05:37

OpenRig 多智能体编排实战:持久化、协作与工程化落地

1. 从"一堆散装 Agent"到"一个能干活的小队":OpenRig 要解决的真问题 如果你最近半年折腾过 AI Agent,大概率经历过这样一个阶段:兴致勃勃地拉起三五个 Agent,一个负责查资料,一个负责写代码&…

阅读更多 →
CNN人脸识别考勤Demo实战:从课设到落库的完整链路 2026/10/1 19:05:37

CNN人脸识别考勤Demo实战:从课设到落库的完整链路

简介:这是一份面向高校学生与深度学习入门者的课程设计级人脸识别考勤演示项目,基于卷积神经网络实现人脸检测与签到流程,适合作为人工智能、机器学习相关课程的实践参考或毕业设计起步模板。压缩包共30个文件,约32.54MB&#xff…

阅读更多 →
基于LSTM的电影评论情感分析:从预处理到调优的毕设实战指南 2026/10/1 19:05:36

基于LSTM的电影评论情感分析:从预处理到调优的毕设实战指南

简介:这是一套面向计算机相关专业学生与项目实战学习者的LSTM电影评论情感倾向分析完整方案,可作为课程设计、期末大作业或毕业设计的参考实现,帮助解决文本预处理、词向量构建与情感二分类建模等核心问题。资源包共22个文件,约30…

阅读更多 →
GitHub Trending 揭示智能体工程化落地四大拐点与业务实践 2026/10/1 19:05:30

GitHub Trending 揭示智能体工程化落地四大拐点与业务实践

1. 这周 GitHub Trending 释放了什么信号刷 GitHub Trending 这件事,我从 2019 年就开始当成每周固定动作了。早期榜单上清一色是前端框架、CLI 工具、Awesome 清单,偶尔冒出一个 LLM 相关的仓库就能兴奋半天。但这周的中文圈子里,几个做智能…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉