抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

Puppeteer是什么

写过爬虫的应该都知道phantomJs,早起无界面浏览器还是很火,后来chrome自己也搞了无界面模式,如今phantomJs已经宣告gg了。谷歌再推出chrome headless的同时,也发布了Puppeteer。

Puppeteer是一个node库,本质上是调用Chrome DevTools提供的Api来操作Chrome,Puppeteer做了一个封装,使用起来更方便。

Puppeteer可以做什么

通过Puppeteer的提供的api可以控制Chrome浏览器,用以模拟用户操作行为,可以用来做Web的Ui自动化或者爬虫。

这里就只是Ui自动化,使用它可以完成但不限于以下内容。

1.页面访问,点击,输入等交互事件

2.记录时间数据,可以进行性能分析

3.支持页面截图,支持生成pdf报告,可用于回溯和二次开发

4.内置支持模式支持以安卓或者ios模式访问

安装Puppeteer并使用

官方源码地址: https://github.com/puppeteer/puppeteer

新建项目

新建一个nodejs项目(WebStorm)

image.png

安装

1
2
3
npm install --save puppeteer --ignore-scripts
# 默认安装会要下载Chromium,因为GW的原因,添加--ignore-scripts来阻止下载。
# 有VPN的可以无视

手动下载chromeium

如果上一步你没有下载这个,但是想先安装puppeteer,那么关于chromeium可以手动下载。地址: https://download-chromium.appspot.com/ ,依然需要FQ。chromium默认的下载路径是在node_modules/puppeteer/.local-chromium/目录,下载后放入此处即可。

如果你下载后想放其他位置需要指定chromium的地址 如: const page = await browser.newPage( { executablePath: ‘/xxx/xxx/chromium/chrome.exe’, headless: false } );

demo

新建一个js写demo,访问百度,输入puppeteer进行搜索,并且截图。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
const puppeteer = require('puppeteer');

async function screenShot(url, path, name) {

await console.log('Screen Shot ... ');
await console.log('Save path: ' + path + name + '.png');
const browser = await puppeteer.launch();
const page = await browser.newPage();

await page.goto(url);
await console.log('访问'+url);

await page.setViewport({ width: 1920, height: 1080 });
await console.log('设置窗口大小');

await page.waitForSelector('#kw');
await page.click('#kw');
await console.log('点击搜索输入框');

await page.type('#kw','puppeteer');
await console.log('输入搜索内容');

await page.waitForSelector('#su');
await page.click('#su');
await console.log('点击搜索');

await page.screenshot({path: path + name + '.png'});

await browser.close();
}
screenShot("http://baidu.com",".","test_puppeteer");

执行日志

image.png

没有报错,查看下截图

image.png

有点问题,并没有等待新页面加载好,优化下代码

image.png

可以看到每次都是都有这个搜索结果条数的内容,那就先等待他加载好。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
const puppeteer = require('puppeteer');

async function screenShot(url, path, name) {

const browser = await puppeteer.launch();
const page = await browser.newPage();

await page.goto(url);
await console.log('访问'+url);

await page.setViewport({ width: 1920, height: 1080 });
await console.log('设置窗口大小');

await page.waitForSelector('#kw');
await page.click('#kw');
await console.log('点击搜索输入框');

await page.type('#kw','puppeteer');
await console.log('输入搜索内容');

await page.waitForSelector('#su');
await page.click('#su');
await console.log('点击搜索');

await page.waitForSelector('.nums_text');
await console.log('加载完毕');

await page.screenshot({path: path + name + '.png'});
await browser.close();
}
screenShot("http://baidu.com",".","test_puppeteer");

查看截图

image.png

可以了。

更多使用

查看官方api文档 https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#class-browser

博客参考https://www.jianshu.com/p/2f04f9d665cehttps://segmentfault.com/a/1190000015371795

评论