Windows下Node爬虫神器Puppeteer安装记


Posted in Javascript onJanuary 09, 2019

对于爬虫,相信大家并不陌生。当希望得到一些网站的数据并做一些有趣的事时,必不可少要爬取网页,用到爬虫。而目前网络上也有很多爬虫的教程资料,不过又尤以python语言居多。想来自己是做web的,就希望以js的方式解决问题,于是希望利用nodejs。今天介绍一款node的爬虫利器:Puppeteer。

Puppeteer正如其名“木偶”,它允许我们像牵线木偶一样操纵它。它是一个建立在DevTools协议上的提供控制无头Chrome或Chromium的高级接口的Node库。官网上对其应用举了几个例子:

  • - 生成网页的截屏(目前仅支持支持jpeg、png格式)和pdf文件
  • - 爬取SPA和异步渲染网页
  • - 自动表单提交、键盘输入、UI测试等
  • - 创建最新的自动测试环境,也就是说可以使用最新的浏览器特性
  • - 捕获站点的时间线以帮助分析性能问题

Puppeteer本质上是一个headless chrome。无头浏览器,相信如果大家做爬虫肯定有所耳闻。其实就是一个没有UI界面的浏览器,它包含了浏览器应该具有的功能,通常做web测试用,不过做爬虫也是没问题的。PhantomJS就提供这样的功能,基于webkit内核,已经有好几年历史了。不过因为Puppeteer有背景(谷歌Chrome团队开发),我最后还是选择了Puppeteer。它们之间的不同点是后者只关注于Chromium或Chrome。这也导致了最坑的一点是总是绑定最新版本的Chromium。

上面说到Puppeteer会绑定最新版本的Chromium,这意味着每次使用npm i puppeteer安装使用它时都会下载最新版本的Chromium,该版本在Windows上大约是130Mb。本来下载npm包就很不易,还要下载一个一百多兆的东西更是难上加难了。当然可以使用cnpm,下图是我下载的一个界面。可以看到下载了55分钟,这固然有我网络慢的问题,但是能不下载Chromium就尽量不下载了吧。

Windows下Node爬虫神器Puppeteer安装记

官网讲到可以通过设置环境变量或配置npm config的方式避免下载。但设置环境变量我一直没有成功,所以接下来讲解配置npm config的方式。PUPPETEER_SKIP_CHROMIUM_DOWNLOAD参数可以避免下载,所以可以在安装puppeteer之前使用下面的命令:

npm config set puppeteer_skip_chromium_download = 1

但这样每次都要敲这个命令总不是办法,所以可以将其写入.npmrc文件中。npm官网讲到有四个影响npm配置的文件,分别是:项目配置文件(/path/to/my/project/.npmrc)、用户配置文件 (~/.npmrc)、全局配置文件($PREFIX/etc/npmrc)、npm内置配置文件(/path/to/npm/npmrc)。可以使用npm config list来查看影响npm的配置文件有哪些。不过这里面有个问题,就是上面的介绍文档是针对npm最新的6.0版本的。而一般随nodejs下载的npm版本没有这么高,只是npm4.x,导致项目中的配置文件不生效。可以从下面两张图片看到两种版本的npm的配置文件的不同(上面一张:npm4.0.2,下面一张npm6.0),可以看到后者多出一个project config列表。

Windows下Node爬虫神器Puppeteer安装记

Windows下Node爬虫神器Puppeteer安装记

身为强迫症的我,当然希望直接在项目目录中更改配置文件了,所以使用下面的命令安装最新版本的npm:

npm install npm@latest -g

然后在项目目录下建立.npmrc文件,输入以下配置命令:

puppeteer_skip_chromium_download = 1

这样配置之后,就可以跳过下载了,如图所示:

Windows下Node爬虫神器Puppeteer安装记

接着就可以使用它了,以官网的例子为例:

const puppeteer = require('puppeteer');

(async () => {
 const browser = await puppeteer.launch();
 const page = await browser.newPage();
 await page.goto('https://example.com');
 await page.screenshot({path: 'example.png'});

 await browser.close();
})();

以为这样就完了吗?不,虽然跳过下载的事情解决了,但是因为没有下载会导致puppeteer无法得知要使用的Chrome或Chromium在哪里,所以还需要指明启动路径。修改一下:

const puppeteer = require('puppeteer');

(async () => {
 const browser = await puppeteer.launch({
   // headless: false,//不使用无头chrome模式
   executablePath: 'C:\\Users\\sunbo\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe',//path to your chrome
 });
 const page = await browser.newPage();
 await page.goto('https://example.com');
 await page.screenshot({path: 'example.png'});

 await browser.close();
})();

