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 响应仅包含第一个参数之前的部分:

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

这是不正确的,它看起来好像是用不完整的 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 没有执行一般的字符串模板化,应该使用其他东西来解决这个问题(见下面的评论)。