puppyteer

puppyteer

今天自己加了一个需求,尝试使用puppyteer来实现自动化录制视频,一开始的想法是先开启录屏工具,在使用puppyteer来做浏览器自动化,经过调研后发现有Puppeteer 屏幕录像机库,直接使用puppeteer-screen-recorder库。所以难点可能就是过验证码了。

可能会用到的方法:

  1. 启动浏览器:使用puppeteer.launch()启动浏览器实例,可以选择无头模式或有头模式(headless: false)。

  2. 打开新页面:使用browser.newPage()创建一个新页面。

  3. 导航到视频页面:使用page.goto(url)导航到包含视频的页面。

  4. 点击播放视频:使用page.click(selector)模拟点击视频播放按钮。

  5. 监控视频播放状态:这可能是实现中的一个技术难点。你可能需要通过JavaScript注入(使用page.evaluate())来访问页面中视频播放器的状态,并检测视频是否播放完毕。

  6. 录屏:Puppeteer本身不提供录屏功能。你可能需要使用其他工具或库(如ffmpeg)来实现屏幕录制。可以考虑在Puppeteer脚本外部启动录屏工具,或者使用Node.js的child_process模块来从Puppeteer脚本内部启动录屏进程。

  7. 点击下一节:视频播放完毕后,使用page.click(selector)模拟点击“下一节”按钮。

  8. 循环播放和录制:将上述步骤包装在一个循环中,直到所有视频播放并录制完毕。

技术难点:

  1. 视频播放状态监控:不同网站的视频播放器实现可能不同,需要具体分析如何获取视频播放状态。这可能涉及到对特定网站DOM结构和JavaScript的深入了解。

  2. 自动化录屏:Puppeteer本身不支持录屏。需要结合其他工具来实现录屏,这可能涉及到额外的配置和同步问题。

  3. 长时间任务的稳定性:长时间运行的自动化任务可能会遇到稳定性问题,如浏览器崩溃、网络问题等。需要考虑异常处理和恢复机制。

  4. 资源消耗:长时间录屏和视频播放可能会消耗大量计算机资源,特别是在有头模式下。

综上所述,虽然使用Puppeteer自动化录屏的想法是可行的,但实现起来需要解决一些技术挑战。你可能需要结合Puppeteer的API、JavaScript编程技巧以及其他录屏工具来实现这个功能。

video.onended = resolve;:
这行代码为视频元素设置了一个onended事件处理函数。onended是一个事件,当视频播放结束时会被触发。
将 resolve 函数赋值给 video.onended 意味着当视频播放结束时,resolve 函数将被调用,从而解决外部的Promise。
这个onended事件应该如何查看?是在JS代码中吗?

问题:

feature的大小要改变

方法:

# 设置页面窗口大小,适配Chrome浏览器
await page.setViewport(viewport={'width':1536,'height':768})
自动退出

这个TimeoutError错误表明Puppeteer在等待特定选择器对应的元素出现时超时了。默认情况下,page.waitForSelector方法会等待30秒(30000毫秒),如果在这段时间内没有找到匹配的元素,就会抛出这个错误。

出现这个错误可能有以下几个原因:

  1. 选择器不正确:提供的CSS选择器可能不匹配任何元素,或者页面结构已经发生了变化。

  2. 页面未完全加载:页面可能还没有完全加载,或者加载速度很慢,导致在超时时间内元素没有出现。

  3. 元素被动态加载:有些元素可能是通过JavaScript动态添加到页面上的,如果这些脚本没有执行或执行较慢,元素也不会出现。

  4. 网络或资源问题:网络延迟或资源加载问题可能导致页面加载不完整或超时。

解决方法:

  1. 检查选择器:确保选择器是正确的,并且确实能够匹配页面上的元素。

  2. 增加超时时间:你可以增加waitForSelector的超时时间,例如:

    await page.waitForSelector(selector, { timeout: 60000 }); // 等待60秒
    
  3. 等待页面加载:使用page.waitForNavigation等待页面导航事件完成,例如:

    await Promise.all([page.click('login-button-selector'), // 替换为实际的登录按钮选择器page.waitForNavigation({ waitUntil: 'networkidle0' }), // 等待网络空闲时
    ]);
    
  4. 等待元素可见:使用page.waitForSelector等待元素不仅出现在DOM中,而且是可见的:

    await page.waitForSelector(selector, { visible: true });
    
  5. 手动检查:在浏览器中手动检查页面,确认元素是否存在,以及是否有任何JavaScript错误。

  6. 调试截图:在等待选择器之前和之后添加截图,以帮助确定页面的实际状态:

    await page.screenshot({ path: 'before-wait.png' });
    await page.waitForSelector(selector);
    await page.screenshot({ path: 'after-wait.png' });
    
  7. 关闭浏览器:在调试完成后,记得关闭浏览器实例,以避免资源占用。

