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

相关推荐
_oP_i2 小时前
HTTP 请求Media typetext/plain application/json text/json区别
网络协议·http·json
算法小白(真小白)2 小时前
低代码软件搭建自学第二天——构建拖拽功能
python·低代码·pyqt
唐小旭2 小时前
服务器建立-错误:pyenv环境建立后python版本不对
运维·服务器·python
007php0072 小时前
Go语言zero项目部署后启动失败问题分析与解决
java·服务器·网络·python·golang·php·ai编程
Chinese Red Guest2 小时前
python
开发语言·python·pygame
骑个小蜗牛3 小时前
Python 标准库:string——字符串操作
python
qq_589568104 小时前
数据可视化echarts学习笔记
学习·信息可视化·echarts
黄公子学安全5 小时前
Java的基础概念(一)
java·开发语言·python
fkdw6 小时前
C# Newtonsoft.Json 反序列化派生类数据丢失问题
c#·json