【问题标题】:How to send request payload as parameter in python web scraping?python - 如何在python网络抓取中将请求有效负载作为参数发送?
【发布时间】:2021-10-28 09:29:42
【问题描述】:

我正在使用以下website 的请求在 python 中进行网络抓取。

当您将加载任何燃料类型的数据时,在检查元素中,您将看到由名称 getFilteredInventery 触发的 API。

假设您选择了 Diesel,那么我想抓取在给定 API 的响应部分中可见的所有数据。但我不能简单地打开它。在 headers 部分,您将看到请求有效负载,我想我也将其作为参数发送。

我浏览了互联网,发现我可以将请求有效负载作为请求中的参数发送。

这是我的代码:

payload = {"Search": {"FuelType": ["Diesel"]}, "Sort": {"Featured": "true"}}
url = "https://easyauto123.com.au/api/v1/getFilteredInventory"
page = requests.get(url, params=payload)
data = page.json()

但页面显示 400 错误。那么,我该如何解决这个错误呢?

API 链接:https://easyauto123.com.au/api/v1/getFilteredInventory

【问题讨论】:

  • 你使用GET方法,也许尝试使用POST方法? page = requests.post(url, data=payload) 请添加API链接)
  • API 链接已添加,非常感谢,它通过使用 POST 而不是 GET 来工作。如果您有时间,也许您可​​以输入此评论作为答案。

标签: python python-3.x web-scraping python-requests


【解决方案1】:

您在requests 库中发布的代码示例导致向URL 发出GET 请求,其中您定义的“有效负载”转换为查询参数并返回404。您可以像这样自己查看:

payload = {"Search": {"FuelType": ["Diesel"]}, "Sort": {"Featured": "true"}}
url = "https://easyauto123.com.au/api/v1/getFilteredInventory"
page = requests.get(url, params=payload)

print(page.url)
# => https://easyauto123.com.au/api/v1/getFilteredInventory?Search=FuelType&Sort=Featured
print(page.status_code)

API 需要一个带有 JSON 负载的 POST 请求,这通常在请求期间由 HTTP 标头 Content-Type 具有值 application/json 表示。)requests 库公开了此功能:

page = requests.post(url, json=payload)

您可以通过返回对象的存储request 属性评估用于特定请求的请求标头:

page = requests.post(url, json=payload)

print(page.request.headers)
# => {'User-Agent': 'python-requests/2.25.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '66', 'Content-Type': 'application/json'

print(page.request.headers['Content-Type'])
# => application/json

您可以将此与以下结果的请求进行比较:

page = requests.post(url, params=payload)
print(page.request.url)
# => https://easyauto123.com.au/api/v1/getFilteredInventory?Search=FuelType&Sort=Featured

print(page.request.headers)
# => {'User-Agent': 'python-requests/2.25.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '0'}

您可能会注意到此请求成功,但响应正文不同。另外,请注意 Content-Length 标头的值是 0(与 66 相比)并且 Content-Type 标头未设置。 Content-Length 标头表示有效负载的大小,在本例中为 0

【讨论】:

  • 感谢您提供如此详细的回答。
【解决方案2】:

你变种:

page = requests.get(url, params=payload)

试试这个变种:

page = requests.post(url, json=payload)

【讨论】:

  • 糟糕!我没有注意,也没有注意到你已经回答了这个问题。我包含了很多技术细节in mine。请随意借用任何你想要(或不想要)的东西。
猜你喜欢
  • 1970-01-01
  • 2016-12-15
  • 2017-05-15
  • 2020-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
相关资源
最近更新 更多