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

使用pyppeteer拦截指定URL全部网络请求仅触发一次问题求解

问题原因

  • 事件监听器注册时机晚于页面跳转:你将response事件的绑定逻辑放在page.goto()执行之后,页面跳转过程中已经触发的请求不会被监听器捕获
  • 主协程提前终止:page.goto()默认在页面load事件触发后就返回,此时main()协程执行完毕,事件循环直接退出,页面后续的懒加载请求、异步接口请求都来不及触发回调就被销毁了

修正代码

import asyncio
from pyppeteer import launch

async def interceptResponse(response):
    # 如需拦截指定URL,在此处添加url匹配逻辑即可,例如 if '目标关键字' in response.url:
    print("printing response")
    print(response.url)
    

async def main():
    # 调试阶段可以设headless=False打开有头浏览器,方便观察页面加载状态
    browser = await launch(headless=False)
    page = await browser.newPage()
    # 先注册事件监听器,再执行页面跳转
    page.on('response', lambda response: asyncio.ensure_future(interceptResponse(response)))
    await page.goto('https://www.google.com/search?q=sun+flower&rlz=1C1CHBF_enIN963IN963&source=lnms&tbm=isch&sa=X&sqi=2&ved=2ahUKEwjboKfMkoj0AhURppUCHS9hAuMQ_AUoAXoECAIQAw&biw=1920&bih=486&dpr=1',
                    waitUntil='networkidle2') # 可选调整等待策略,networkidle2表示网络空闲2秒后再返回goto结果
    # 增加等待时长,保证后续异步请求、懒加载请求能正常触发,可根据业务需求替换为指定元素等待等逻辑
    await asyncio.sleep(10)
    await browser.close()

asyncio.get_event_loop().run_until_complete(main())

补充说明

如果不需要固定等待10秒,可以把等待逻辑替换为你的业务终止条件,比如爬取到目标数据后再关闭浏览器,避免事件循环提前终止。

内容的提问来源于stack exchange,提问作者Pyd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:06:09