python - python请求模块请求参数编码的url与预期的url不同
问题描述
我在 python 项目请求模块上的 url 编码有问题。
这是我从wireshark数据包中获得的两个不同的url编码参数
- 0900+%28%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%AD+%ED%91%9C%EC%A4%80%EC%8B%9C%29
- 0900%20(%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%AD%20%ED%91%9C%EC%A4%80%EC%8B%9C)
'1' 是 python 请求模块编码的 url,'2' 是来自 Web 浏览器发送数据包的 url。当我解码它们时,它显示相同的 utf-8 文本。
似乎它们之间对空格和括号的处理是不同的。有没有办法可以将“1”更改为“2”?
这是我用来发送请求的代码
_url = "http://something"
_headers = {
'Accept': 'text/javascript',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'ko-KR',
'Connection': 'keep-alive',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest'
}
_params = {
'action': 'log',
'datetime': '0900 (대한민국 표준시)'
}
# This is the request part
session = requests.Session()
res = session.get(_url, headers=_headers, params=_params)
解决方案
您可以手动对您进行编码_params
以构造您的查询字符串,然后将其连接到您的_url
.
您可以使用
urllib.parse.urlencode
[Python-Docs]将您的_params
字典转换为百分比编码的 ASCII 文本字符串。生成的字符串是一系列key=value
由字符分隔的对&
,其中键和值都使用quote_via
函数引用。默认情况下,quote_plus()
用于引用值,这意味着空格被引用为+
字符,/
字符被编码为%2F
,这遵循 GET 请求的标准(application/x-www-form-urlencoded)。可以按原样传递的替代函数,quote_via
它将quote()
空格编码为%20
而不是编码/
字符。为了最大限度地控制引用的内容,请使用quote
并指定安全值。
from urllib.parse import quote_plus, quote, urlencode
import requests
url_template = "http://something/?{}"
_headers = { ... }
_params = {"action": "log", "datetime": "0900 (대한민국 표준시)"}
_url = url_template.format(urlencode(_params, safe="()", quote_via=quote))
response = requests.get(_url, headers=_headers)
推荐阅读
- flutter - 如何将列表视图的属性保存在列表中?
- java - java.lang.NoSuchMethodError:org.quartz.Scheduler.deleteTrigger(Ljava/lang/String;Ljava/lang/String;)V
- foreach - 使用 List 而不是 ScrollView 和 ForEach
- vue.js - 当我在登录操作后尝试推送时,出现意外错误
- android - 是否有所有 android 值文件夹的列表?
- android - 当我尝试使用启动器主题应用启动画面时应用程序崩溃
- javascript - 如何取消使用 JavaScript 上传文件但人可以在 Ajax 请求中提交其余的表单字段
- sql - 卖房的SQL数据模型
- go - GORM golang 删除 SET NULL
- wordpress - 从 Wordpress 中自定义帖子类型的类别中获取 ACF 文本字段值