请根据实际情况调整代码,并确保在部署自动化脚本之前进行充分的测试。

pypeteer参数简介:

  • ignoreHTTPSErrors(bool):是否忽略 HTTPS 错误。默认值为 。False
  • headless(bool):是否在无头模式下运行浏览器。默认值为 unless 或 options 为 。True``appMode``devtools``True
  • executablePath(str):要运行的 Chromium 或 Chrome 可执行文件的路径 而不是默认捆绑的 Chromium。
  • slowMo(int|float):按指定的 毫秒数。
  • args(List[str]):要传递给浏览器的其他参数(标志) 过程。
  • ignoreDefaultArgs(bool):不要使用 pyppeteer 的默认参数。这 是危险的选择;小心使用。
  • handleSIGINT(bool):在 Ctrl+C 上关闭浏览器进程,默认为 。True
  • handleSIGTERM(bool):关闭 SIGTERM 上的浏览器进程。违约 自。True
  • handleSIGHUP(bool):关闭 SIGHUP 上的浏览器进程。默认值为 。True
  • dumpio(bool):是否通过管道传输浏览器进程 stdout 和 stderr into 和 .默认值为 。process.stdout``process.stderr``False
  • userDataDir(str):用户数据目录的路径。
  • env(dict):指定对 浏览器。默认值与 python 进程相同。
  • devtools(bool):是否为每个选项卡自动打开 DevTools 面板。 如果此选项为 ,则将设置该选项。True``headless``False
  • logLevel(int|str):用于打印日志的日志级别。默认值为 根记录器。
  • autoClose(bool):脚本时自动关闭浏览器进程 完成。默认值为 。True
  • loop(异步。AbstractEventLoop):事件循环(实验性)。
  • appMode(bool):已弃用。
3、进阶使用

尝试模拟登录某BI大数据平台

const puppeteer = require('puppeteer');(async () => {const browser = await puppeteer.launch({headless:false});//默认运行在无头模式// const browser = await puppeteer.launch();const page = await browser.newPage();// await page.goto('https://www.kanxue.com/book-section_list-83.htm');//await page.screenshot({path: 'example.png'});await page.setViewport(viewport={'width':1536,'height':768})await page.goto('https://www.captainbi.com/amz_login.html');//先点击登录// let login_btn = await page.$('#loginform > div:nth-child(4) > button')// login_btn.click()
//   let login = await page.$('#header > div > nav > div.text-right.nav_user_item > a.login_btn')
//   login.click()// //用户名// let loginInput = await page.$('#account')// //密码// let pwdInput = await page.$('#password')// console.log(loginInput)//打印DOM节点信息// console.log(pwdInput)// 使用page.type输入节点信息,输入用户名await page.type('#username', '')  // 使用page.type输入节点信息,输入密码await page.type('#password', '')  await page.click('#submit')console.log('登录成功')//使用page方法获取用户名节点await browser.close();
})();
相关文献资料:
Puppeteer自动化视频播放和模拟点击
  1. WebRTC视频流的自动化

    • 如何使用Puppeteer和Browserless自动化WebRTC视频流
    • 这篇文章展示了如何使用Puppeteer自动化WebRTC视频流的播放。
  2. Puppeteer浏览器自动化工具

    • PuppeteerSharp:基于原始Node库的C#库,提供高级API来控制浏览器
    • 这个视频介绍了Puppeteer的基本用法,包括如何使用Puppeteer进行浏览器自动化。
  3. Puppeteer无法点击视频的问题

    • 为什么Puppeteer无法点击视频
    • 这个Stack Overflow讨论涉及到Puppeteer无法点击视频播放按钮的问题,以及可能的解决方案。
  4. 使用无头浏览器进行网络爬虫:Puppeteer教程

    • 使用无头浏览器Puppeteer进行网络爬虫
    • 这篇文章展示了如何使用Puppeteer进行网络爬虫,包括模拟用户行为。
  5. 使用Puppeteer将视频流传输到Node.js缓冲区

    • 使用Puppeteer将流传输到Node.js缓冲区
    • 这个讨论涉及到如何使用Puppeteer获取视频流,并将其传输到Node.js缓冲区。
  6. 使用Puppeteer录制视频

    • 如何使用Puppeteer快速录制视频
    • 这篇博客文章介绍了如何使用Puppeteer的屏幕录制功能来录制视频,以及这种方法的优缺点。
  7. 自动化YouTube观看量

    • 自动化YouTube观看量的目的
    • 这篇文章探讨了使用自动化工具提高YouTube视频观看量的策略。

