【简介】

Puppeteer 是一个 Node 库,它提供了一个高级 API 来通过 DevTools 协议控制 Chromium 或 Chrome。Puppeteer 默认以 headless 模式运行,但是可以通过修改配置文件运行“有头”模式。

GitHub 网址:https://github.com/GoogleChrome/puppeteer

官网文档:https://pptr.dev/

官方文档中文版:https://zhaoqize.github.io/puppeteer-api-zh_CN/#?product=Puppeteer


【准备工作】

下载并安装,选 LTS 版本即可:https://nodejs.org

安装 puppeteer

npm install puppeteer --registry=https://registry.npm.taobao.org


【51cto.js】

/*! * walker@2019-07-13: 测试 puppeteer,得到网页截图和html */`use strict`;const puppeteer = require('puppeteer');const fs = require("fs");// 得到一个两数之间的随机整数,包括两个数在内function GetRandInt(min, max) {    min = Math.ceil(min);    max = Math.floor(max);    return Math.floor(Math.random() * (max - min + 1)) + min; //含最大值,含最小值 }// 下载一篇文章async function DownOneArticle(page, rawid) {    console.log('DownOneArticle %s ...', rawid);    url = 'https://blog.51cto.com/walkerqt/' + rawid;    console.log('goto %s ...', url);    await page.goto(        url,        {            // timeout: 90*1000,            referer: 'https://blog.51cto.com/walkerqt'        });    let selector = 'div.artical-copyright';    console.log('waitForSelector: %s ...', selector);    await page.waitForSelector(        selector,    // 指定等待 css        {            timeout: 10 * 1000        }    );    await page.waitFor(GetRandInt(2, 5) * 1000);     // 随机睡眠几秒    await page.screenshot({ path: rawid + '.png' });    // 保存截图    let html = await page.content();    fs.writeFileSync(rawid + ".html", html);            // 保存网页}(async () => {    const browser = await puppeteer.launch({        // 启动浏览器        headless: false,    // 是否启用无头模式        args: [            '--no-sandbox',            // '--proxy-server=http://192.168.30.3:8080'   // 代理        ]    });    const page = await browser.newPage();    let url = 'https://blog.51cto.com/walkerqt';    // 首页    console.log('goto %s ...', url);    await page.goto(url);    let xpath = '//*[@id="Tab"]/div[@class="artical-tit"]';    console.log('waitForXPath: %s ...', xpath);    await page.waitForXPath(        // 指定等待 xpath        xpath,        {            timeout: 10 * 1000        }    );    await page.waitFor(GetRandInt(2, 5) * 1000);     // 随机睡眠几秒    let rawidArray = ['2419918', '2415142', '2413401', '2396430']    for (let idx in rawidArray) {        try {            await DownOneArticle(page, rawidArray[idx]);        } catch (error) {            console.log('* stack:\n %s', error.stack);        }    }    console.log("Good boy! Game over!");    await browser.close();      // 关闭浏览器})();


【运行】

运行

node 51cto.js


【相关阅读】

mozilla 讲 JavaScript 随机数生成:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math/random

Node.js Tips


*** walker ***