Puppeteer入门初探

本文来自网易云社区

作者:唐钊


最近在看 node 爬虫相关的一些东西,我记得还是很久以前常用的 node 爬虫工具还是 superagengt+cherrio,他们的思路是通过发起 http 请求然后截取 respone 的内容,但是随着前端mvvm等框架的盛行,现在更多的内容是异步加载了,所以通过这种传统的爬虫方式已经很难抓取到我们想要的内容了,那么Puppeteer又有什么亮点呢?接下来我们详细介绍一下这个由 google 官方团队维护的大杀器!

Puppeteer是一个Node库,由Chrome官方团队进行维护,提供接口来控制headless Chrome。Headless Chrome是一种不使用Chrome来运行Chrome浏览器的方式。简单的来说就是一个运行在命令行中的 chrome,我们可以通过代码来实现我们常规的浏览器浏览网页的功能。这样就能保证我们拿到的内容和正常通过浏览器查看的是一毛一样的!


Puppeteer 核心功能

  • 利用网页生成PDF、图片

  • 爬取SPA应用,并生成预渲染内容(即“SSR” 服务端渲染)

  • 可以从网站抓取内容

  • 自动化表单提交、UI测试、键盘输入等

  • 帮你创建一个最新的自动化测试环境(chrome),可以直接在此运行测试用例

  • 捕获站点的时间线,以便追踪你的网站,帮助分析网站性能问题

接下来我们通过一些简单的示例来看一下它的使用


安装

安装还是常规的流程,通过yarn或npm来完成。只需运行下面的命令:

yarn add pupeeter//ornpm i -S puppeteer


DEMO

demo-截屏

const puppeteer = require("puppeteer");   //引入 puppeteer(async() => {    /*通过 launch 生成一个’浏览器‘实例,option 中的 headless 是个布尔值,如果是 false 的话你就会看到一个浏览器从打开,到完成你整个任务的全过程,默认是 true,也就是在后台自动完成你的任务*/const browser = await puppeteer.launch({ headless: false });  //打开一个新的标签页const page = await browser.newPage();    //跳转到我们想要的地址去await page.goto("http://www.hockor.com/");    //默认打开的视口大小是800X600 ,我们可以通过如下代码来设置窗口的大小,await page.setViewport({width:1920,height:1080})    //通过screenshot方法完成截屏,并且保存在指定的 path 中await page.screenshot({ path: "nba.png" });    //最后关闭整个‘浏览器‘browser.close();
})();

过程如下:

201809271032469bff2b5a-df02-4570-9830-886a72158f24.gif


demo-通过搜索引擎拉取图片

上面我们展示了 puppeteer一个基础的 demo 完整实例,但是它更强大的地方还有很多,不仅支持在网页上点击,还可以填写表单,读取数据。大家可以去官方 api 查看,传送链接

接下来开始我们下一个 demo,这个示例我们完成一个在搜索引擎中爬取我们想要的图片并保存到本地的功能。来更进一步的了解这个强大的工具。

  • 我们的任务是在搜狗图片中爬取关键词为“NBA”的图片,并且保存在我们当前的 imgs 目录下。

那么核心的关键点就在于输入我们的关键词并且跳转到对应的列表页面,然后爬取内容中所有的 img 标签,并将其保存在我们制定的目录中。接下来我们详细剖析。

通过查看Puppeteer API,可以找到定义点击的函数和聚焦的函数:

page.click(selector[, options])
page.focus(selector);

以上selector 一个选择器来指定要点击的元素。如果多个元素满足,那么默认选择第一个。 这不正好满足了我们前面的逻辑,输入框聚焦和点击,那么怎么输入关键词呢?

For finer control, you can use keyboard.down, 
keyboard.up, and keyboard.sendCharacter to manually 
fire events as if they were generated from a real keyboard.

可以看到我们可以通过 page.keyboard.sendCharacter 来输入我们自己的文字

正好,这样子我们就满足了我们前期的条件,那么完整的代码如下

