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

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://xiahunao.cn/news/3224841.html

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

相关文章

0010基于免疫遗传算法的配送中心选址

免疫优化算法(Immune Optimization Algorithm, IOA)在物流配送中心选址中的应用是通过模拟免疫系统的进化过程来解决选址优化问题。物流配送中心选址问题涉及到如何在给定区域内选择最优的位置,以最大化服务覆盖并最小化运输成本。 免疫优化…

使用昇腾芯片进行多卡训推时使用hccl_tools.py为npu分配ip报错问题解决办法

目录 问题描述问题产生原因解决办法最终执行并验证参考网站命令扩展 问题描述 昇腾芯片(910b/310p等)进行多卡训练或者推理时需要先获取并配置每张npu的ip信息,因此需要执行类似下面问题: python mindformers/tools/hccl_tools.…

【高等数学】第五章知识点:二重积分

文章目录 一. 二重积分的概念与性质1. 二重积分概念2. 二重积分的性质2.1. 不等式性质2.2. 中值定理 二. 二重积分的计算1. 利用直角坐标计算2. 利用极坐标计算3. 利用函数的奇偶性计算4. 利用变量的轮换对称性计算 一. 二重积分的概念与性质 1. 二重积分概念 几何意义&#x…

Skywork-MoE,1460亿MoE模型,采用MoE Upcycling技术

Skywork-MoE,1460亿MoE模型,采用MoE Upcycling技术 原创 每日发现最新LLM 机器之心SOTA模型 2024年06月04日 18:27 北京 🏆 基座模型 ①项目名称:Skywork-MoE ★Skywork-MoE是一款千亿模型,具有1460亿参数、16个专家…

websockt初始化,创建一个webSocket示例

写文思路: 以下主要从几个方面着手写websocket相关,包括以下:什么是webSocket,webSocket的优点和劣势,webSocket工作原理,webSocket握手示例,如何使用webSocket(使用webSocket的一个示例)&#…

uni-app三部曲之三: 路由拦截

1.引言 路由拦截,个人理解就是在页面跳转的时候,增加一级拦截器,实现一些自定义的功能,其中最重要的就是判断跳转的页面是否需要登录后查看,如果需要登录后查看且此时系统并未登录,就需要跳转到登录页&…

数据结构(初阶2.顺序表)

文章目录 一、线性表 二、顺序表 2.1 概念和结构 2.2 分类 2.2.1 静态顺序表 2.2.2 动态顺序表 2.3动态顺序表的实现 1.SeqList.h 2.SeqList.c 打印顺序表 初始化 销毁 增容 尾插 头插 在指定位置之前插入数据 尾删 头删 在指定位置删除数据 3.test.c 一、线性表 线性表&#…

Linux学习——Linux中无法使用ifconfg命令

Linux学习——Linux中无法使用ifconfg命令? 💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅…

MemFire Cloud: 一种全新定义后端即服务的解决方案

在这个快节奏的互联网时代,开发者们最希望的就是能够省时省力地完成项目,快速上线。然而,搭建服务、开发接口API、处理各种后端问题,往往让人头疼不已。别担心,现在有了MemFire Cloud,一款为懒人开发者量身…

Flutter-实现物理小球碰撞效果

效果 引言 在Flutter应用中实现物理动画效果,可以大大提升用户体验。本文将详细介绍如何在Flutter中创建一个模拟物理碰撞的动画小球界面,主要代码实现基于集成sensors_plus插件来获取设备的加速度传感器数据。 准备工作 在开始之前,请确保在pubspec.yaml文件中添加senso…

Java版Flink使用指南——合流

大纲 新建工程无界流奇数Long型无界流偶数Long型无界流奇数String型无界流 合流UnionConnect 测试工程代码 在《Java版Flink使用指南——分流导出》中,我们通过addSink进行了输出分流。本文我们将介绍几种通过多个无界流输入合并成一个流来进行处理的方案。 新建工…

使用 Hugging Face 的 Transformers 库加载预训练模型遇到的问题

题意: Size mismatch for embed_out.weight: copying a param with shape torch.Size([0]) from checkpoint - Huggingface PyTorch 这个错误信息 "Size mismatch for embed_out.weight: copying a param with shape torch.Size([0]) from checkpoint - Hugg…

悠律凝声环ringbuds pro开放式耳机:音乐世界的新探索

随着技术发展和生活节奏加快,耳机已经成为了人们日常生活中不可或缺的数码设备。在这样的背景下,悠律凝声环开放式耳机,将高端素皮和编织纹理进行混搭,获得了德国红点奖、美国MUSE缪斯奖等多项国际大奖,展现出时尚与质…

经典双通道比较器LM393、LM393B、LM2903B、LM193、LM293和LM2903介绍及输入输出仿真

前言: LM393 SOP8封装的外观与丝印 LM393出现几十年了,是一款经典的双比较器,非常经典,用的比较多,新的比较器大家也要多关注。 该类型比较器,虽然静态电流较小,但在电池电路中耗电是巨大的&…

数据结构基础--------【二叉树题型】

1、前提(待补充) 1.**DFS(Depth First Search)😗*递归法得到最终的数组(深度优先算法) 其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,如果遇到死路就往回退,回退过程中如果遇…

短剧新风潮:海外制作的艺术与技术

海外短剧新风潮在艺术与技术两个维度上都展现出了显著的创新与进步。 艺术层面 1、内容创新: (1)多元化与包容性:海外短剧在内容创新上更加注重多元化和包容性,将不同地域、民族的文化元素融入创作中,展现丰…

FUSE(用户空间文件系统)命令参数

GPT-4 (OpenAI) FUSE (Filesystem in Userspace)是一个允许创建用户空间文件系统的接口。它提供了一个API,让开发者在未修改内核代码的情况下,通过自己的程序实现文件系统。FUSE 文件系统通常通过 mount 命令来挂载,而且这个命令可以接受各…

【QML之·基础语法概述】

系列文章目录 文章目录 前言一、QML基础语法二、属性三、脚本四、核心元素类型4.1 元素可以分为视觉元素和非视觉元素。4.2 Item4.2.1 几何属性(Geometry):4.2.2 布局处理:4.2.3 键处理:4.2.4 变换4.2.5 视觉4.2.6 状态定义 4.3 Rectangle4.3.1 颜色 4.4…

人话学Python-基础篇-字符串

一:字符串的定义 在Python中使用引号来定义。不论是单引号还是双引号。 str1 Hello World str2 "Hello World" 二:字符串的访问 如果我们要取出字符串中单独的字符,需要使用方括号来表示取得的位置。如果要取出字符串的子串&…

电脑引导坏了怎么修复?电脑引导坏了全自动修复教程

电脑怎么修复引导?我们知道目前电脑有两种引导模式legacy和uefi,所以会出现legacy和uefi引导修复的问题,随着uefi的流行,越来越多的小伙伴经常遇到电脑引导丢失的问题,也不知道怎么修复,以前的一些修复工具都只能修复…