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

相关推荐
简佐义的博客1 小时前
生信分析的过去(R语言)、现在(Python)和未来(云平台)
开发语言·python·r语言
代码不行的搬运工1 小时前
PYTHON专题-(8)我错了该怎么整?
开发语言·python
大江东去浪淘尽千古风流人物2 小时前
【ML】transform 之 decoder 及其实现细节
pytorch·python·transformer·batch·deep learning
CPU NULL2 小时前
python列表
开发语言·python
freephp2 小时前
数据结构学习之树结构
python·tree
pwd`×续缘`2 小时前
NLP--加载与使用预训练模型
人工智能·python·自然语言处理·transformer
F_D_Z2 小时前
【PyTorch】多对象分割项目
pytorch·python·深度学习
Fuliy962 小时前
数学建模--智能算法之鱼群算法
python·算法·数学建模·智能算法·鱼群算法·数学建模智能算法
JohnYan2 小时前
我也来爬一爬12306 - Day2 主页和车站
后端·爬虫·node.js
白骑士所长3 小时前
白骑士的PyCharm教学基础篇 1.5 插件与扩展
ide·python·pycharm