You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 15:45:56