【问题标题】:Playwright Python POST request剧作家 Python POST 请求
【发布时间】:2022-01-25 22:14:16
【问题描述】:

我正在使用以下代码从端点检索 json:

import json

from playwright.sync_api import sync_playwright

API_URL = 'url'

with sync_playwright() as p:
    browser = p.webkit.launch(headless=True)
    page = browser.new_page()
    page.goto(API_URL)
    html = page.evaluate('document.querySelector("pre").innerText')

try:
    data = json.loads(html)
except:
    data = None

print(data)

这适用于 GET 请求,但我应该怎么做才能执行 POST 请求? 我正在测试 POST 请求的 url 是 API_URL = 'https://www.soraredata.com/api/players/price-graph'

POST_data="""
      {"player_id": "8244483723335967330548112608338433168438009441877418350246645421695467333117",        "scarcity":"Limited",        "start_date":"2021-12-21T11:27:04.946521Z",        "end_date":"2022-01-21T11:27:04.946521Z",        "currency":"Ξ"}   
    """

编辑: 在hardkoded回答之后,我编辑了我的代码,但仍然无法正常工作(status=403 status_text='Forbidden),即使使用普通浏览器执行的请求似乎是合法的。

import json
from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.webkit.launch(headless=False)
    context = browser.new_context(base_url="https://www.soraredata.com")
    api_request_context = context.request
    page = context.new_page()

    to_send = """
      {
        "player_id": "8244483723335967330548112608338433168438009441877418350246645421695467333117",
        "scarcity":"Limited",
        "start_date":"2021-12-26T08:11:09.860Z",
        "end_date":"2022-01-25T08:11:08.637Z",
        "currency":"Ξ"
    }   
    """

    response = api_request_context.post(
        "/api/players/price-graph",
        headers={
            "Accept": "application/json, text/plain, */*",
            "Content-Type": "application/json"
        },
        data=to_send,
    )


try:
    print(response)
    data = json.loads(response)
except:
    # Still might fail sometimes
    data = None

print(data) 

【问题讨论】:

  • 你为什么需要剧作家?
  • 因为它可以绕过cloudflare

标签: python post webdriver playwright playwright-python


【解决方案1】:

您可以使用API request 功能:

browser = playwright.chromium.launch()
context = browser.new_context(base_url="https://api.github.com")
api_request_context = context.request
page = context.new_page()

response = api_request_context.post(
  "/user/repos",
  headers={
      "Accept": "application/vnd.github.v3+json",
      "Authorization": f"token {API_TOKEN}",
  },
  data={"name": REPO},
)

【讨论】:

  • 我使用您的建议编辑了我的问题中的代码,但它不起作用。似乎发送 post_data 失败
  • 我认为 403 将是另一个问题的一部分
  • 也许你是对的,但我不知道 403 是因为缺少某些东西还是因为 post 请求不起作用
  • 例如,为什么我不应该在这种情况下使用 async_playwright?
猜你喜欢
  • 2020-10-08
  • 2022-11-03
  • 2022-12-22
  • 1970-01-01
  • 2021-12-01
  • 2022-06-21
  • 1970-01-01
  • 2022-08-04
  • 2021-02-19
相关资源
最近更新 更多