使用Playwright与SeleniumBase获取XHR端点响应的问题
Pyppeteer 获取目标XHR响应的解决方案
针对你用Pyppeteer无法捕获目标XHR响应的问题,以下是具体实现步骤,核心是通过网络响应监听+反检测配置来拿到目标API的JSON数据,同时保留页面生成的Cookie和请求参数:
初始化浏览器时配置反检测参数
启动浏览器时添加禁用自动化识别的参数,避免被目标网站屏蔽,确保环境接近真实浏览器:import asyncio from pyppeteer import launch async def main(): browser = await launch( headless=False, # 调试阶段可设为False,上线后改为True ignoreHTTPSErrors=True, args=[ '--disable-blink-features=AutomationControlled', '--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', '--no-sandbox' ] ) page = await browser.newPage()监听响应事件,精准捕获目标XHR数据
通过page.on('response')事件筛选目标API,直接提取响应JSON、请求Cookie和参数:target_api = "https://www.ubereats.com/_p/api/getFeedV1" response_result = None async def capture_response(response): nonlocal response_result # 匹配目标API的URL if target_api in response.url: # 获取响应JSON response_result = await response.json() # 获取页面当前的Cookie(自动携带到XHR请求的Cookie) current_cookies = await page.cookies() # 解析GET请求参数 from urllib.parse import urlparse, parse_qs parsed_url = urlparse(response.url) request_params = parse_qs(parsed_url.query) print("请求参数:", request_params) print("关联Cookie:", current_cookies) page.on('response', capture_response) # 访问原始URL,触发目标XHR请求 await page.goto("你的UberEats指定URL", waitUntil='networkidle2') # 等待响应捕获完成 while response_result is None: await asyncio.sleep(0.5) print("目标API响应数据:", response_result) await browser.close() asyncio.run(main())关键注意事项
- 页面加载策略用
networkidle2,确保所有XHR请求完成后再继续执行 - 如果目标API是滚动/点击后触发的,需要模拟对应操作(比如
await page.evaluate('window.scrollTo(0, document.body.scrollHeight)')) - 若遇到Cookie未正确携带的情况,可在访问原始URL后手动提取Cookie,再通过
page.setCookie()强制注入 - 部分网站会检测浏览器特征,可额外添加
--start-maximized参数,或通过page.evaluate()修改navigator.webdriver等属性
- 页面加载策略用
内容的提问来源于stack exchange,提问作者Gagandeep Sharma
相关产品推荐
相关产品推荐

