Pyppeteer捕获WebSocket流量时连接一分钟后关闭,如何实现永久存活?
解决Pyppeteer捕获WebSocket时连接一分钟后关闭的问题
你的问题主要有两个核心原因:一是代码里的asyncio.sleep(100)是固定时长的等待,时间到后程序直接退出,导致WebSocket连接被动断开;二是TradingView的服务器可能会因为页面长期无交互主动切断WebSocket连接。可以按以下步骤修复:
替换固定睡眠为永久事件等待
把await asyncio.sleep(100)换成await asyncio.Event().wait(),这样程序会一直处于挂起等待状态,不会主动终止,从而持续监听WebSocket流量。定时模拟页面交互,避免被判定为闲置
TradingView的WebSocket连接可能会因为页面长时间没有用户操作被服务器主动断开,所以可以新增一个定时任务,每隔一段时间模拟鼠标移动或轻量点击,让页面保持活跃状态。优化浏览器启动参数
确保autoClose=False已经设置,额外添加--disable-dev-shm-usage参数,避免因为共享内存不足导致浏览器意外关闭。
修改后的完整代码:
import asyncio from pyppeteer import launch async def keep_page_active(page): # 每隔30秒模拟一次鼠标移动,防止页面被判定为闲置 while True: await page.mouse.move(0, 0) await asyncio.sleep(30) async def main(): browser = await launch( headless=True, args=['--no-sandbox', '--disable-dev-shm-usage'], autoClose=False ) page = await browser.newPage() await page.goto('https://www.tradingview.com/symbols/BTCUSD/') # 启动页面活跃保持的后台任务 asyncio.create_task(keep_page_active(page)) cdp = await page.target.createCDPSession() await cdp.send('Network.enable') await cdp.send('Page.enable') def printResponse(response): print(response) cdp.on('Network.webSocketFrameReceived', printResponse) cdp.on('Network.webSocketFrameSent', printResponse) # 永久等待,维持程序运行 await asyncio.Event().wait() asyncio.get_event_loop().run_until_complete(main())
内容的提问来源于stack exchange,提问作者Bombosonic
相关产品推荐
相关产品推荐