请注意,使用Puppeteer进行自动化操作时,要确保遵守所有相关的法律和网站条款。希望这些资源能帮助你开始使用Puppeteer进行视频播放和模拟点击的自动化任务。

官网信息
官网信息

pyppeteer
github 地址:https://github.com/pyppeteer/pyppeteer
文档:https://pyppeteer.github.io/pyppeteer/reference.html

puppeteer

github 地址:https://github.com/puppeteer/puppeteer
中文文档:https://zhaoqize.github.io/puppeteer-api-zh_CN/#/
英文文档:https://pptr.dev/

未完待续

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/8780.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java设计模式-工厂

Java设计模式中,工厂模式主要包括普通工厂模式以及抽象工厂模式,普通工厂模式是用于制造输出不同类型的对象,抽象工厂模式是用于制造输出不同类型的普通工厂,本文主要描述工厂模式的基本用法。 如上所示,使用普通工厂模…

SSH简介:网络安全的守护者

SSH简介:网络安全的守护者 SSH(Secure Shell)是一种网络协议,用于在不安全的网络环境中提供安全的远程登录和其他网络服务。它使用加密技术来保护数据传输的完整性和机密性,防止潜在的窃听和篡改。SSH广泛应用于服务器…

解锁电脑潜能,提高办公效率:这个桌面助手您可千万不能错过!

文章目录 📖 介绍 📖📝 你是否有这些烦恼?📝 一站式效率工具平台📝 插件市场:无限扩展的可能📝 如何开始使用🎯 结语 ⚓️ 相关链接 ⚓️ 📖 介绍 &#x1f4…

知乎广告推广开户流程全攻略及费用详解

知乎作为一个高质量的知识分享平台,具有大量高教育背景和购买力的用户群体,成为了众多品牌广告主心仪的目标营销阵地。想要在知乎上精准高效地推广产品或服务,首先需要了解其广告推广的开户流程与相关费用。 一、知乎广告开户流程 1、前期准…

Mysql 数据库 开发规范

(一)建表规约 强制规约 1. 表达是否概念的字段 使用 is_xxx(is_used) 的方式命名 2. 若字段的数据类型为非负数 类型则为 unsigned 3. 若字段的数据类型为 unsigned tinyint 1表示是,0 表示否 4 . 表名、字段名需 使用小写字母 或 数字 正…

ansible批量运维管理

Ansible是一种自动化运维工具,基于Python开发,主要用于自动化IT任务,如配置管理、应用程序部署、软件升级和系统管理等。它集合了众多运维工具(如puppet、cfengine、chef、func、fabric)的优点,实现了批量系…

AI终端设备的自动化分级

