Puppeteer 爬虫技术实践
信息简介
Puppeteer是Chrome开发团队发布的一个通过Chrome DevTool Protocol来控制浏览器Chrome(下文若无显式称呼Chromium,浏览器都同指Chromium吧,至于Chrome、Chromium的区别大家自行搜索吧)的一组基于NodeJS的API包,即通过Puppeteer提供的方法可以达到控制Chrome的目的。
技术细节
- Puppeteer Github
- Chrome DevTool Protoco 地址
- Puppeteer API 英文 | 中文
- 当你遇到问题时先到这里看看Troubleshooting
为什么提到它Puppeteer
因为它提供的API能方便地控制浏览器,控制浏览器能干什么?最直接的就是UI自动化测试、实现爬虫应用、实现自动写日志(因为我司每天检查日志,若遗忘就罚款一百😞)、网站截屏、生成网站PDF等。其实真正起到控制浏览器的是Chrome DevTool Protocol,而基于此也有很多其它语言实现的API包,大家可自行到github搜索查看。本人选择Nodejs主要还是官方维护,方便同步升级不用担心被遗忘(本人的糊口语言是C#,一个大部分被同行看不起和技术厂商遗忘SDK的语言🤣)。
使用简介
Puppeteer 主要提供两种方式:Headless 、FullHead,我自己简单的理解为“无界面”和“有界面”,其实主要是二者在请求头部和渲染方式上区别(比如被网站检测到头部信息、以及渲染环境)。为什么强调这两种方式,因为这涉及到你的爬虫被网站监测到能力,目前Headless很简单就可以使用,但是FullHead模式就有难点,因为FullHead模式要打开浏览器界面,那么当你将爬虫应用部署到Docker环境下时你就要模拟这个界面,这个就太难了,大概google了半天才找到使用xvfb模拟界面解决了。当你实现了FullHead模式那么你的爬虫应用生存几率就又大了1%。
快速使用
因为我使用的nodejs版本,故测试demo者请自行安装Nodejs环境。
- 初始化
npm init
.安装Puppeteer
npm install puppeteer --save
安装时因为GF的原因,会下载很缓慢,可以通过配置环境变量解决(下文也会告诉大家使用已经装好的浏览器)
PUPPETEER_SKIP_CHROMIUM_DOWNLOAD :配置为true跳过下载
PUPPETEER_EXECUTABLE_PATH: 浏览器执行文件路径,切记是执行文件不同系统文件名皆不同。
由于平常都在使用Docker,为了熟悉Linux命令所以我这里用的bash命令,windows下自己修改环境命令
图中看到已经跳过安装
下面写一段屏幕截图的脚本
<strong>const</strong> puppeteer = require('puppeteer');<br>(<strong>async</strong> () => { <strong>const</strong> browser = <strong>await</strong> puppeteer.launch(); <strong>const</strong> page = <strong>await</strong> browser.newPage(); <strong>await</strong> page.goto('https://www.cnblogs.com/'); <strong>await</strong> page.screenshot({path: 'cnblogs.png'});<br> <strong>await</strong> browser.close();})();
上面的脚本意思是启动一个HeadLess模式浏览器,然后打开博客园并进行截屏保存。
上图已经看到博客园的截屏,但是貌似有点和我们平常看到的不太一样,下一篇文章我将详细介绍如何更精细的使用puppeteer控制浏览器而更像我们平常使用的浏览器浏览网站。