如何用Python提取Chrome网络面板特定XHR的response数据
两种方案获取动态XHR响应数据
方案一:用Selenium自带的Chrome DevTools Protocol(CDP)
不用额外安装依赖,直接通过Chrome调试协议捕获网络请求,步骤如下:
- 配置Chrome开启性能日志,用来记录所有网络请求
- 编写函数倒序遍历日志,筛选出最新的
query-list请求 - 点击下一页后,调用函数提取响应内容
代码示例:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import json # 配置Chrome,开启性能日志 chrome_options = webdriver.ChromeOptions() chrome_options.set_capability("goog:loggingPrefs", {"performance": "ALL"}) driver = webdriver.Chrome(options=chrome_options) driver.get("你的目标网页地址") def get_latest_query_list_response(): # 倒序遍历性能日志,定位最新的query-list请求 logs = driver.get_log("performance") for log in reversed(logs): log_data = json.loads(log["message"])["message"] # 只处理请求完成的日志,且URL包含query-list if log_data["method"] == "Network.responseReceived" and "query-list" in log_data["params"]["response"]["url"]: request_id = log_data["params"]["requestId"] # 通过CDP命令获取完整响应体 response = driver.execute_cdp_cmd("Network.getResponseBody", {"requestId": request_id}) return response["body"] return None # 首次加载后获取数据 first_data = get_latest_query_list_response() print(first_data) # 点击下一页(替换成你页面的下一页按钮选择器,比如CSS或XPath) next_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, "替换成实际的下一页选择器")) ) next_btn.click() # 等待新请求完成(用显式等待比固定sleep更可靠) WebDriverWait(driver, 10).until(lambda d: len(d.get_log("performance")) > len(logs)) # 获取最新的响应数据 latest_data = get_latest_query_list_response() print(latest_data) driver.quit()
方案二:用Selenium Wire
Selenium Wire是Selenium的扩展工具,专门用于拦截和处理网络请求,操作更简洁:
- 先安装依赖:
pip install selenium-wire - 用Selenium Wire驱动启动浏览器
- 点击下一页后,倒序遍历所有请求,提取最新的
query-list响应
代码示例:
from seleniumwire import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() driver.get("你的目标网页地址") def get_latest_query_list_response(): # 倒序查找最新的符合条件的请求 for req in reversed(driver.requests): if "query-list" in req.url and req.response: # 解码响应体,编码格式根据实际情况调整 return req.response.body.decode("utf-8") return None # 首次加载后获取数据 first_data = get_latest_query_list_response() print(first_data) # 点击下一页 next_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, "替换成实际的下一页选择器")) ) next_btn.click() # 等待新请求完成 WebDriverWait(driver, 10).until(lambda d: len(d.requests) > len(driver.requests)) # 获取最新响应数据 latest_data = get_latest_query_list_response() print(latest_data) driver.quit()
注意事项
- 把代码中的
你的目标网页地址和替换成实际的下一页选择器替换为项目真实值 - 优先使用显式等待(WebDriverWait)替代固定sleep,避免因网络延迟导致获取不到数据
- 如果响应是JSON格式,可通过
json.loads()将字符串转为字典,方便提取具体字段
内容的提问来源于stack exchange,提问作者Sameerjeet Singh Chhabra
相关产品推荐
相关产品推荐

