Python请求模块GET方法:处理包含%的参数中的分页令牌



我正在尝试处理带有分页的API响应。第一页提供了到达下一页的分页令牌,但是当我尝试将其反馈给requests.get方法的params参数时,它似乎以错误的方式对令牌进行了稍微编码。

我试图检索下一页(使用第一个requests.get方法的response输出):

# Initial request
response = requests.get(url=url, headers=headers, params=params)
params.update({"paginationToken": response.json()["paginationToken"]})
# Next page
response = requests.get(url=url, headers=headers, params=params)

这个失败的状态是500:Internal Server Error和消息Padding is invalid and cannot be removed.

分页令牌示例:gyuqfh%2bqyNrV9SI1%2bXulE6MXxJgb1VmOu68eH4YZ6dWUgRItb7yJPnO9bcEXdwg6gnYStBuiFhuMxILSB2gpZCLb2UjRE0pp9RkDdIP226M%3d

如果你仔细观察,responseurl属性似乎显示了一个略有不同的标记,特别是在'%'符号周围:https://www.wikiart.org/en/Api/2/DictionariesByGroup?group=1&paginationToken=gyuqfh%252bqyNrV9SI1%252bXulE6MXxJgb1VmOu68eH4YZ6dWUgRItb7yJPnO9bcEXdwg6gnYStBuiFhuMxILSB2gpZCLb2UjRE0pp9RkDdIP226M%253d

例如,分页令牌和url的结尾不同:226M%3d226M%253d。当我手动复制url的第一部分并添加正确的分页令牌时,它确实在浏览器中检索信息。

我是否缺少某种编码,我应该应用到request.get参数,然后再将它们反馈到一个新的请求?

你是对的,这是某种形式的编码,百分比编码是准确的。它经常用于对url进行编码。很容易解码:

from urllib.parse import unquote
pagination_token="gyuqfh%252bqyNrV9SI1%252bXulE6MXxJgb1VmOu68eH4YZ6dWUgRItb7yJPnO9bcEXdwg6gnYStBuiFhuMxILSB2gpZCLb2UjRE0pp9RkDdIP226M%253d"
pagination_token = unquote(pagination_token)
print(pagination_token)

输出:

gyuqfh%2bqyNrV9SI1%2bXulE6MXxJgb1VmOu68eH4YZ6dWUgRItb7yJPnO9bcEXdwg6gnYStBuiFhuMxILSB2gpZCLb2UjRE0pp9RkDdIP226M%3d

但是我希望这是你的一半问题,使用请求会话对象https://requests.readthedocs.io/en/master/user/advanced/#session-objects来发出请求,因为很可能有一个cookie将与要与分页令牌一起使用的请求一起发送。我不能确定,因为网站目前已经关闭了。

最新更新