const puppeteer = require("puppeteer");
(async ()=>{    const brower = await puppeteer.launch();    const page = await brower.newPage();await page.goto("http://pic.sogou.com/");await page.setViewport({width:1920,height:1080})    //上面的代码和之前是一样的,不同是下面几句//await page.focus("#form_querytext");await page.keyboard.sendCharacter("nba");await page.click("#searchBtn")await page.waitFor(1000);    //监听页面 load 完成page.on('load',async ()=>{        console.log("page loaded");        const srcs = await page.evaluate(()=> {            const images = document.querySelectorAll("img.img-hover");            return Array.prototype.map.call(images,img=>img.src)})        //遍历图片并且保存srcs.forEach(async (src)=> {            console.log(src)            const ext = path.extname(src) ? path.extname(src):".jpg";            const file = path.join('./imgs',`${Date.now()}${ext}`)http.get(src,res=>{res.pipe(fs.createWriteStream(file)).on('finish',(err)=>{                    if(err){                        console.log(err)} else {                        console.log("done")}})})})await brower.close()})
})()

我们可以看到上面的流程就像我们正常浏览网页一样,而不是以前那种在 http response 中去抓取内容,这样子对于现在的很多懒加载页面或者前端渲染来讲我们都能成功的爬取到我们想要的内容。

更多的官方 demo 例子我们可以去https://try-puppeteer.appspot.com/编辑查看。

目前 puppeteer在爬虫和前端自动化测试上使用也日益增大,大家可以去官方 API 文档查看它的更多功能!大家也可以结合自己的需求/业务场景,充分挖掘Puppeteer功能。


网易云免费体验馆,0成本体验20+款云产品! 

更多网易研发、产品、运营经验分享请访问网易云社区


相关文章:
【推荐】 分布式存储系统可靠性系列一:如何估算
【推荐】 常用数据清洗方法大盘点
【推荐】 【你离硅谷只差一步】网易中国创业家大赛项目火热征集中

转载于:https://www.cnblogs.com/zyfd/p/9711947.html

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

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

相关文章

访问量大如何增加服务器,服务器流量过大原因及解决方法

造成网站服务器流量过大的原因:1.网站规模较大(比如门户网站、网络商城等),即网站本身访问量需求大,查看网站的Page View值、Hits值、日流量都很高。2.网站页面设计不合理,页面中包含大图片或音频、视频文件等文件,导致…

关于VUE项目地图开发中大量点标记绘制一些总结

问题说明 在地图开发中,当地图中绘制大量的标记点后,无论是拖动或者缩放,都会感觉到明显的卡顿现象。(一般超过800个点后就比较明显了).在平时的工作业务中,由于公司的实时监控页面需要展现5000-20000车辆…

如何使用Java 5 Executor框架创建线程池

Java 5以Executor框架的形式在Java中引入了线程池,它允许Java程序员将任务提交与任务执行分离。 如果要使用Java进行服务器端编程,则线程池是维护系统可伸缩性,鲁棒性和稳定性的重要概念。 对于那些不熟悉Java中的线程池或这里的线程池的概念…

使用NetBeans 7.4 beta提示进行更好的基于JUnit的单元测试

在上一篇文章中 ,我写了NetBeans 7.4 beta中提供的提示 ,这些提示提高了开发人员避免Java异常处理带来的讨厌的运行时问题的能力。 在本文中,我将研究如何使用NetBeans 7.4 beta提供的另外两个提示使单元测试在执行单元测试期间更加正确和清晰…

Web 开发中 Blob 与 FileAPI 使用简述

本文节选自 Awesome CheatSheet/DOM CheatSheet,主要是对 DOM 操作中常见的 Blob、File API 相关概念进行简要描述。 Web 开发中 Blob 与 FileAPI 使用简述 Blob 是 JavaScript 中的对象,表示不可变的类文件对象,里面可以存储大量的二进制编…

服务器e系列和l的区别,i.e.和 e.g.的区别和使用方法

举例说明在很多文章中都有使用过,我想这个对大家应该并不陌生,但是大家知道ie和eg的区别吗,他们两个都是举例子的缩写词,但是他们之间的区别大家知道吗,今天我们就来介绍下这两个举例说明的缩写词到底有什么不一样。一…

通过基于JDBC的用户存储部署Identity Server

在这篇文章中,我将演示如何使用JDBC用户存储配置WSO2 Identity Server。 为了演示,我使用的是MySQL用户存储,但是相同的过程也适用于任何其他JDBC用户存储。 我的环境是 操作系统– Ubuntu 12.10 Java – 1.6 WSO2是4.5.0 设置MySQL数据库…

前端路由实现原理(history)

前端路由实现(history) 了解: HTML5 history新增了两个API:history.pushState和history.replaceState 两个api都接受三个参数 状态对象(state object):一个JavaScript对象,与用pushState()方法…

