Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
使用Puppeteer获取按钮触发的动态下载链接_创想鸟

使用Puppeteer获取按钮触发的动态下载链接

使用puppeteer获取按钮触发的动态下载链接

本文详细介绍了如何使用Puppeteer处理不直接包含URL的动态下载按钮。通过拦截网络请求,特别是利用page.waitForRequest和Promise.all,可以在点击按钮后捕获到实际触发的下载链接,从而实现自动化下载,解决了传统HTML解析无法获取动态生成链接的问题。

1. 问题背景:动态下载链接的挑战

在自动化网页操作中,我们经常会遇到需要点击按钮来下载文件的情况。然而,许多现代网页应用(SPA或使用Ajax)的下载按钮并不会直接在HTML中包含一个href属性指向下载链接。相反,它们通常会触发一个JavaScript事件,该事件随后向后端发起一个网络请求,从而启动文件下载。在这种情况下,传统的DOM解析方法(如获取href属性)将无法获取到实际的下载URL。

例如,一个下载按钮可能看起来像这样,没有任何直接的URL信息:

要获取这种按钮所关联的下载链接,我们需要一种不同的策略:拦截并监听按钮点击后发出的网络请求。

2. 核心原理:网络请求拦截

Puppeteer提供了一个强大的功能:网络请求拦截(Network Request Interception)。通过page.waitForRequest()方法,我们可以等待并捕获页面发出的特定网络请求。当一个按钮点击后触发文件下载时,浏览器会向服务器发起一个下载请求。只要我们能在这个请求发出之前设置好监听器,就可以捕获到该请求的URL。

关键在于:

时序性: 必须在点击按钮之前设置好请求监听器。过滤: 可能有多个请求发出,需要通过请求的URL模式、方法或类型来筛选出我们关心的下载请求。并发: 点击按钮和等待请求这两个动作需要同时进行,或者说,等待请求的承诺需要在点击动作发生之前就处于监听状态。

3. 实现步骤与示例代码

以下是如何使用Puppeteer捕获动态下载链接的详细步骤和示例代码:

3.1 准备工作

首先,确保你已经安装了Puppeteer:

npm install puppeteer

3.2 自动化流程

我们将以一个实际案例为例:从data.ademe.fr网站下载一个CSV文件。这个过程通常涉及两个点击:首先点击一个“下载数据”按钮(可能是一个通用按钮,用于展开下载选项),然后点击一个“导出CSV”按钮(实际触发下载)。

