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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 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
JavaWeb14(ajax02判断账号是否存在&JSON介绍&AJAX+JSON字符串和对象之间的转换&JSON实现自动补全)
JavaWeb14(ajax02判断账号是否存在&JSON介绍&AJAX+JSON字符串和对象之间的转换&JSON实现自动补全)
|
5月前
|
JSON API 数据格式
如何用 Python 的 requests 库发送 JSON 数据的 POST 请求
使用 requests 库发送 JSON 数据的 POST 请求是一个非常简单且实用的操作。通过将目标 URL 和 JSON 数据传递给 requests.post 方法,你可以轻松发送请求并处理响应。本篇文章介绍了从安装 requests 库,到发送 JSON 数据的 POST 请求,再到处理响应的整个流程。希望这篇文章能帮助你更好地理解并应用这个强大的 HTTP 请求库。
|
6月前
|
JSON 数据格式 Python
Python标准库中包含了json模块,可以帮助你轻松处理JSON数据
【4月更文挑战第30天】Python的json模块简化了JSON数据与Python对象之间的转换。使用`json.dumps()`可将字典转为JSON字符串,如`{"name": "John", "age": 30, "city": "New York"}`,而`json.loads()`则能将JSON字符串转回字典。通过`json.load()`从文件读取JSON数据,`json.dump()`则用于将数据写入文件。
50 1
|
6月前
|
存储 数据采集 JSON
Scrapy爬虫数据存储为JSON文件的解决方案
Scrapy爬虫数据存储为JSON文件的解决方案
|
JSON JavaScript 前端开发
开发了一个json格式化工具,使用js格式化json的代码分享
今天给大家介绍一下如何通过js来格式化json。
117 0
|
数据采集 JSON 数据格式
Python爬虫之JsonPath详解
JsonPath是一种信息抽取类库,是从JSON文档中抽取指定信息的工具。
114 0
|
Web App开发 JSON 前端开发
360浏览器安装JSON-Handle插件实现页面JSON数据格式化的操作方法
360浏览器安装JSON-Handle插件实现页面JSON数据格式化的操作方法
249 0
|
Web App开发 JSON 数据格式
谷歌浏览器json插件,Json-Handle插件下载安装使用
谷歌浏览器json插件,Json-Handle插件下载安装使用
1449 0
|
JSON 数据格式 Python
如何使用Request方法发送Post请求、JSON文件介绍、Python中的JSON数据以及获取到的JSON数据的解析。
如何使用Request方法发送Post请求、JSON文件介绍、Python中的JSON数据以及获取到的JSON数据的解析。
|
JSON 数据格式 索引
Python_json数据检索与定位之jsonPath类库
Python_json数据检索与定位之jsonPath类库
182 0