【简介】
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
【准备工作】
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
【相关阅读】
*** walker ***