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();
})();
过程如下:

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+款云产品!
更多网易研发、产品、运营经验分享请访问网易云社区
相关文章:
【推荐】 分布式存储系统可靠性系列一:如何估算
【推荐】 常用数据清洗方法大盘点
【推荐】 【你离硅谷只差一步】网易中国创业家大赛项目火热征集中
Puppeteer入门初探的更多相关文章
- Thrift入门初探--thrift安装及java入门实例
什么是thrift? 简单来说,是Facebook公布的一款开源跨语言的RPC框架. 那么问题来了. 什么是RPC框架? RPC全称为Remote Procedure Call,意为远程过程调用. 假 ...
- Thrift入门初探(2)--thrift基础知识详解
昨天总结了thrift的安装和入门实例,Thrift入门初探--thrift安装及java入门实例,今天开始总结一下thrift的相关基础知识. Thrift使用一种中间语言IDL,来进行接口的定义, ...
- puppeteer入门
转自: https://www.jianshu.com/p/a89d8d6c007b 作者: ppCode puppeteer新手入门(chromium下载跳坑) ppCode 关注 2017.12. ...
- 【thrift】thrift入门初探--thrift安装及java入门实例
转载:https://www.cnblogs.com/fingerboy/p/6424248.html 公司的一些平台服务框架底层封装了thrift提供服务,最近项目不是很紧,于是研究了一下,刚刚入门 ...
- 【PUPPETEER】初探之执行JavaScript方法(六)
一.知识点 page.evaluate() document.querySelector().value = ''; 二.解析知识点 page.evaluate(),查看puppeteer 的api ...
- 【PUPPETEER】初探之拖拽操作(五)
一.知识点 page.mouse elementHandle.boundingBox() ignoreDefaultArgs:['--enable-automation'] waitUntil 二 ...
- 【PUPPETEER】初探之原生frame切换(四)
一.知识点 page.frames() 使用frame.url() 获取framed的url x.getAttribute('x') 获取元素内值 二.实例 问:什么是iframe? 答:iframe ...
- 【PUPPETEER】初探之获取元素文本值(三)
一.知识点 page.$eval(selector, pageFunction[, ...args]) page.$$eval(selector, pageFunction[, ...args]) i ...
- 【PUPPETEER】初探之元素获取(二)
一.涉及的知识点 如何使用css selector 常用元素获取 $ 元素选择 type (api 输入) click (api 点击) 二.学习网址 https://github.com/Googl ...
随机推荐
- Operating System-进程/线程内部通信-信号量、PV操作的实现和应用(解决哲学家进餐和生产者消费者问题)
本文主要内容: 信号量的实现 利用信号量解决哲学家用餐问题 利用信号量解决生产者消费者问题 一.信号量的实现 1.1 信号量结构 typedef struct { int value; struct ...
- Java基础--反射Reflection
Reflection 反射能在运行时获取一个类的全部信息,并且可以调用类方法,修改类属性,创建类实例. 而在编译期间不用关心对象是谁 反射可用在动态代理,注解解释,和反射工厂等地方. -------- ...
- java代码继承基础
总结:继承是java编程的核心,我搞不明白,子类对象调用父类的成员方法时.父类的带参构造方法有什么用,还赋值了 package com.bc; //普通类 public class yt { publ ...
- [机器学习基础]矩阵基础和numpy
矩阵定义:[摘自百度百科] 由 m × n 个数aij排成的m行n列的数表称为m行n列的矩阵,简称m × n矩阵.记作: 这m×n 个数称为矩阵A的元素,简称为元,数aij位于矩阵A的第i行第j列,称 ...
- [转]Missing MSS Settings in Security Options of Group Policy (GPO)
I'm currently working on a new Windows Server 2012 and Windows 8 project. As part of that project is ...
- 第十章 深入理解Session与Cookie
理解Cookie 理解Session Cookie安全问题 分布式Session框架 Cookie压缩 表单重复提交问题 多终端Session统一
- 类型:。net;问题:HQL;结果:HQL: Hibernate查询语言
HQL: Hibernate查询语言 Hibernate配备了一种非常强大的查询语言,这种语言看上去很像SQL.但是不要被语法结构 上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它可 ...
- 使用NDK编译 libyuv <转>
官方源码:http://code.google.com/p/libyuv/简介: libyuv is an open source project that includes YUV scaling ...
- 下载Django
Django下载教程以及学习教程https://code.ziqiangxuetang.com/django/django-queryset-api.html 或者直接搜索自强学堂
- 两种布局的ListVIew Adapter。例如微信对话界面
这个界面 实现的不是微信对话界面.实现的是,focus的状态下,变为放大的另一种布局 重点: 一.定义类型个数 private final int TYPE_COUNT = 2; privat ...