如何更改我的 requests.get() 函数的发送方式?

How to change the way my requests.get() function is sent?

我正在尝试创建一个 http 请求以从在线站点获取一些 json 数据。当我设置 requests.get() 函数时,它似乎将参数中的一些特殊字符转换为其他值,导致响应失败。有没有办法控制 .get() 的发送方式?

我正在尝试发送此 http 请求: 'https://registers.esma.europa.eu/solr/esma_registers_firds_files/select?q=*&fq=publication_date:%5B2020-05-10T00:00:00Z+TO+2020-05-10T23:59:59Z%5D&wt=json&indent=true&start=0&rows=100'

为此,这是我的代码:

response = requests.get('https://registers.esma.europa.eu/solr/esma_registers_firds_files/select',
                   params={'q':'*',
                          'fq':'publication_date:%5B2020-05-10T00:00:00Z+TO+2020-05-10T23:59:59Z%5D',
                          'wt':'json',
                          'indent': 'true',
                          'start':0,
                          'rows':100},)

但是,此代码似乎将“*”字符和“:”字符转换为不同的格式,这意味着我得到了错误的响应代码。这是当我在代码中 运行 .url() 时打印出来的:

response.url

https://registers.esma.europa.eu/solr/esma_registers_firds_files/select?q=%2A&fq=publication_date%3A%255B2020-05-10T00%3A00%3A00Z%2BTO%2B2020-05-10T23%3A59%3A59Z%255D&wt=json&indent=true&start=0&rows=100

可以看到'q'参数中的'*'变成了'%2A',​​'fq'参数中的':'变成了'%3A',等等

我知道 link 有效,因为如果我将它直接输入 requests.get(),我会得到预期的结果。

有没有办法让 .get() 中的特殊字符不发生变化?我一直在谷歌搜索与请求模块和字符编码相关的任何内容,但没有任何运气。我可以在每次需要时使用整个 url,但我认为使用 params 是更好的做法。任何帮助将非常感激。谢谢!

这实际上不是问题所在。您看到的转化是应该发生的。它被称为URL编码。

问题出在 publication_date 值中。看到 %5B%5D 以及 + 标志了吗?

'fq':'publication_date:%5B2020-05-10T00:00:00Z+TO+2020-05-10T23:59:59Z%5D'
                       ^^^                    ^  ^                    ^^^

我不知道你从哪里得到这个字符串,但是这个字符串已经经过 URL 编码。 %5B%5D+[]和space的编码形式。您需要提供未编码的值,如下所示:

'fq':'publication_date:[2020-05-10T00:00:00Z TO 2020-05-10T23:59:59Z]'

requests 将处理编码。