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

相关推荐
梦想不只是梦与想2 小时前
环境管理系统:Conda(一)
python·conda·环境隔离
计算机源码社3 小时前
基于K-Means聚类的新生儿败血症临床分型与可视化分析系统 基于数据挖掘的新生儿败血症生命体征时序走势与关联性可视化研究
大数据·hadoop·python·数据挖掘·数据分析·spark·毕业设计
一阵寒风3 小时前
用 AI 把PCB制前工程CAM无人值守输出系统做出来
python·ai编程·pcb工艺
SamChan903 小时前
Python 处理小语种 PDF 的编码坑:重音字符、连字与 (cid:xx) 乱码的解决方案
python·ai·pdf·机器翻译
量化吞吐机3 小时前
会写代码之后,量化学习还要补上交易判断
人工智能·python
lie..4 小时前
30天从零开始学AI应用开发(Day 1):机器学习、深度学习、大模型,到底是个啥关系
人工智能·python·大模型
Ivanqhz4 小时前
Unigram 算法
开发语言·人工智能·python·深度学习·mlir
冯一川4 小时前
Python 实现与 Ollama 运行的模型对话
人工智能·python
车间溜盖子4 小时前
TE(TEC 半导体制冷片)Qc / Qh 冷热面基础定义
python
天赐范式4 小时前
天赐范式第168天:让子代开始从父代肩膀上演化——跨代β传递demo与完整代码
python·数字生命·天赐范式·动态运行时·跨代β传递·可继承性验证·digitallife