const puppeteer = require("puppeteer");let browser;(async () => {  try {    // 1. 启动浏览器实例    browser = await puppeteer.launch();    const [page] = await browser.pages(); // 获取默认页面或新页面    // 2. 导航到目标URL    const url = "https://data.ademe.fr/datasets/liste-des-entreprises-rge-2";    await page.goto(url, { waitUntil: "domcontentloaded" }); // 等待DOM内容加载完成    // 3. 定位并点击第一个触发下载流程的按钮(如果有的话)    // 这个按钮可能只是展开了下载选项,或者触发了数据加载    const initialBtn = await page.waitForSelector('[aria-label="Téléchargement des données"]');    await initialBtn.click();    // 4. 关键步骤:设置请求监听器并点击实际的下载按钮    // 使用 Promise.all 确保请求监听器在点击动作发生之前就已激活    const [request] = await Promise.all([      // 等待满足特定条件的网络请求      page.waitForRequest(req =>        // 过滤条件:请求URL以.csv结尾,或者包含特定的API路径        req.url().endsWith(".csv") ||        req.url().includes("data.ademe.fr/data-fair/api/v1/datasets/liste-des-entreprises-rge-2")      ),      // 定位并点击实际触发下载的按钮      (await page.waitForSelector('[aria-label="Export CSV"]')).click()    ]);    // 5. 获取并打印捕获到的下载链接    console.log("捕获到的下载URL:", request.url());    // 6. (可选)根据捕获到的URL下载文件    // 如果需要下载文件,可以调用一个辅助函数,例如:    // await downloadFile(request.url(), "downloaded_file.csv"); // 假设 downloadFile 是一个已定义的函数    // 参考 Stack Overflow 上的下载文件函数:https://stackoverflow.com/a/51302466/6243352  } catch (err) {    console.error("发生错误:", err);  } finally {    // 7. 关闭浏览器实例    if (browser) {      await browser.close();    }  }})();

3.3 代码解析

browser = await puppeteer.launch();: 启动一个新的浏览器实例。const [page] = await browser.pages();: 获取当前浏览器中打开的第一个页面。await page.goto(url, { waitUntil: “domcontentloaded” });: 导航到目标网页。waitUntil: “domcontentloaded”表示等待DOM内容加载完成,通常比networkidle0更快,且适用于大多数情况。await page.waitForSelector(‘[aria-label=”Téléchargement des données”]’);: 等待页面上出现具有特定aria-label属性的元素。这是定位按钮的关键。await initialBtn.click();: 点击定位到的按钮。Promise.all([…]): 这是实现请求拦截的关键。Promise.all会并行执行数组中的所有Promise,并等待它们全部完成。page.waitForRequest(req => …): 这个Promise会等待页面发出一个符合我们条件的网络请求。传入的回调函数是一个谓词(predicate),当请求对象req满足条件时(例如,URL以.csv结尾,或者包含特定的API路径),该Promise就会被解析,并返回捕获到的Request对象。(await page.waitForSelector(‘[aria-label=”Export CSV”]’)).click(): 这个Promise会等待实际的“导出CSV”按钮出现,然后点击它。通过将page.waitForRequest放在Promise.all中,我们确保了请求监听器在点击动作发生之前就已经处于活跃状态,从而不会错过请求。request.url(): 从捕获到的Request对象中获取实际的下载URL。错误处理与资源释放: try…catch…finally结构确保了即使发生错误,浏览器实例也能被正确关闭。

4. 注意事项与优化

请求过滤条件: page.waitForRequest的回调函数至关重要。你需要根据目标网站的实际情况来编写合适的过滤逻辑。常见的过滤条件包括:req.url().endsWith(“.csv”) 或 endsWith(“.zip”) 等文件扩展名。req.url().includes(“api/download”) 等API路径关键词。req.method() === ‘GET’ 或 POST。req.resourceType() === ‘document’ 或 xhr 等资源类型。时序问题: 如果点击按钮后立即发出请求,确保waitForRequest的设置在点击之前完成。Promise.all是解决此问题的优雅方式。多个请求: 如果点击一个按钮可能触发多个相关请求,你需要确保你的过滤条件足够精确,只捕获到你真正需要的下载请求。动态URL模式: 有些网站的下载URL可能包含动态参数(如时间戳、用户ID等)。只要这些参数不影响URL的整体模式识别,includes或match正则表达式仍然有效。文件下载: 捕获到URL后,Puppeteer本身不直接提供文件下载功能(它模拟的是浏览器行为,但不会将文件保存到本地)。你需要使用Node.js的http/https模块或第三方库(如node-fetch或axios)来发起HTTP请求并保存文件。区域差异: 某些网站可能根据用户地理位置或语言设置提供不同的下载链接或按钮文本。在编写选择器和请求过滤条件时,需要考虑到这些潜在差异。

5. 总结

通过利用Puppeteer强大的网络请求拦截能力,我们可以有效地处理那些不直接暴露下载URL的动态按钮。page.waitForRequest结合Promise.all提供了一种健壮且灵活的方法,用于在自动化脚本中捕获并利用这些动态生成的下载链接,从而实现更复杂的网页自动化任务,例如批量下载文件。理解并熟练运用这一技术,将大大扩展Puppeteer在复杂场景下的应用能力。

以上就是使用Puppeteer获取按钮触发的动态下载链接的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1509401.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
JavaScript如何用数组的values方法遍历元素
上一篇 2025年12月20日 05:25:55
Promise的基本用法与示例
下一篇 2025年12月20日 05:26:11

相关推荐

  • Java中实现跨类和函数共享变量的指南

    Java中实现跨类和函数共享变量的指南Java中实现跨类和函数共享变量的指南Java中实现跨类和函数共享变量的指南Java中实现跨类和函数共享变量的指南

    本教程将详细介绍在Java中如何创建可在所有类和函数中访问的共享变量。通过利用public static关键字,我们可以定义类级别的变量,实现全局共享状态。文章将提供声明、访问示例,并讨论使用此类变量时的最佳实践和注意事项,确保代码的可维护性和健壮性。 理解共享变量的需求 在java应用程序开发中,…

    2026年9月24日 • 用户投稿
    100
  • Ubuntu挂载网络共享

    在ubuntu中挂载网络共享有多种方法,以下是其中两种常用的方法: 方法一:使用mount命令 安装必要的软件包:如果你还没有安装cifs-utils(用于CIFS/SMB协议),可以使用以下命令安装: sudo apt updatesudo apt install cifs-utils 创建挂载点…

    2026年9月24日
    000
  • x浏览器怎么查看网页源代码_x浏览器查看页面HTML源代码方法

    x浏览器怎么查看网页源代码_x浏览器查看页面HTML源代码方法x浏览器怎么查看网页源代码_x浏览器查看页面HTML源代码方法x浏览器怎么查看网页源代码_x浏览器查看页面HTML源代码方法x浏览器怎么查看网页源代码_x浏览器查看页面HTML源代码方法

    1、打开x浏览器加载网页后,点击右上角三点菜单选择“查看源代码”即可显示HTML源码;2、长按页面链接可在快捷菜单中查找“查看源代码”选项快速访问;3、启用开发者工具模式后可通过“检查元素”功能进行更深入的页面结构分析。 如果您在浏览网页时需要查看页面的HTML源代码,以便分析结构或调试内容,可以通…

    2026年9月24日 • 用户投稿
    000
  • Java中实现州府问答系统:2D数组管理、排序与用户输入验证

    Java中实现州府问答系统:2D数组管理、排序与用户输入验证Java中实现州府问答系统:2D数组管理、排序与用户输入验证Java中实现州府问答系统:2D数组管理、排序与用户输入验证Java中实现州府问答系统:2D数组管理、排序与用户输入验证

    本教程详细介绍了如何使用Java构建一个州府问答系统。内容涵盖了使用二维数组存储州名及其首都数据、实现冒泡排序对数据按首都名称进行排序、以及如何通过用户输入验证机制,处理大小写不敏感的答案,并最终统计正确率。文章提供了完整的代码示例和关键注意事项,帮助读者理解并实现类似的数据结构与算法应用。 1. …

    2026年9月24日 • 用户投稿
    100
  • sublime如何配置使其支持EditorConfig _sublime EditorConfig支持配置

    sublime如何配置使其支持EditorConfig _sublime EditorConfig支持配置sublime如何配置使其支持EditorConfig _sublime EditorConfig支持配置sublime如何配置使其支持EditorConfig _sublime EditorConfig支持配置sublime如何配置使其支持EditorConfig _sublime EditorConfig支持配置

    首先安装Package Control,再通过命令面板安装EditorConfig插件,确保项目根目录有.editorconfig文件,重启后即可自动应用格式规则。 Sublime Text 本身不内置支持 EditorConfig,但可以通过安装插件来实现对 .editorconfig 文件的识别…

    2026年9月24日 • 用户投稿
    100
  • UC浏览器下载的电子书在哪个目录_UC浏览器电子书文件存储位置查找

    UC浏览器下载的电子书在哪个目录_UC浏览器电子书文件存储位置查找UC浏览器下载的电子书在哪个目录_UC浏览器电子书文件存储位置查找UC浏览器下载的电子书在哪个目录_UC浏览器电子书文件存储位置查找UC浏览器下载的电子书在哪个目录_UC浏览器电子书文件存储位置查找

    首先通过UC浏览器下载管理查找电子书位置,其次使用文件管理器搜索内部存储的UCDownloads或ucbrowser/Download文件夹,检查SD卡中的UCBrowser目录,并通过浏览器设置确认默认下载路径以准确定位文件。 如果您在使用UC浏览器下载电子书后无法找到文件的存储位置,可能是由于系…

    2026年9月24日 • 用户投稿
    100
  • 《明末:渊虚之羽》1.5版本更新今日登陆主机!详情待公布!

    《明末:渊虚之羽》1.5版本更新今日登陆主机!详情待公布!《明末:渊虚之羽》1.5版本更新今日登陆主机!详情待公布!《明末:渊虚之羽》1.5版本更新今日登陆主机!详情待公布!《明末:渊虚之羽》1.5版本更新今日登陆主机!详情待公布!

    今日,国产类魂游戏《明末:渊虚之羽》官方通过社交平台x宣布,1.5版本更新即将上线主机平台。 官方在推文中指出:“1.5版本补丁将于8月14日正式登陆Xbox Series X|S与PlayStation 5平台!更多详细信息将陆续公开,请持续关注。” 此前,该版本已率先在PC平台推出,主要内容更新…

    2026年9月24日 • 用户投稿
    000
  • 使用 Rest Assured 创建泛型 JSONPath 值提取函数

    使用 Rest Assured 创建泛型 JSONPath 值提取函数使用 Rest Assured 创建泛型 JSONPath 值提取函数使用 Rest Assured 创建泛型 JSONPath 值提取函数使用 Rest Assured 创建泛型 JSONPath 值提取函数

    本文探讨如何在 Rest Assured 中设计一个泛型工具函数,以实现类型安全的 JSONPath 值提取。针对直接使用 T.class 导致的编译错误,文章提供了通过将 Class 作为参数传入的解决方案,有效规避了 Java 泛型擦除问题,从而实现灵活、可复用的 JSON 数据解析。 泛型 J…

    2026年9月24日 • 用户投稿
    000
  • x浏览器保存的密码在哪里查看_x浏览器已保存账号密码查看方法

    x浏览器保存的密码在哪里查看_x浏览器已保存账号密码查看方法x浏览器保存的密码在哪里查看_x浏览器已保存账号密码查看方法x浏览器保存的密码在哪里查看_x浏览器已保存账号密码查看方法x浏览器保存的密码在哪里查看_x浏览器已保存账号密码查看方法

    首先通过X浏览器设置进入密码管理,再选择具体网站查看账号密码。操作路径为:打开X浏览器→点击菜单→进入设置→选择安全及隐私→点击站点密码管理→找到目标网站→点击编辑→查看明文账号密码,全过程需通过设备验证。 如果您在使用X浏览器时启用了密码保存功能,但需要查看已存储的账号信息,则可以通过浏览器内置的…

    2026年9月24日 • 用户投稿
    000
  • 怎么用豆包AI分析Python内存使用 AI辅助定位内存泄漏的实用方法

    怎么用豆包AI分析Python内存使用 AI辅助定位内存泄漏的实用方法怎么用豆包AI分析Python内存使用 AI辅助定位内存泄漏的实用方法怎么用豆包AI分析Python内存使用 AI辅助定位内存泄漏的实用方法怎么用豆包AI分析Python内存使用 AI辅助定位内存泄漏的实用方法

    python内存泄漏可通过tracemalloc、objgraph及代码分析定位。1. 使用tracemalloc模块记录内存分配堆栈,生成快照并输出统计结果,交由豆包ai分析可疑内存泄漏点;2. 用objgraph查看常见对象类型及增长趋势,若发现异常增长对象可交由豆包判断是否合理;3. 将疑似泄…

    2026年9月24日 • 用户投稿
    000
  • 抖音双11好物节有哪些优惠活动?双11抖音有什么活动

    抖音双11好物节有哪些优惠活动?双11抖音有什么活动抖音双11好物节有哪些优惠活动?双11抖音有什么活动抖音双11好物节有哪些优惠活动?双11抖音有什么活动抖音双11好物节有哪些优惠活动?双11抖音有什么活动

    一年一度的双11购物狂欢节即将来临,抖音平台也紧跟潮流,推出了抖音双11好物节活动。这次活动可谓是优惠满满,好物多多,让广大消费者在购物的同时,也能享受购物的乐趣。下面,就让我为大家详细介绍一下2025年抖音双11好物节的优惠活动吧! 一、抖音双11好物节活动时间 活动周期:2025年9月16日(中…

    2026年9月24日 • 用户投稿
    000
  • 如何验证厂商宣传的散热技术是否切实有效?

    如何验证厂商宣传的散热技术是否切实有效?如何验证厂商宣传的散热技术是否切实有效?如何验证厂商宣传的散热技术是否切实有效?如何验证厂商宣传的散热技术是否切实有效?

    要验证散热技术是否有效,需结合产品规格、第三方评测、用户反馈及自行测试。首先查看热管数量与材质、均热板设计、风扇风量与静压等真实参数,警惕模糊宣传;其次参考专业媒体在标准环境下的烤机测试数据,如AIDA64或FurMark负载下的温度与频率表现;再通过电商平台或论坛收集长期使用反馈,关注共性问题如噪…

    2026年9月24日 • 用户投稿
    000
  • 键盘多媒体按键的实用性在实际使用中如何?

    键盘多媒体按键的实用性在实际使用中如何?键盘多媒体按键的实用性在实际使用中如何?键盘多媒体按键的实用性在实际使用中如何?键盘多媒体按键的实用性在实际使用中如何?

    键盘多媒体按键在简化日常操作方面有一定价值,但其真正的实用性高度依赖于用户的使用习惯和工作环境。对于经常调整音量、播放音乐或观看视频的用户,这些按键能显著提升操作便捷性,尤其在全屏状态下无需切换窗口即可控制媒体功能。配合自定义软件,可将按键设置为启动应用、执行系统命令或模拟快捷键,进一步提升效率;例…

    2026年9月24日 • 用户投稿
    500
  • 抖音账号无故被封禁该如何解决?封禁是否因他人举报而起?详解抖音账号封禁原因!

    抖音账号无故被封禁该如何解决?封禁是否因他人举报而起?详解抖音账号封禁原因!抖音账号无故被封禁该如何解决?封禁是否因他人举报而起?详解抖音账号封禁原因!抖音账号无故被封禁该如何解决?封禁是否因他人举报而起?详解抖音账号封禁原因!抖音账号无故被封禁该如何解决?封禁是否因他人举报而起?详解抖音账号封禁原因!

    一、抖音账号被封的常见原因 (一)是否因他人举报导致封号? 1. 一次举报会怎样?当一个抖音账号被用户举报时,平台通常不会立即采取严厉措施。首次举报多数情况下只会触发系统警告。例如,若发布的视频涉及轻微版权问题或存在争议性言论,虽未明显违规,但经他人举报后,可能会收到平台提醒。2. 多次举报的严重后…

    2026年9月24日 • 用户投稿
    200
  • 如何用豆包 AI 大模型与 AI 聚会游戏设计工具结合,活跃聚会氛围?​

    如何用豆包 AI 大模型与 AI 聚会游戏设计工具结合,活跃聚会氛围?​如何用豆包 AI 大模型与 AI 聚会游戏设计工具结合,活跃聚会氛围?​如何用豆包 AI 大模型与 AI 聚会游戏设计工具结合,活跃聚会氛围?​如何用豆包 AI 大模型与 AI 聚会游戏设计工具结合,活跃聚会氛围?​

    豆包 ai 大模型与 ai 聚会游戏设计工具结合,能有效提升聚会互动性和趣味性。1. 可用豆包 ai 生成个性化问题或话题,如搞笑类、回忆类等,帮助破冰交流;2. 结合聚会游戏工具,利用 ai 生成的关键词或背景设定定制专属小游戏,增强即兴互动;3. 借 ai 生成角色设定和剧情线索,营造角色扮演氛…

    2026年9月24日 • 用户投稿
    100
  • 夸克网盘怎么分享文件_文件分享链接创建与管理

    夸克网盘怎么分享文件_文件分享链接创建与管理夸克网盘怎么分享文件_文件分享链接创建与管理夸克网盘怎么分享文件_文件分享链接创建与管理夸克网盘怎么分享文件_文件分享链接创建与管理

    夸克网盘支持通过生成链接或二维码分享文件。首先打开夸克App进入网盘页面,长按选中文件后点击“分享”,可选择公开或私密模式并设置有效期(1天、7天或永久),生成链接后系统自动复制到剪贴板。已生成的链接可在“我的分享”页面管理,支持修改有效期、更改密码或停止分享。此外,还可通过“二维码分享”功能生成二…

    2026年9月24日 • 用户投稿
    100
  • mysql数据库中的自增列如何使用

    自增列是MySQL中用于自动产生唯一数值的整数列,通常作为主键使用。通过AUTO_INCREMENT属性,插入数据时若未指定值,系统会自动分配比当前最大值大1的数值,确保每条记录拥有唯一标识,简化插入操作。创建表时可定义自增列,如:CREATE TABLE users (id INT AUTO_IN…

    2026年9月24日
    100
  • 如何高效管理Debian文件系统

    高效管理debian文件系统可以通过以下几个步骤来实现: 了解文件系统结构: Debian文件系统遵循标准的Linux文件系统层次结构,例如/bin, /etc, /home, /usr, /var等。熟悉这些目录的作用,有助于更好地组织和管理文件。 磁盘空间管理: 使用df -h命令查看磁盘空间使…

    2026年9月24日
    000
  • 高效集成SOAP服务:Spring Boot中WSDL转Java的实践与策略

    高效集成SOAP服务:Spring Boot中WSDL转Java的实践与策略高效集成SOAP服务:Spring Boot中WSDL转Java的实践与策略高效集成SOAP服务:Spring Boot中WSDL转Java的实践与策略高效集成SOAP服务:Spring Boot中WSDL转Java的实践与策略

    本教程旨在指导开发者如何在Spring Boot项目中将WSDL(Web Services Description Language)文件转换为Java类,并成功消费SOAP(Simple Object Access Protocol)Web服务。文章将探讨常见的转换挑战,如wsimport兼容性问…

    2026年9月24日 • 用户投稿
    100
  • windows10提示“we couldn’t complete the updates undoing changes”_windows10更新失败修复方法

    windows10提示“we couldn’t complete the updates undoing changes”_windows10更新失败修复方法windows10提示“we couldn’t complete the updates undoing changes”_windows10更新失败修复方法windows10提示“we couldn’t complete the updates undoing changes”_windows10更新失败修复方法windows10提示“we couldn’t complete the updates undoing changes”_windows10更新失败修复方法

    遇到Windows 10更新失败时,可依次使用Windows更新疑难解答、重置更新组件、运行SFC和DISM修复系统文件,或使用Media Creation Tool进行原地升级解决。 如果您在尝试更新 Windows 10 系统时遇到“我们无法完成更新,正在撤消更改”的提示,这通常意味着更新过程中…

    2026年9月24日 • 用户投稿
    200

发表回复

登录后才能评论
关注微信