更改executablePath参数指向你本地chrome所在目录,注意一定要指向chrome.exe才能正常使用。headless参数也是挺有趣的,如果其值为false,就会真的为我们启动一个chrome进程,让我们可以可视化整个程序运行的过程。

好了,安装配置好就可以尽情享受Puppeteer带给我们的美好世界了。最后说一点,官网例子使用async/awaitpromise,所以有必要了解这些异步知识,这些东西运用好,简直打开了异步编程的新世界。祝好运!!!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript 类型转换方法
Oct 24 Javascript
深入理解JavaScript 闭包究竟是什么
Apr 12 Javascript
jQuery中parents()和parent()的区别分析
Oct 28 Javascript
JavaScript中数据结构与算法(五):经典KMP算法
Jun 19 Javascript
JS打字效果的动态菜单代码分享
Aug 21 Javascript
jQuery实现可用于博客的动态滑动菜单完整实例
Sep 17 Javascript
JS命令模式例子之菜单程序
Oct 10 Javascript
JS中BOM相关知识点总结(必看篇)
Nov 22 Javascript
解决vue2.0路由跳转未匹配相应用路由避免出现空白页面的问题
Aug 24 Javascript
判断iOS、Android以及PC端的示例代码
Nov 15 Javascript
微信小程序websocket实现即时聊天功能
May 21 Javascript
通过实例了解JS执行上下文运行原理
Jun 17 Javascript
jQuery简单实现根据日期计算星期几的方法
Jan 09 #jQuery
jQuery实现根据身份证号获取生日、年龄、性别等信息的方法
Jan 09 #jQuery
爬虫利器Puppeteer实战
Jan 09 #Javascript
puppeteer库入门初探
Jan 09 #Javascript
node.js的Express服务器基本使用教程
Jan 09 #Javascript
JavaScript学习笔记之基于定时器实现图片无缝滚动功能详解
Jan 09 #Javascript
element-ui 时间选择器限制范围的实现(随动)
Jan 09 #Javascript
You might like
PHP实现的购物车类实例
2015/06/17 PHP
基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
2015/12/20 PHP
PHP 配置后台登录以及模板引入
2017/01/24 PHP
PHP编程计算文件或数组中单词出现频率的方法
2017/05/22 PHP
php中如何执行linux命令详解
2018/11/06 PHP
Laravel-添加后台模板AdminLte的实现方法
2019/10/08 PHP
效率高的Javscript字符串替换函数的benchmark
2008/08/02 Javascript
Ext JS 4官方文档之三 -- 类体系概述与实践
2012/12/16 Javascript
JS自定义功能函数实现动态添加网址参数修改网址参数值
2013/08/02 Javascript
JavaScript生成的动态下雨背景效果实现方法
2015/02/25 Javascript
JavaScript实现按照指定长度为数字前面补零输出的方法
2015/03/19 Javascript
JavaScript动态创建div等元素实例讲解
2016/01/06 Javascript
javascript获取网页各种高宽及位置的方法总结
2016/07/27 Javascript
详解vue中axios请求的封装
2019/04/08 Javascript
利用es6 new.target来对模拟抽象类的方法
2019/05/10 Javascript
vue无限轮播插件代码实例
2019/05/10 Javascript
Vue的生命周期操作示例
2019/09/17 Javascript
在Layui中实现开关按钮的效果实例
2019/09/29 Javascript
layui 解决富文本框form表单提交为空的问题
2019/10/26 Javascript
基于form-data请求格式详解
2019/10/29 Javascript
javascript中的with语句学习笔记及用法
2020/02/17 Javascript
Node使用Nodemailer发送邮件的方法实现
2020/02/24 Javascript
[58:21]DOTA2亚洲邀请赛 4.3 突围赛 Liquid vs VGJ.T 第二场
2018/04/04 DOTA
Django框架中的对象列表视图使用示例
2015/07/21 Python
Python常见排序操作示例【字典、列表、指定元素等】
2018/08/15 Python
解决django中form表单设置action后无法回到原页面的问题
2020/03/13 Python
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?用contains来区分是否有重复的对象。还是都不用
2013/07/30 面试题
实习生个人找工作的自我评价
2013/10/30 职场文书
医学院校毕业生自荐信范文
2014/01/01 职场文书
承诺书的格式范文
2014/03/28 职场文书
环境日宣传活动总结
2014/07/09 职场文书
学校安全管理责任书
2014/07/23 职场文书
英语教育专业毕业生求职信
2014/08/28 职场文书
尊师重教主题班会
2015/08/14 职场文书
关于战胜挫折的名言警句大全!
2019/07/05 职场文书
在项目中使用redis做缓存的一些思路
2021/09/14 Redis