Python使用参数请求URL调用

2024-04-19 13:13:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试调用import.io API。 此调用需要具有以下结构:

'https://extraction.import.io/query/extractor/{{crawler_id}}?_apikey=xxx&url=http://www.example.co.uk/items.php?sortby=Price_LH&per_page=96&size=1%2C12&page=35'

您可以看到,在该调用中,还必须包含参数“url”:

http://www.example.co.uk/items.php?sortby=Price_LH&per_page=96&size=1%2C12&page=35

碰巧这个辅助URL也需要参数。但是,如果我像上面的示例那样将其作为普通字符串传递,那么当我获得API响应时,API响应只包括第一个参数之前的部分:

http://www.example.co.uk/items.php?sortby=Price_LH

这是不正确的,它似乎是在用不完整的URL而不是我传入的URL进行调用。

我使用Python和requests以以下方式执行调用:

import requests
import json

row_dict = {'url': u'http://www.example.co.uk/items.php?sortby=Price_LH&per_page=96&size=1%2C12&page=35', 'crawler_id': u'zzz'}
url_call = 'https://extraction.import.io/query/extractor/{0}?_apikey={1}&url={2}'.format(row_dict['crawler_id'], auth_key, row_dict['url'])
r = requests.get(url_call)
rr = json.loads(r.content)

当我打印reuslt时:

"url" : "http://www.example.co.uk/items.php?sortby=Price_LH",

但当我打印r.url时:

https://extraction.import.io/query/extractor/zzz?_apikey=xxx&url=http://www.example.co.uk/items.php?sortby=Price_LH&per_page=96&size=1%2C12&page=35

所以在URL中看起来一切都很好,但在响应中却没有。

我用其他的url尝试过,所有的url都在第一个参数之后被剪切。


Tags: ioimporthttpurlexamplewwwpageitems
2条回答

您需要URL encode发送到API的URL。

原因是服务器将与号解释为URL https://extraction.import.io/query/extractor/XXX参数的标记?

这就是他们在url中被剥离的原因:

http://www.example.co.uk/items.php?sortby=Price_LH

使用urllib.quote(row_dict['url'])尝试以下操作:

import requests
import json
import urllib

row_dict = {'url': u'http://www.example.co.uk/items.php?sortby=Price_LH&per_page=96&size=1%2C12&page=35', 'crawler_id': u'zzz'}
url_call = 'https://extraction.import.io/query/extractor/{0}?_apikey={1}&url={2}'.format(row_dict['crawler_id'], auth_key, urllib.quote(row_dict['url']))
r = requests.get(url_call)
rr = json.loads(r.content)

requests库将处理您的所有URL encoding需要。这是使用requests向URL添加参数的正确方法:

import requests

base_url = "https://extraction.import.io/query/extractor/{{crawler_id}}"
params = dict()
params["_apikey"] = "xxx"
params["url"] = "http://www.example.co.uk/items.php?sortby=Price_LH&per_page=96&size=1%2C12&page=35"

r = requests.get(base_url, params=params)
print(r.url)

一种更有可读性的格式化参数的方法:

params = {
    "_apikey" : "xxx",
    "url" : "http://www.example.co.uk/items.php?sortby=Price_LH&per_page=96&size=1%2C12&page=35"
}

相关问题 更多 >