我正在尝试调用 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 响应只包含第一个参数之前的部分:
这是不正确的,它似乎会使用不完整的 URL 而不是我传入的 URL 进行调用。
我正在使用 Python 并请求以下列方式进行调用:
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)
当我打印结果时:
"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 进行了尝试,但都在第一个参数后被截断。
最佳答案
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"
}
请注意,上面的 {{crawler_id}}
部分不是 URL 参数,而是基本 URL 的一部分。由于 Requests 没有执行一般的字符串模板化,因此应该使用其他东西来解决这个问题(见下面的评论)。
关于Python 请求使用参数调用 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38476648/