【问题标题】:Python requests call with URL using parametersPython请求使用参数调用URL
【发布时间】:2016-07-20 08:53:28
【问题描述】:

我正在尝试调用 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 并请求通过以下方式进行调用:

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 上试过这个,在第一个参数之后都被删掉了。

【问题讨论】:

  • 似乎import.io 的 api 接受了其余的参数。

标签: python python-requests import.io


【解决方案1】:

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 没有执行通用字符串模板,因此应该使用其他东西来解决这个问题(参见下面的 cmets)。

【讨论】:

  • 这似乎不适用于请求 2.24.0。 r = requests.get("https://www.google.com/{{myparam}}", params={"myparam":"imghp"}) 返回 404,但 google.com/imghp 是一个完全有效的 URL。还有什么要补充的吗?您的参数中传递的 {{crawler_id}} 参数在哪里?这是一个路径参数。
  • {{crawler_id}} 部分不是 URL 参数,而是基本 URL 的一部分。 requests 包不执行一般模板,而是处理 URL 参数和清理。一般字符串模板有几个选项,例如the standard library option 和(我最喜欢的)Jinja,它们可以直接与上面的示例一起使用。我会更新我的答案来解决这个问题。
  • 没有“URL 参数”之类的东西。没有“基本 url”——URL 的那部分称为“路径”,因此当它被参数化时,该参数通常称为“路径参数”或“路径变量”。 requests 支持“查询参数”,因为它们在查询中所以被这样调用。但是,OP 已经要求某种方式来执行包含路径参数的调用,并且您使用了占位符 LITERALLY!你的答案是错误的。此外,“通用字符串模板”对于您正在做的事情来说是一个糟糕的主意,因为它不执行 URL 编码。既可能是错误的,也可能是易受攻击的。
【解决方案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)

【讨论】:

    猜你喜欢
    • 2012-11-17
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 2015-02-26
    • 2022-11-26
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多