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

news2024/9/23 19:28:41

Python_00044.png

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1910641.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HybridCLR + Addressable 热更新篇(一)

目录 前言一、HybridCLR 和 Addressable 是什么?1. HybridCLR2. Addressable 二、使用步骤1.HybridCLR导入2.HybridCLR配置3.Addressable导入4.Addressable配置 前言 随着移动互联网和游戏行业的快速发展,热更新技术变得越来越重要。热更新能够在不重新…

文华财经红绿多空趋势量化买卖点指标公式源码

LC:REF(CLOSE,1); RSI1:SMA(MAX(CLOSE-LC,0),13,1)/SMA(ABS(CLOSE-LC),13,1)*100; RSIF:90-RSI1,COLOR33DD33; A4:((C-LLV(L,33))/(HHV(H,33)-LLV(L,33)))*67; ABC22:LLV(LOW,10); ABC33:HHV(HIGH,25); 动力线:EMA((CLOSE-ABC22)/(ABC33-ABC22)*4,4); RSV:(C-LLV(L,9))/…

【Unity 实用技巧】为游戏截图添加自定义水印LOGO

1. 前言 大家好,我是Mark。在Unity开发中,屏幕截图功能是一项常用的功能,它常用于游戏分享而默认的截图往往缺乏辨识度。本文将介绍如何在Unity中实现带有自定义LOGO的屏幕截图,话不多说开搞~ 2. 最终效果 3. 示例代码 代码比较…

婴幼儿自闭症的六大警示前兆:家长需警惕的早期信号

婴幼儿自闭症是一种复杂的发育障碍,其早期症状往往较为微妙,但若能及早发现并干预,对孩子的成长至关重要。以下是婴幼儿自闭症的六个主要前兆: 首先,目光呆滞与反应迟钝。婴儿期,孩子应能对外界刺激如声音…

Java基础-组件及事件处理(中)

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 BorderLayout布局管理器 说明: 示例: FlowLayout布局管理器 说明: …

Vue3项目如何使用npm link本地测试组件库

一、组件库操作 1、在组件库项目中先运行npm run lib,其效果如下 2、在组件库项目中在运行npm link,其效果如下 会创建一个全局的软连接指向本地的组件库 二、Vue3项目使用 1、在项目中运行 npm link 组件名称(即:组件库packag…

Kettle常用参数配置

目录 一、时区二、时间戳三、tinyint类型转换 一、时区 Kettle链接mysql出现报错:Connection failed. Verify all connection parameters and confirm that the appropriate driver is installed. The server time zone value is unrecognized or represents more…

嵌入式单片机,两者有什么关联又有什么区别?

在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」, 点个关注在评论区回复“666”之后私信回复“666”,全部无偿共享给大家!!!使用单片机是嵌入式系统的…

HSG金属表面缺陷检测

HSG金属表面缺陷检测 1. 项目背景1.1 项目简述1.2 项目目标 2. 解决方案3. 数据集3.1 收集各种缺陷的图片3.2 利用有限图片创造更多可能3.3 分割图像3.4 打标签 4. 部分代码4.1 数据集划分4.2图像分割4.3 训练模型4.4 预测 5. 预测结果 1. 项目背景 1.1 项目简述 iPad HSG 的…

【运维】磁盘满了怎么办?如何快速找到占用空间的文件和腾出空间

机器用久了,很容易生成很多临时或者无用的文件,占用大量空间造成磁盘不够用。尤其是服务器,当磁盘不够用时,系统会出现莫名其妙的问题,数据库可能会造成数据损坏。此时快速定位可以删除的大文件并及时释放空间&#xf…

Linux内核网络性能问题的追踪(工具篇)

在现代计算环境中,网络性能对于系统的整体性能至关重要。网络瓶颈不仅会影响数据传输速度,还会影响应用程序的响应时间,最终影响用户体验。为了有效地解决网络性能问题,了解和使用各种追踪工具至关重要。另外一方面,造…

SQLServer用户们,你们摊上大事了!

最近一段时间,我们经常会收到了许多用户的咨询,问我们何时能纳管SQLServer?耐不住小伙伴们的猛烈催促及热切期待,本不想纳管SQLServer的研发团队也抓紧将这项需求提上日程。并在DBdoctor v3.2.2版本中成功实现了对SQLServer的纳管…

VS2019运行报错 应输入预处理器指令

根据错误提示,找到对应行,然后删除多余的#字符即可

小程序渗透测试的两种方法——burpsuite、yakit

首先呢主要是配置proxifier,找到小程序的流量,然后使用burpsuite或者yakit去抓包。 一、使用burpsuiteproxifier的抓包测试 1、先配置proxifier,开启http流量转发 勾选确定 2、配置burp对应代理端口,选择profile,点…

软件工具网站推荐

1.菜鸟工具 菜鸟工具 - 不止于工具菜鸟工具,为开发设计人员提供在线工具,网址导航,提供在线PHP、Python、 CSS、JS 调试,中文简繁体转换,进制转换等工具。致力于打造国内专业WEB开发工具,集成开发环境&…

手把手和你一起从0搭建一个vite+Vue3+element-plus的后台管理系统!

首选需要node环境。你可以参考:如何创建一个vue的新项目,用命令行的方式创建.下载node.js-CSDN博客 所需要的内容官网: https://vitejs.dev/ 安装 | Element Plus Vue Router | Vue.js 的官方路由 axios中文网|axios API 中文文档 | axio…

在国内允许交易伦敦金吗?有没有好的伦敦金交易策略

伦敦金,作为全球金融市场上的一种重要投资品种,以其独特的交易机制和价值稳定性吸引了无数投资者的目光。然而,对于国内投资者而言,是否可以合法参与伦敦金的交易,以及如何制定有效的交易策略,是他们普遍关…

主动算法交易!减持回购/套利/大单拆分/篮子交易/预埋单神器工具!

主动算法致力于服务机构投资者,为其提供以成交为目的的自动化交易执行。 在有限容量内,充分追求客户个性化需求,保证执行效率、降低冲击成本、减少人力成本、保护交易意图、 捕捉交易机会、 符合监管要求和获取交易环节的ALpha收益。 能够帮…

初阶C++(二)

初阶C(二) 1. 重载函数(一)对于重载函数的理解(二)重载函数分类2.引用(一) 引⽤的概念和定义(二)引用的使用(三)const引用 1. 重载函数…

EI期刊目录为何还没更新?预警、On Hold、镇压多重bug,神仙难救Top能逃此劫吗?

本周投稿推荐 SCI • 能源科学类,1.5-2.0(25天来稿即录) • CCF推荐,4.5-5.0(2天见刊) • 生物医学制药类(2天逢投必中) EI • 各领域沾边均可(2天录用&#xff09…