Python 请求调用 URL 使用参数
Python requests call with URL using parameters
我正在尝试拨打 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 而不是我传入的那个进行调用。
我正在使用 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)
当我打印 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 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"
}
请注意,上面的 {{crawler_id}}
部分不是 URL 参数,而是基础 URL 的一部分。由于 Requests 没有执行一般的字符串模板化,应该使用其他东西来解决这个问题(见下面的评论)。
我正在尝试拨打 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 而不是我传入的那个进行调用。
我正在使用 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)
当我打印 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 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
:
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 没有执行一般的字符串模板化,应该使用其他东西来解决这个问题(见下面的评论)。