使用Puppeteer进行数据抓取保存为JSON

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 Tair(兼容Redis),内存型 2GB
简介: 使用Puppeteer进行数据抓取保存为JSON

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的强大功能和灵活性使其成为自动化网页测试和数据抓取的理想选择。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
JSON JavaScript 前端开发
JavaScript读取本地json文件方式
JavaScript读取本地json文件方式
|
5月前
|
XML JSON 前端开发
JSON与AJAX:网页交互的利器
JSON与AJAX:网页交互的利器
42 0
|
8月前
|
存储 数据采集 JSON
Scrapy爬虫数据存储为JSON文件的解决方案
Scrapy爬虫数据存储为JSON文件的解决方案
|
JSON JavaScript 前端开发
开发了一个json格式化工具,使用js格式化json的代码分享
今天给大家介绍一下如何通过js来格式化json。
134 0
|
Web App开发 JSON 数据库
如何使用Python的Selenium库进行网页抓取和JSON解析
如何使用Python的Selenium库进行网页抓取和JSON解析
|
数据采集 JSON 数据格式
Python爬虫之JsonPath详解
JsonPath是一种信息抽取类库,是从JSON文档中抽取指定信息的工具。
128 0
|
Web App开发 JSON 前端开发
360浏览器安装JSON-Handle插件实现页面JSON数据格式化的操作方法
360浏览器安装JSON-Handle插件实现页面JSON数据格式化的操作方法
266 0
|
JSON JavaScript 前端开发
JavaScript将csv转为json的解决方案(2):papaparse.js插件
JavaScript将csv转为json的解决方案(2):papaparse.js插件
169 0
|
XML SQL JSON
推荐 9 个 爱不释手的 JSON 工具!
【51CTO.com快译】JSON(JavaScript对象标注)是一种流行的轻量级数据交换格式,在网络上已很常见。众所周知,JSON让开发人员易于使用,又让机器易于解析和生成。 JSON吸引了工具构建者的注意,它们开发了用于重新格式化、验证和解析JSON的众多工具,这不足为奇。这些工具既有在Web浏览器中运行的在线实用程序,又有面向代码编辑器和IDE的插件,比如Visual Studio Code和Eclipse。 下面介绍了其中九款工具。
1479 0
|
JSON 数据格式 Python
如何使用Request方法发送Post请求、JSON文件介绍、Python中的JSON数据以及获取到的JSON数据的解析。
如何使用Request方法发送Post请求、JSON文件介绍、Python中的JSON数据以及获取到的JSON数据的解析。