Puppeteer简介
Puppeteer是由Google Chrome团队开发的一个Node库,它提供了一个高级API来控制Chrome或Chromium的无头版本。Puppeteer能够执行各种任务,包括页面导航、内容抓取、屏幕截图、PDF生成等。
主要特点
无头浏览器控制:无需打开浏览器界面即可执行任务。
跨平台:支持Windows、Linux和macOS。
API丰富:提供丰富的API来模拟用户行为。
使用Puppeteer进行数据抓取
基本流程
启动浏览器:使用Puppeteer启动无头浏览器。
打开页面:创建新的页面实例并导航到目标URL。
等待页面加载:确保页面完全加载。
抓取内容:使用Puppeteer提供的API获取页面内容。
记录日志:将抓取的内容或相关信息记录到日志文件。
关闭浏览器:任务完成后关闭浏览器。
实现过程
假设我们需要抓取一个网页上的表格数据,以下是实现的步骤:
```const puppeteer = require('puppeteer');
const http = require('http');
const proxyHost = "www.16yun.cn";
const proxyPort = "5445";
const proxyUser = "16QMSOML";
const proxyPass = "280651";
// 创建HTTP代理服务器
const proxy = http.createServer((req, res) => {
// 这里可以添加更多的逻辑,比如请求转发等
res.end('代理服务器正在运行');
}).listen(proxyPort, proxyHost);
proxy.on('connect', (req, res, proxy) => {
// 这里可以添加代理连接的逻辑
// 例如,根据HTTP CONNECT方法,建立到目标服务器的连接
});
(async () => {
// 设置Puppeteer的代理
const browser = await puppeteer.launch({
args: [
--proxy-server=http://${proxyUser}:${proxyPass}@${proxyHost}:${proxyPort}
]
});
const page = await browser.newPage();
try {
await page.goto('https://example.com/data');
// 等待表格加载完成
await page.waitForSelector('table');
// 获取表格数据
const tableData = await page.evaluate(() => {
const table = document.querySelector('table');
const rows = table.querySelectorAll('tr');
const data = [];
rows.forEach(row => {
const columns = row.querySelectorAll('td');
const rowData = [];
columns.forEach(column => {
rowData.push(column.textContent);
});
data.push(rowData);
});
return data;
});
console.log(tableData);
} catch (error) {
console.error('发生错误:', error);
} finally {
await browser.close();
}
})();
日志记录
在数据抓取的过程中,记录日志是非常重要的,可以帮助我们跟踪程序的执行情况和调试问题。可以使用winston或bunyan等日志库来实现日志记录:
以下是使用winston记录日志的示例:
```const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: 'combined.log' })
]
});
(async () => {
try {
const browser = await puppeteer.launch();
logger.info('Browser launched');
const page = await browser.newPage();
logger.info('New page created');
await page.goto('https://example.com/data');
logger.info('Navigated to the data page');
// ... 数据抓取代码 ...
logger.info('Data scraping completed');
} catch (error) {
logger.error('Error occurred:', error);
} finally {
await browser.close();
logger.info('Browser closed');
}
})();
数据保存为JSON
抓取到的数据可以通过fs模块保存为JSON文件:
```const fs = require('fs');
// ... 数据抓取代码 ...
// 将数据保存为JSON
fs.writeFile('data.json', JSON.stringify(tableData, null, 2), err => {
if (err) {
logger.error('Error writing file:', err);
} else {
logger.info('Data saved successfully');
}
});
```
结语
本文介绍了使用Puppeteer进行网页内容的抓取,并通过日志记录和JSON文件保存的方式,展示了整个数据抓取过程的实现。Puppeteer的强大功能和灵活性使其成为自动化网页测试和数据抓取的理想选择。