摘要: 大语言模型(LLM)被认为是通用人工智能(AGI)的潜在火花,为构建通用人工智能代理带来了希望。在此基础上,客户端设备在人工智能的帮助下不断发展,从基于应用程序(AP…

Centos 中如何汉化man命令

刚学Linux,记不住命令和选项,很依赖里面的 man 查看命令,但因为着实看不懂,有没有什么办法把man查看命令的信息改成中文 在CentOS 7中,你可以通过安装man-pages-zh包来获取中文的man手册。以下是具体的步骤&#xff1a…

外置网卡设置为Ad-hoc模式,实现多台电脑互相通信

三台电脑Ad-hoc通信 iwconfig查看网卡型号 ifconfig查看网卡ip 第一台电脑 sudo systemctl stop NetworkManager sudo iwconfig wlx90de803014a8 mode ad-hoc sudo iwconfig wlx90de803014a8 essid "CPS-IBSS" sudo iwconfig wlx90de803014a8 channel 1 sudo ip a…

Redis-1 缓存穿透、缓存击穿、缓存雪崩

缓存穿透 一.数据查询的流程 程序根据请求查询数据时,会先到redis中查询,如果redis中查到了目标数据,则直接返回;如果redis中没有目标数据,则到mysql中查找,找到目标数据后返回,同时将该数据写…

stm32f103zet6_RTC_1_介绍

RTC简介 实时时钟是一个独立的定时器。 RTC模块拥有一组连续计数的计数器,在相应软件配置下,可 提供时钟日历的功能。 修改计数器的值可以重新设置系统当前的时间和日期。 RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复…

【Linux】常用基本指令

目录 食用说明 用户管理 whoami/who clear tree 目录结构和路径 pwd ls 文件 隐藏文件 常用选项 cd 家目录、根目录、绝对路径和相对路径 touch 常用选项 mkdir rmdir/rm man cp mv cat nano echo 输出重定向 > 输入重定向 < more/less head/…

C语言每日一练(12、水仙花数)

在编程的领域中&#xff0c;我们常常会遇到一些有趣而富有挑战性的问题。今天&#xff0c;让我们一起来探讨一个经典的编程题目——打印出所有的“水仙花数”。 所谓“水仙花数”&#xff0c;是指一个三位数&#xff0c;其各位数字的立方和等于该数本身。例如&#xff0c;153 …

springBoot异常总结

1.springBoot的主类和springBoot的 测试类名相同: .springBoot的主类和springBoot的 测试类名相同报异常&#xff1a; java.lang.ClassNotFoundException: junit.framework.ComparisonFailure //当src/main/java文件夹下有与src/test/java文件夹下相同名字的类时&#xff0c;…

csapp proxy lab part 1

host, hub, 路由器&#xff0c;和 交换机 当手机连接到局域网中时&#xff0c;它需要找到网络中的交换机&#xff08;Switch&#xff09;。这通常是通过 DHCP&#xff08;动态主机配置协议&#xff09;完成的。DHCP服务器负责向手机分配IP地址、子网掩码、网关地址等网络配置信…

ic基础|时钟篇02:关于时钟分频器的二三事

大家好&#xff0c;我是数字小熊饼干&#xff0c;一个练习时长两年半的ic打工人。我在两年前通过自学跨行社招加入了IC行业。现在我打算将这两年的工作经验和当初面试时最常问的一些问题进行总结&#xff0c;并通过汇总成文章的形式进行输出&#xff0c;相信无论你是在职的还是…

【js开发记录笔记】js开发记录笔记

整理的函数以及注意点 css 强制!important includes 函数 //示例&#xff1a; Input: [1, 2, 3, 4, 5].includes(2); Output: true;Input: [1, 2, 3, 4, 5].includes(9); Output: false;方法 1.同步方法获取接口返回值: new Promise((resolve) > {dataList this.Addtree…

pgsql和mysql比较

pgsql相对于mysql的优势主要体现在以下几个方面&#xff1a; 稳定性和可靠性&#xff1a;PostgreSQL的稳定性极强&#xff0c;即使在崩溃、断电等灾难场景下也能表现出很好的抗打击能力。相比之下&#xff0c;很多MySQL用户都遇到过Server级的数据库丢失的情况。此外&#xff…

windows驱动开发-32位和64位

这部分其实是过时的知识点&#xff0c;毕竟win 11之已经不支持32位系统了&#xff0c;但是还是列出来吧。 32位主要是指x86体系&#xff0c;在早期&#xff0c;32位的应用程序和系统只支持4GB的内存地址寻址&#xff0c;这也是最大的特色之一&#xff0c;在那个时代&#xff0…

嵌入式开发八:STM32启动过程分析

本次给大家分析 STM32F4 的启动过程&#xff0c;这里的启动过程是指从 STM32 芯片上电复位执行的第一条指令开始&#xff0c;到执行用户编写的 main 函数这之间的过程。我们编写程序&#xff0c;基本都是用 C 语言编写&#xff0c;并且以 main 函数作为程序的入口。但是事实上&…