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

Puppeteer简介

Puppeteer是由Google Chrome团队开发的一个Node库,它提供了一个高级API来控制Chrome或Chromium的无头版本。Puppeteer能够执行各种任务,包括页面导航、内容抓取、屏幕截图、PDF生成等。

主要特点

  • 无头浏览器控制:无需打开浏览器界面即可执行任务。
  • 跨平台:支持Windows、Linux和macOS。
  • API丰富:提供丰富的API来模拟用户行为。

使用Puppeteer进行数据抓取

基本流程

  1. 启动浏览器:使用Puppeteer启动无头浏览器。
  2. 打开页面:创建新的页面实例并导航到目标URL。
  3. 等待页面加载:确保页面完全加载。
  4. 抓取内容:使用Puppeteer提供的API获取页面内容。
  5. 记录日志:将抓取的内容或相关信息记录到日志文件。
  6. 关闭浏览器:任务完成后关闭浏览器。

实现过程

假设我们需要抓取一个网页上的表格数据,以下是实现的步骤:

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

相关推荐
Lucifer__hell17 分钟前
【python+tkinter】图形界面简易计算器的实现
开发语言·python·tkinter
2301_8129148719 分钟前
py day34 装饰器
开发语言·python
我的xiaodoujiao1 小时前
使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 24--数据驱动--参数化处理 Excel 文件 1
python·学习·测试工具·pytest
开心-开心急了1 小时前
关于Flutter与Qt for python 的一些技术、开源、商用等问题
开发语言·python·qt·flutter
@小码农1 小时前
2025年北京海淀区中小学生信息学竞赛第一赛段试题(附答案)
人工智能·python·算法·蓝桥杯
Q_Q19632884752 小时前
python+django/flask基于机器学习的就业岗位推荐系统
spring boot·python·django·flask·node.js·php
AI科技星3 小时前
张祥前统一场论动量公式P=m(C-V)误解解答
开发语言·数据结构·人工智能·经验分享·python·线性代数·算法
海琴烟Sunshine3 小时前
leetcode 345. 反转字符串中的元音字母 python
python·算法·leetcode
ithicker3 小时前
Pycharm+Deepseek结合使用Continue插件无法返回中文产生乱码
ide·python·pycharm
棉猴4 小时前
《pygame中Sprite类实现多帧动画》注-通过多张序列帧显示动画2-1
python·游戏·pygame·游戏编程