2019独角兽企业重金招聘Python工程师标准>>>

批量截图任务

作为一个软件工程师,不只是做好自己的本职工作(iOS),而是需要解决项目中的技术问题。这次就是解决自动截图的问题 早期公司的数据工程师利用 phantomjs 来截图,后期不断发现截图效率低,加之开发者团队不再维护,因此决定将截图这部分跟你剥离开来,以后方便开发维护。我就承担了这个工作

puppeteer

Puppeteer is a Node library which provides a high-level API to control Chrome or Chromium over the DevTools Protocol. Puppeteer runs headless by default, but can be configured to run full (non-headless) Chrome or Chromium.

安装问题

一开始按照往常的套路(npm install --save puppeteer) 好几次都卡住了,后期查找资料发现切换到国内的镜像就可以顺利下载

 PUPPETEER_DOWNLOAD_HOST=https://storage.googleapis.com.cnpmjs.org npm i --save puppeteer
  • To use Puppeteer in your project, run:

    PUPPETEER_DOWNLOAD_HOST=https://storage.googleapis.com.cnpmjs.org npm i --save puppeteer
    
  • Install some basic packages

    npm install
    

Usage

const puppeteer = require('puppeteer'),fs = require('fs'),path = require('path'),request = require('request')function mkdirsSync(dirname) {if (fs.existsSync(dirname)) {return true} else {if (mkdirsSync(path.dirname(dirname))) {fs.mkdirSync(dirname)return true}}
}var snapShotFolerPath = path.join(__dirname, '../snspshot/')
mkdirsSync(snapShotFolerPath)function snapShot (taskInfo) {return new Promise(function (resolve, reject) {(async function(){// 启动Chromiumconst browser = await puppeteer.launch({ignoreHTTPSErrors: true, headless:true, args: ['--no-sandbox']})// 打开新页面const page = await browser.newPage()// 设置页面分辨率await page.setViewport({width: 1920, height: 1080})// 访问await page.goto(taskInfo.websiteUrl, {waitUntil: 'domcontentloaded'}).catch(err => console.log(err))await page.waitFor(1000)try {// 截图await page.screenshot({path: snapShotFolerPath + taskInfo.imageName, fullPage:true}).catch(err => {console.log('截图失败: ' + err)});await page.waitFor(6000)} catch (e) {console.log('failed ' + e)} finally {await browser.close()fs.stat(snapShotFolerPath + taskInfo.imageName, function(err,stats){if (err) {reject('fail')} else {                                                                                                  if (stats.isFile()) {resolve('success')}}})}})()})
}module.exports = snapShot

如何安装 (Linux 、Unix 操作系统)

  • 如果你有翻墙环境

    1. 执行 npm install
    2. 执行 npm start
  • 如果你没有翻墙环境

    1. 打开 package.json 文件,检查 dependencies 项目,如果 key 为 puppeteer 的条目,先删除该条目。
    2. 进入工程命令行,输入 PUPPETEER_DOWNLOAD_HOST=https://storage.googleapis.com.cnpmjs.org npm i --save puppeteer
    3. 执行 npm install 命令
    4. 执行 npm start

流程说明

  1. while 循环去调用接口去获取当前的截图任务

    • 在有截图任务情况下继续截图
    • 没有截任务的情况下,为了避免浪费资源,程序休眠10分钟后继续下一次的获取截图任务
    • 如果遇到调用截图任务接口500错误,则强制停止截图任务,相应的服务端工程师去查询失败原因
  2. 如果有截图任务那么就去截图
  • 截图后将截图图片保存到文件夹,命令为当前日期 yyyy-MM-dd-hh-mm-ss-S 格式。然后将结果上传到服务端
  • 截图失败将当前任务结果保存到本地 failedTasks.json 文件夹一份,然后上传到服务端
  1. 截图成功不管失败还是成功都去通知服务端。如果失败将当前任务告诉服务端,如果成功将当前任务信息和截图成功的绝对路径告诉服务端

一些说明

Demo 中执行 npm start 真正执行的是 quickStart.js 中的代码。完整的“获取截图任务、截图、截图上传到OSS、失败则将失败任务上传到服务”逻辑在 index.js 文件中

  • 工程是在没有提供真正的接口获取任务,而是采用随机数获取截图任务
  • 截图成功后将结果上传到OSS这一个步骤是没有的,采用 log 出来
  • 失败的上传也是不存在的,log 打印而已

todoList

  • 多线程高效率的去截图
  • 一些写法暂时比较粗糙,不优雅,待改进
  • puppeteer 很强大,大家可以去研究下

代码地址

转载于:https://my.oschina.net/u/1778933/blog/3005817

命令行批量截图Node脚本相关推荐

  1. 命令行批量合并视频脚本

    批量合并视频头部 需要ffmpeg, 目前直接安装格式工厂, 使用格式工厂模块下的ffmpge.exe, 避免自己去下载源码和编译 ffmpeg合并视频的几种方法 ffmpeg的合并方式有三种, 参考 ...

  2. centos卸载harbor_在Linux主机使用命令行批量删除harbor镜像

    在Linux主机使用命令行批量删除harbor镜像 脚本使用说明: 此脚本不是万能脚本,根据自身环境要调整很多 能用harbor的域名就不要用IP 脚本前半部分可以套用,后半部分需一步一步试错,结合自 ...

  3. 【ffmpeg】windows上用命令行批量将.flac格式转换为.wav等格式

    windows上用命令行批量将.flac格式转换为.wav等格式 需先安装ffmpeg(用于音视频处理)和git(用于运行sh文件),然后执行脚本 参考资料如下: 1 windows安装ffmpeg并 ...

  4. mysql命令行批量添加数据_mysql命令行批量插入100条数据命令

    先介绍一个关键字的使用: delimiter 定好结束符为"$$",(定义的时候需要加上一个空格) 然后最后又定义为";", MYSQL的默认结束符为" ...

  5. Linux(12)-命令行的使用,shell脚本

    命令行的使用,shell脚本 1.终端shell,man 2.shell 编程 2.1 shell脚本 2.2 注释 2.3 指明所用的shell 2.4 支持函数 2.5 使用变量 2.6 解析命令 ...

  6. 如何在CLI命令行下运行PHP脚本,同时向PHP脚本传递参数?

    如何在命令行下运行PHP脚本[带参数] 创建一个简单的文本文件,其中包含有以下PHP代码,并把它保存为hello.php: <?php echo "Hello from the CLI ...

  7. 命令行给php脚本传参,如何在CLI命令行下运行PHP脚本,同时向PHP脚本传递参数?...

    标签:c   t   sp   get   int   name   php   test   print   root   enter //命令行输入输出流 fwrite(STDOUT," ...

  8. GitBook是一个命令行工具(Node.js库),我们可以借用该工具使用Github/Git和Markdown来制作精美的图书,但它并不是一本关于Git的教程哟。...

    GitBook是一个命令行工具(Node.js库),我们可以借用该工具使用Github/Git和Markdown来制作精美的图书,但它并不是一本关于Git的教程哟. 支持输出多种格式 GitBook支 ...

  9. ubuntu 命令行批量重命名文件夹

    ubuntu 命令行批量rename文件夹 文件夹的命名有错(e.g., 1234./)由于有这个点(.)导致这些文件夹不能移动,因此想批量改文件夹名字.觉得理论上一行命令行是可以解决的,但搜索后发现 ...

最新文章

  1. 一文读懂深度学习框架下的目标检测(附数据集)
  2. 去掉动网广告“国内使用量最大的动网论坛”的方法
  3. PMCAFF | 史上最完整的沙龙活动策划总结
  4. nginx做grpc负载均衡时长连接或者短连接
  5. Microsoft Asp.Net Ajax框架入门(12) 了解异步通信层
  6. JEECG第二期深入使用培训(报名截止2014-06-21)
  7. Pandas 文本数据方法 find( ) rfind( ) index( ) rindex( )
  8. vs2019怎么调整字体大小_每年至少十万考生涂错答题卡,是时候讨论一下最新版答题卡怎么用了...
  9. Odoo 强大的开源微信模块 oejia_wx
  10. 6月29日Java实训第一天
  11. 计算机音乐苹果铃声,iPhone实用技巧:怎么将抖音上的背景音乐制作成手机铃声-苹果手机铃声设置...
  12. Dell OptiPlex台式机安装ESXI 6.7
  13. 大数据可视化--全球分布散点图
  14. 医院pacs系统服务器配置,浪潮为千佛山医院PACS系统开“药方”
  15. Mac电脑如何安装win7系统
  16. 【oracle11g,11】redo日志文件2 :日志恢复 (重点)
  17. react-router 与react-reduct 配合使用时,页面不刷新问题
  18. Math.pow(x,y)使用注意事项
  19. 利用DncZeus框架开发UWB室内定位网关
  20. 大数据业务分析基本步骤

热门文章

  1. python类型转换-Python基本数据类型转换
  2. python使用for循环打印99乘法表-Python用for循环实现九九乘法表
  3. 学python爬虫需要什么基础-Python爬虫需要学习那些东西?
  4. python教学网站-python学习网站整理
  5. python调用shell命令-python中执行shell命令的几个方法小结
  6. python 培训-Python培训周末班|python是什么?能干什么?
  7. python拼音怎么写-Python 返回汉字的汉语拼音
  8. winston日志框架
  9. 如何理解H264 编码
  10. map中批量图层的加载和展示