unity 删除服务器项目,在吗?有个支持批量构建项目的好东西推荐给你

Unity Build Server是一种全新的项目构建辅助工具,它可以指定硬件设备,专门用于构建项目版本,帮助工作室大规模构建项目,提高团队生产力。很多人在选择Unity时并不会首先考虑到项目构建问题,而随着项目变得更大、更复杂…

使用WSO2 ESB构建制造服务总线(MSB)

在开始讨论本主题之前,我想介绍一些制造业中常用的术语。 术语制造执行系统(MES)由AMR Research于1990年提出,从先进的制造计算机信息系统的发展,MES概念已经发展了近三十年。 以下是制造执行系统协会(MES…

mysql jion 实现原理_MySQL-join的实现原理、优化及NLJ算法

案例分析:selectc.*fromhotel_info_original cleft joinhotel_info_collection honc.hotel_typeh.hotel_typeandc.hotel_idh.hotel_idwhereh.hotel_idis null这个sql是用来查询出 c 表中有 h 表中无的记录,所以想到了用 left join 的特性(返回左边全部记…

python笔记30-docstring注释添加变量

前言 python里面添加字符串注释非常简单,如何将变量放入 python 的函数注释里面呢? docstring也就是给代码加注释的内容了,python可以给函数,类、方法,模块添加注释内容,注释标准格式一般是三个双引号&…

无线路由器在手机上如何连接服务器,192.168.10.1路由器手机怎么设置? | 192路由网...

问:192.168.10.1路由器手机怎么设置?答:192.168.10.1是一个C类的私有IP地址,目前国产的路由器中,睿因路由器使用192.168.10.1作为默认登录地址。鉴于此,下面鸿哥使用睿因路由器来进行演示介绍。温馨提示&am…

Java Mission Control 5.2终于来了! 欢迎7u40!

自从我们上次听说这个叫做任务控制的小东西已经有一段时间了。 它从JRockit一直到现在都被重命名为Java Mission Control。 这是从HotSpot和JRockit融合战略中幸存下来的部分之一。 使用今天的Java SE 7 Update 40,您实际上可以再次使用它。 Java Mission Control …

webview布局适配实践

一、相关概念 1、viewport:移动设备(包括webview)用来显示网页的那一块区域; 2、devicePixelRatio属性(别名像素比,简称dpr):window.devicePixelRatio 物理像素 / 独立像素(css中的px); 3、rem…

尝试连接到服务器时出错请检查虚拟机管理器,Hyper-V尝试连接到服务器出错无效类的解决方法...

Hyper-V尝试连接到服务器出错无效类的解决方法Windows10安装Hyper-V后没有自动连接到本地计算机,手工连接失败,提示:引用内容尝试连接到服务器"DESKTOP-6P9L2HB"时出错。请检查虚拟机管理服务是否正在运行以及是否授权你连接到此服…

你敢在post和get上刁难我,就别怪我装逼了

> 掘金编辑提醒:本文疑似有误,参考 听说「99% 的人都理解错了 HTTP 中 GET 与 POST 的区别」 之前好几次面试都被问到post和get有什么区别,肯定很多同学和我一样说了一大堆什么post比get安全,get比post传的少乱起八糟这样的答案…

昂首阔步:让开发人员喜欢使用您的REST API

随着JAX-RS API的发展,以及今年早些时候在JSR-339下发布的2.0版本,使用出色的Java平台创建REST服务变得更加容易。 但是,极大的简化带来了巨大的责任:记录所有这些API,以便其他开发人员可以快速了解如何使用它们。 不…

thinkphp mysql 更新_THINKPHP5修改数据库数据出现“缺少更新条件”的错误

查询数据库的数据分配显示在页面山修改后的数据准备传递到第三章图里接收数据,然后修改到数据问题出现的环境背景及自己尝试过哪些方法相关代码// 请把代码文本粘贴到下方(请勿用图片代替代码)第一张图代码public function edit(){$db_01new DB();$id_editRequest::…

[No0000187]可能是把Java内存区域讲的最清楚的一篇文章

写在前面(常见面试题) 基本问题: 介绍下 Java 内存区域(运行时数据区)Java 对象的创建过程(五步,建议能默写出来并且要知道每一步虚拟机做了什么)对象的访问定位的两种方式&#xff…