关于Puppeteer
Puppeteer 是一个 Node 库,它提供了一个高级 API 来通过 DevTools) 协议控制 Chromium 或 Chrome。Puppeteer 默认以 headless 模式运行,但是可以通过修改配置文件运行“有头”模式。
Puppeteer 是 Node.js 工具引擎, 通过 Chrome DevTools Protocol 协议控制 Chromium/Chrome 浏览器的行为, 实现网页爬取, 自动化测试, 性能诊断等一系列的网页自动化的一些操作.
下面是一个简单的例子, 保存百度图片到本地.
安装
初始化package.json
在项目中使用 Puppeteer:
开始
目录结构
-
product
- node_modules
-
src
- package.json
app.js
app.js中的内容
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| const puppeteer = require('puppeteer');
const saveImg = require('./utils/saveImg');
const path = require('path');
(async () => { const browser = await puppeteer.launch({ headless: false, slowMo: 500, devtools: true }); const page = await browser.newPage(); page.setViewport({ width: 800, height: 600 }) await page.goto('https://image.baidu.com'); await page.focus('#kw'); await page.type('#kw', '蔡徐坤出道前'); await page.click('.s_newBtn'); page.on('load', async function () { const source = await page.evaluate(async function() { const imgList = document.querySelectorAll('.main_img'); return [...imgList].map(el => el.getAttribute('data-imgurl')); }) for(src of source){ saveImg(src, path.resolve(__dirname, 'images')); } await browser.close(); }); })();
|
saveimg.js
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 32 33
| const http = require('http'); const https = require('https');
const { createWriteStream } = require('fs'); const path = require('path');
let qty = 0;
module.exports = async function (url, dir) { qty+=1; await urlToImg(url, dir, qty); }
const urlToImg = async (url, dir, qty) => { let mod = /^https:\/\//.test(url) ? https : http; let ext = path.extname(url); let file = path.join(dir, `${Date.now()}-${qty}${ext}`); mod.get(url, res => { res.pipe(createWriteStream(file)) .on('finish', () => { console.log(`写入成功第${qty}张`); }); }); }
|
运行代码

异步请求所以保存顺序按写入顺序执行

保存成功
