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.mfbz.cn/a/605022.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Marin说PCB之国产电源芯片方案 ---STC2620Q

随着小米加入的造车大家庭,让这个本来就卷的要死的造车大家庭更加卷了。随之带来的蝴蝶效应就是江湖上各个造成门派都开始了降本方案的浪潮啊,开始打响价格战了。各家的新能源车企也是不得不开始启动了降本方案的计划了,为了应对降价的浪潮。…

手游广告归因新选择:Xinstall助力精准衡量投放效果

在手游市场竞争日益激烈的今天,广告主们面临着如何精准衡量广告投放效果的难题。手游广告归因平台的出现,为广告主们提供了一种全新的解决方案。而Xinstall,作为其中的佼佼者,正以其独特的优势,助力广告主们破解这一难…

【AI大模型】AI大模型热门关键词解析与核心概念入门

🚀 作者 :“大数据小禅” 🚀 文章简介 :本专栏后续将持续更新大模型相关文章,从开发到微调到应用,需要下载好的模型包可私。 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 目…

SPSS多元线性回归

(要满足)模型的假设条件需要对数据进行怎样处理?? 为了使数据满足多元线性回归的条件,通常需要进行以下预处理步骤: 1. 数据清洗:处理缺失值、异常值和重复值,确保数据质量。 2. 特…

python-oracledb 已率先支持 Oracle 23ai

python-oracledb 介绍 python-oracledb (以下简称 oracledb) 是 Python cx_Oracle 驱动程序的新名称,如果你仍在使用 cx_Oracle,建议升级到最新版本的 oracledb。 oracledb 驱动程序是一个开源模块,使 Python 程序能够访问 Oracle 数据库。默…

美业SaaS系统多门店收银系统源码-【卡升组合促销规则】讲解分享

美业管理系统源码 博弈美业SaaS系统 连锁多门店美业收银系统源码 多门店管理 / 会员管理 / 预约管理 / 排班管理 / 商品管理 / 促销活动 PC管理后台、手机APP、iPad APP、微信小程序 1、什么是卡升组合促销? 原价购买的卡项,卡状态正常的情况下&…

分红76.39亿,分红率再创新高,成长活力无限的伊利带来丰厚回报

伊利47万股东,又等来了一个好消息。 4月29日,伊利股份发布2023年报,实现营业总收入1261.79亿元,归母净利润104.29亿元,双创历史新高,实现连续31年稳健增长。 在递交亮眼成绩单的同时,乳业巨头伊…

MyBatis的其他查询操作

前言:在上篇博客介绍了MyBatis的一些增删改查操作,接下来介绍其他查询操作 目录 1 其他查询操作 1.1 多表查询 1.1.1 准备工作 1.1.2 数据查询 1.2 #{}和${} 1.2.1 #{}和${}使用 1.2.2 #{}和${}的区别 1.3 排序功能 1.4 like查询 2 数据库连接池 2.1 …

C++反射之检测struct或class是否实现指定函数

目录 1.引言 2.检测结构体或类的静态函数 3.检测结构体或类的成员函数 3.1.方法1 3.2.方法2 1.引言 诸如Java, C#这些语言是设计的时候就有反射支持的。c没有原生的反射支持。并且,c提供给我们的运行时类型信息非常少,只是通过typeinfo提供了有限的…

【吃透Java手写】1- Spring(上)-启动-扫描-依赖注入-初始化-后置处理器

【吃透Java手写】Spring(上)启动-扫描-依赖注入-初始化-后置处理器 1 准备工作1.1 创建自己的Spring容器类1.2 创建自己的配置类 ComponentScan1.3 ComponentScan1.3.1 Retention1.3.2 Target 1.4 用户类UserService Component1.5 Component1.6 测试类 2…

AI实景自动无人直播软件:引领直播行业智能化革命;提升直播效果,无人直播软件助力智能讲解

随着科技的快速发展,AI实景自动无人直播软件正在引领直播行业迈向智能化革命。它通过智能讲解、一键开播和智能回复等功能,为商家提供了更高效、便捷的直播体验。此外,软件还支持手机拍摄真实场景或搭建虚拟场景,使直播画面更好看…

Unity 性能优化之动态批处理(四)

提示:仅供参考,有误之处,麻烦大佬指出,不胜感激! 文章目录 前言一、动态合批是什么?二、使用动态批处理1.打开动态合批2.满足条件 三、检查动态合批是否成功五、动态合批弊端总结 前言 动态批处理是常用优…

Flutter笔记:手动配置VSCode中Dart代码自动格式化

Flutter笔记 手动配置VSCode中Dart代码自动格式化 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csd…

pcm转MP3怎么转?只需3个步骤~

PCM(Pulse Code Modulation)是一种用于数字音频编码的基础技术,最早起源于模拟音频信号数字化的需求。通过PCM,模拟音频信号可以被精确地转换为数字形式,为数字音频的发展奠定了基础。 MP3文件格式的多个优点 MP3的优…

【深度学习】网络安全,SQL注入识别,SQL注入检测,基于深度学习的sql注入语句识别,数据集,代码

文章目录 一、 什么是sql注入二、 sql注入的例子三、 深度学习模型3.1. SQL注入识别任务3.2. 使用全连接神经网络来做分类3.3. 使用bert来做sql语句分类 四、 深度学习模型的算法推理和部署五、代码获取 一、 什么是sql注入 SQL注入是一种常见的网络安全漏洞,它允许…

模糊的图片文字,OCR能否正确识别?

拍照手抖、光线不足等复杂的环境下形成的图片都有可能会造成文字模糊,那这些图片文字对于OCR软件来说,是否能否准确识别呢? 这其中的奥秘,与文字的模糊程度紧密相连。想象一下,如果那些文字对于我们的双眼来说&#x…

sed小实践2(随手记)

删除/etc/passwd的第一个字符 #本质是利用sg替换,将第一个字符替换成空 sed s|^.||g /etc/passwd删除/etc/passwd的第二个字符 sed -r s|^(.).(.*$)|\1\2|g /etc/passwd sed -r s|^(.).|\1|g /etc/passwd删除/etc/passwd的最后一个字符 sed s|.$||g /etc/passwd删…

Java快速入门系列-11(项目实战与最佳实践)

第十一章:项目实战与最佳实践 11.1 项目规划与需求分析项目规划需求分析实例代码 11.2 系统设计考虑实例代码 11.3 代码实现与重构实例代码 11.4 性能优化与监控实例代码 11.5 部署与持续集成/持续部署(CI/CD)实例代码 11.1 项目规划与需求分析 在进行任何软件开发…

基于Vumat的修正JC本构模型的切削研究

JC渐进损伤本构是研究切削中的重要本构模型,主要包括材料硬化和损伤两部分:其中,原始JC的硬化部分本构为; 添加图片注释,不超过 140 字(可选) 材料屈服应力的硬化解耦为三部分独立的效应&#x…

blender导出gltf模型混乱

最近用户给了几个blender文件,在blender打开是这样的: 我导出成gltf候,在本地打开时,底部发生了改变: 可以看出来,底部由原来的类型box变为了两个平面,后来我查了下blender里的属性设置&#xf…
最新文章