点击按钮交互后API抓取数据:同窗口执行request.get的疑问
解决Selenium会话中用requests获取动态加载数据的问题
你的核心问题在于:requests和Selenium是完全独立的HTTP会话——Selenium操作的浏览器保存了页面交互后的会话状态(比如Cookie、认证令牌),但requests默认会新建一个干净的会话,完全不知道浏览器里发生的操作,所以直接调用requests.get拿不到需要的数据。
下面是具体的解决方案,关键是把Selenium浏览器的会话状态(主要是Cookie)同步给requests,复用同一个会话上下文:
步骤说明
- 先完成所有Selenium的交互操作(打开页面、点击按钮触发对话框等)
- 从Selenium驱动中提取当前会话的Cookie,转换成requests能识别的格式
- 创建requests会话,导入Cookie并设置匹配的请求头
- 发送请求获取数据,最后再关闭Selenium驱动
修改后的完整代码
import requests from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 补充你遗漏的By导入 chrome_options = webdriver.ChromeOptions() chrome_options.add_argument("start-maximized") driver = webdriver.Chrome(options=chrome_options) driver.get(url) XPATH = "//*[name()='svg' and contains(@class, 'jss350')]" XPATH2 = '/html/body/div[3]/div[3]/div/div[3]/button/span[1]' # 等待SVG元素加载完成 WebDriverWait(driver, 20).until(EC.presence_of_all_elements_located((By.XPATH, XPATH))) # 获取SVG元素列表并点击指定项 svg_elements = driver.find_elements(By.XPATH, XPATH) for element in svg_elements[3:4]: element.click() # 打开对话框窗口 # 关闭对话框 WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, XPATH2))).click() # ------------------------ 核心修改部分 ------------------------ # 1. 从Selenium浏览器中提取当前会话的Cookie selenium_cookies = driver.get_cookies() # 2. 创建requests会话,同步浏览器Cookie session = requests.Session() for cookie in selenium_cookies: session.cookies.set(cookie['name'], cookie['value']) # 3. 设置与浏览器一致的请求头(直接从浏览器获取更准确) session.headers.update({ 'user-agent': driver.execute_script("return navigator.userAgent;"), 'accept': 'application/json, text/plain, */*' # 可根据目标接口要求调整 }) # 4. 发送请求获取数据 params = { 'products': 'RU', } target_url = 'my url' # 替换为你的目标接口URL r = session.get(target_url, params=params) json_data = r.json() print(r.url) print(r.text) # ------------------------ 核心修改结束 ------------------------ # 最后关闭浏览器驱动 driver.quit()
额外注意事项
- 不要提前调用
driver.quit():这会关闭浏览器并销毁会话状态,导致Cookie失效 - 如果目标接口依赖
localStorage或sessionStorage中的令牌(比如access_token),可以用以下方式提取并添加到请求头:token = driver.execute_script("return localStorage.getItem('access_token');") session.headers.update({'Authorization': f'Bearer {token}'}) - 部分网站会校验
referer、origin等请求头,你可以从浏览器开发者工具中复制这些头信息,加到session的headers里,确保请求与浏览器发起的完全一致
内容的提问来源于stack exchange,提问作者G_V
相关产品推荐
相关产品推荐

