Puppeteer 爬取动态生成的网页实战

2020-06-17 07:01:08易采站长站整理
,
rimraf
(文件夹操作时需用到)


npm i -S puppeteer rimraf

新建

test.js
文件并引入


const puppeteer = require('puppeteer');
const chalk = require('chalk');
const path = require('path');
const https = require('https');
const fs = require('fs');
const rm = require('rimraf');

const settings = {
headless: false
}

function resolve(dir, dir2 = '') {
return path.posix.join(__dirname, './', dir, dir2);
}

async function main () {
const browser = await puppeteer.launch(settings); // 创建一个Browser 对象
try {
const page = await browser.newPage(); // 使用 Browser 创建 Page
page.setDefaultNavigationTimeout(600000);
// 监听 console
page.on('console', msg => {
for (let i = 0; i < msg.args().length; ++i) {
console.log(`${i}: ${msg.args()[i]}`);
}
});

<!-- main start -->
// main 区域

<!-- end start-->
console.log('服务正常结束')
} catch (error) {
console.log('服务出现错误:')
console.log(error)
} finally {

}
}

main()

接下来所有代码都在

main
区域内完成, 完整代码可访问github代码仓库 查看,下面仅列出每部分的思路

创建文件夹,用于保存爬取的文件

定义文件输出路径
根据路径生成文件夹
当文件夹已经存在,先删除,再新建

实现 Net Chart 目录下所有

a.drop
元素的点击事件

这部分涉及到DOM 操作, 只有在

page.evaluate()
中才能访问真实的
DOM
元素,同时,在
page.evaluate()
中不能直接调用外面定义的函数,可将函数传递进去,或将函数绑定到
window
对象上


await page.evaluate(async () => {
const rootNode = document.querySelector('#menu > ul > li:nth-child(5) > ul > li:nth-child(5)');
await window.walkDOM(rootNode)
})

此时,绑定到

window
对象上的
walkDOM
函数需要在
page.evaluateOnNewDocument
函数中定义才能生效


await page.evaluateOnNewDocument(() => {
// 遍历DOM
window.walkDOM = (node) => {
if (node === null) {
return
}
if (node.tagName === 'A' && node.className.indexOf('drop') > -1) {