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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 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);
AI 代码解读

} 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');
  }
})();
AI 代码解读

数据保存为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日志并进行多维度分析。
目录
打赏
0
0
0
0
296
分享
相关文章
LLM系列 | 12: 如何编写思维链Prompt?以智能客服为例
本文介绍如何编写ChatGPT的思维链Prompt从而为用户提供智能客服服务。在智能客服场景中,经常会有用户询问对比各种产品的价格,如何让智能客服提供准确的答案?这就需要在构建Prompt过程中引入思维链的编写方式。
1688API商品详情接口如何获取
获取 1688 API 商品详情接口的主要步骤包括:1. 注册开发者账号;2. 了解接口规范和政策;3. 申请 API 权限;4. 获取 API 密钥;5. 技术实现接口调用,选择开发语言并发送 HTTP 请求;6. 处理响应数据,解析 JSON 格式并提取所需信息。
Flink基于Paimon的实时湖仓解决方案的演进
本文整理自阿里云智能集团苏轩楠老师在Flink Forward Asia 2024论坛的分享,涵盖流式湖仓架构的背景介绍、技术演进和未来发展规划。背景部分介绍了ODS、DWD、DWS三层数据架构及关键组件Flink与Paimon的作用;技术演进讨论了全量与增量数据处理优化、宽表构建及Compaction操作的改进;发展规划则展望了Range Partition、Materialized Table等新功能的应用前景。通过这些优化,系统不仅简化了复杂度,还提升了实时与离线处理的灵活性和效率。
636 3
Flink基于Paimon的实时湖仓解决方案的演进
使用 Puppeteer 绕过 Captcha:实现商家数据自动化采集
本文介绍了如何使用Puppeteer结合代理IP和用户伪装技术,轻松绕过大众点评的Captcha验证,实现商家信息的高效采集。通过配置Puppeteer、设置代理和用户伪装参数、模拟人类操作等步骤,成功提取了目标页面的数据。该方法不仅提高了爬虫的稳定性和隐蔽性,还为市场研究和商业分析提供了有力支持。注意,数据采集需遵守法律法规及网站政策。
262 1
使用 Puppeteer 绕过 Captcha:实现商家数据自动化采集
如何解析一个 HTML 文本
【10月更文挑战第23天】在实际应用中,根据具体的需求和场景,我们可以灵活选择解析方法,并结合其他相关技术来实现高效、准确的 HTML 解析。随着网页技术的不断发展,解析 HTML 文本的方法也在不断更新和完善,
如何在前端开发中有效管理状态:React vs. Vue
在现代前端开发中,状态管理是一个关键因素,它直接影响到应用的性能和可维护性。React 和 Vue 是当前最流行的前端框架,它们在状态管理方面各有优势和劣势。本文将深入探讨 React 和 Vue 在状态管理中的不同实现,分析它们的优缺点,并提供实际应用中的最佳实践,以帮助开发者选择最适合他们项目的解决方案。
cnpm 的安装与使用
本文介绍了npm和cnpm的概念、安装nodejs的步骤,以及cnpm的安装和使用方法,提供了通过配置npm使用中国镜像源来加速包下载的替代方案,并说明了如何恢复npm默认仓库地址。
cnpm 的安装与使用
如何在Ubuntu上运行Jar包?
【7月更文挑战第9天】
651 0
如何在Ubuntu上运行Jar包?
MySQL【实践 02】MySQL迁移到PostgreSQL数据库的语法调整说明及脚本分享(通过bat命令修改mapper文件内的SQL语法)
MySQL【实践 02】MySQL迁移到PostgreSQL数据库的语法调整说明及脚本分享(通过bat命令修改mapper文件内的SQL语法)
439 0

数据库

+关注
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等