小能豆

Selenium Post 方法

py

我正在尝试找到一种方法来获取通过无头浏览器执行的 post 方法的响应。

session = requests.Session()
session.get(<url here)
print session.cookies
r = session.post(url).content
print r

问题是响应 r 充满了 javascript,我无法使用 Selenium 来执行它,因为它不支持 POST 方法(据我所知)。有什么想法吗?


阅读 46

收藏
2024-11-01

共1个答案

小能豆

在使用无头浏览器(例如 Selenium)进行 POST 请求时,您可以通过 Selenium 的 execute_script 方法执行 JavaScript。这使您能够发送 POST 请求并获取响应。以下是如何在 Selenium 中执行 POST 请求并处理响应的一个例子:

方法一:使用 Selenium 和 JavaScript 发送 POST 请求

您可以使用 Selenium 的 execute_script 方法来运行 JavaScript 代码,利用 XMLHttpRequest 对象进行 POST 请求。以下是一个示例:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
import time

# 设置无头浏览器选项
options = Options()
options.headless = True  # 启用无头模式

# 使用 Chrome WebDriver
service = Service('path/to/chromedriver')  # 指定 chromedriver 的路径
driver = webdriver.Chrome(service=service, options=options)

# 访问页面
url = '<your_url>'
driver.get(url)

# 使用 JavaScript 发送 POST 请求
script = """
var xhr = new XMLHttpRequest();
xhr.open("POST", "<url_to_post>", false);  // false 表示同步请求
xhr.setRequestHeader("Content-Type", "application/json");
xhr.send(JSON.stringify({"key": "value"}));  // 根据需要修改请求数据
return xhr.responseText;  // 返回响应文本
"""
response = driver.execute_script(script)

# 打印响应
print(response)

# 清理
driver.quit()

说明:

  1. 无头浏览器: 设置了 Chrome 浏览器的无头模式,以便在不打开浏览器窗口的情况下运行。
  2. POST 请求: JavaScript 的 XMLHttpRequest 用于发送 POST 请求,您需要根据实际的请求 URL 和数据修改 xhr.openxhr.send 部分。
  3. 返回响应: execute_script 返回 JavaScript 代码的结果,在这里是服务器的响应文本。

方法二:结合 requests 库和 Selenium

如果您只想获取通过请求的响应,您可以使用 requests 库进行 POST 请求,并使用 Selenium 处理 JavaScript:

import requests
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
import time

# 发送初始 GET 请求并获取 cookie
session = requests.Session()
response = session.get('<your_url>')
print(session.cookies)

# 发送 POST 请求
post_url = '<url_to_post>'
post_data = {'key': 'value'}  # 根据需要修改数据
post_response = session.post(post_url, json=post_data)  # 或使用 data=post_data
print(post_response.text)  # 输出 POST 响应

# 如果需要使用 Selenium 来处理 JavaScript
options = Options()
options.headless = True
service = Service('path/to/chromedriver')
driver = webdriver.Chrome(service=service, options=options)

# 打开页面(使用相同的 cookie)
driver.get('<your_url>')
for cookie in session.cookies:
    driver.add_cookie({'name': cookie.name, 'value': cookie.value})

# 进行后续操作
driver.get('<your_url_after_post>')  # 根据需要导航到其他页面
# ...

# 清理
driver.quit()

注意:

  • 确保将 <your_url><url_to_post> 和请求数据根据实际情况进行更改。
  • 如果 POST 请求的响应仍然包含 JavaScript 代码,您可能需要使用 Selenium 进一步解析 DOM 或执行 JavaScript。

通过上述方法,您应该能够有效地处理无头浏览器中的 POST 请求及其响应。

2024-11-01