Puppeteer 是什么以及如何在网络抓取中使用它 | 2024 完整指南

在这里插入图片描述

网页抓取已经成为任何处理网页数据提取的人都必须掌握的一项重要技能。无论你是开发者、数据科学家还是希望从网站收集信息的爱好者,Puppeteer都是你可以使用的最强大工具之一。本完整指南将深入探讨什么是Puppeteer以及如何有效地在网页抓取中使用它。

Puppeteer简介

Puppeteer是一个Node库,它通过DevTools协议提供了一个高级API来控制Chrome或Chromium。它由Google Chrome团队维护,提供了开发者执行各种浏览器任务的能力,如生成截图、抓取网站,最重要的是网页抓取。由于其无头浏览功能(即可以在没有图形用户界面的情况下运行),Puppeteer非常受欢迎,非常适合自动化任务。

是否在为反复失败的验证码而苦恼?通过CapSolver AI驱动的自动网页解锁技术,发现无缝的自动验证码解决方案!

领取您的优惠码以获得顶级验证码解决方案;CapSolver: WEBS。兑换后,每次充值将额外获得5%的奖励,无限次。

[外链图片转存中...(img-wXvup0o5-1720604014564)]

为什么使用Puppeteer进行网页抓取?

虽然Axios和Cheerio是JavaScript网页抓取的不错选择,但它们有一些限制:处理动态内容和绕过反抓取机制。

作为一个无头浏览器,Puppeteer在抓取动态内容方面表现出色。它可以完全加载目标页面,执行JavaScript,甚至可以触发XHR请求以检索额外的数据。这是静态抓取器无法实现的,尤其是在单页应用程序(SPA)中,初始HTML缺乏重要数据。

Puppeteer还能做什么?它可以渲染图像、捕获截图,并具有解决各种验证码的扩展,如reCAPTCHA、Funcaptcha、hCaptcha。例如,你可以编写脚本在页面上导航,在特定时间间隔内截取截图,并分析这些图像以获得竞争性见解。可能性几乎是无限的!

Puppeteer的简单使用

我们之前使用Selenium和Python完成了ScrapingClub的第一部分。现在,让我们使用Puppeteer完成第二部分。

[外链图片转存中…(img-0yziBy2m-1720604014564)]

在开始之前,请确保你在本地机器上安装了Puppeteer。如果没有,你可以使用以下命令安装:

npm i puppeteer # 安装时下载兼容的Chrome。
npm i puppeteer-core # 或者,作为库安装,不下载Chrome。

访问网页

const puppeteer = require('puppeteer');(async function() {const browser = await puppeteer.launch({headless: false});const page = await browser.newPage();await page.goto('https://scrapingclub.com/exercise/detail_json/');// 暂停5秒await new Promise(r => setTimeout(r, 5000));await browser.close();
})();

puppeteer.launch方法用于启动一个新的Puppeteer实例,可以接受一个包含多个选项的配置对象。最常见的是headless选项,它指定是否以无头模式运行浏览器。如果不指定此参数,默认值为true。其他常见的配置选项如下:

参数类型默认值描述示例
argsstring[]启动浏览器时传递的命令行参数数组args: ['--no-sandbox', '--disable-setuid-sandbox']
debuggingPortnumber指定调试端口号debuggingPort: 8888
defaultViewportdict{width: 800, height: 600}设置默认视口大小defaultViewport: {width: 1920, height: 1080}
devtoolsbooleanfalse是否自动打开开发者工具devtools: true
executablePathstring指定浏览器可执行文件的路径executablePath: '/path/to/chrome'
headlessboolean'shell'true是否以无头模式运行浏览器headless: false
userDataDirstring指定用户数据目录的路径userDataDir: '/path/to/user/data'
timeoutnumber30000等待浏览器启动的超时时间(毫秒)timeout: 60000
ignoreHTTPSErrorsbooleanfalse是否忽略HTTPS错误ignoreHTTPSErrors: true

设置窗口大小

为了获得最佳浏览体验,我们需要调整两个参数:视口大小和浏览器窗口大小。代码如下:

const puppeteer = require('puppeteer');(async function() {const browser = await puppeteer.launch({headless: false,args: ['--window-size=1920,1080']});const page = await browser.newPage();await page.setViewport({width: 1920, height: 1080});await page.goto('https://scrapingclub.com/exercise/detail_json/');// 暂停5秒await new Promise(r => setTimeout(r, 5000));await browser.close();
})();

提取数据

在Puppeteer中,有多种方法可以提取数据。

  1. 使用evaluate方法

    evaluate方法在浏览器上下文中执行JavaScript代码以提取所需数据。

    const puppeteer = require('puppeteer');(async function () {const browser = await puppeteer.launch({headless: false,args: ['--window-size=1920,1080']});const page = await browser.newPage();await page.setViewport({width: 1920, height: 1080});await page.goto('https://scrapingclub.com/exercise/detail_json/');const data = await page.evaluate(() => {const image = document.querySelector('.card-img-top').src;const title = document.querySelector('.card-title').innerText;const price = document.querySelector('.card-price').innerText;const description = document.querySelector('.card-description').innerText;return {image, title, price, description};});console.log('产品名称:', data.title);console.log('产品价格:', data.price);console.log('产品图片:', data.image);console.log('产品描述:', data.description);// 暂停5秒await new Promise(r => setTimeout(r, 5000));await browser.close();
    })();
    
  2. 使用$eval方法

    $eval方法选择单个元素并提取其内容。

    const puppeteer = require('puppeteer');(async function () {const browser = await puppeteer.launch({headless: false,args: ['--window-size=1920,1080']});const page = await browser.newPage();await page.setViewport({width: 1920, height: 1080});await page.goto('https://scrapingclub.com/exercise/detail_json/');const title = await page.$eval('.card-title', el => el.innerText);const price = await page.$eval('.card-price', el => el.innerText);const image = await page.$eval('.card-img-top', el => el.src);const description = await page.$eval('.card-description', el => el.innerText);console.log('产品名称:', title);console.log('产品价格:', price);console.log('产品图片:', image);console.log('产品描述:', description);// 暂停5秒await new Promise(r => setTimeout(r, 5000));await browser.close();
    })();
    
  3. 使用$$eval方法

    $$eval方法一次选择多个元素并提取其内容。

    const puppeteer = require('puppeteer');(async function () {const browser = await puppeteer.launch({headless: false,args: ['--window-size=1920,1080']});const page = await browser.newPage();await page.setViewport({width: 1920, height: 1080});await page.goto('https://scrapingclub.com/exercise/detail_json/');const data = await page.$$eval('.my-8.w-full.rounded.border > *', elements => {const image = elements[0].querySelector('img').src;const title = elements[1].querySelector('.card-title').innerText;const price = elements[1].querySelector('.card-price').innerText;const description = elements[1].querySelector('.card-description').innerText;return {image, title, price, description};});console.log('产品名称:', data.title);console.log('产品价格:', data.price);console.log('产品图片:', data.image);console.log('产品描述:', data.description);// 暂停5秒await new Promise(r => setTimeout(r, 5000));await browser.close();
    })();
    
  4. 使用page.$evaluate方法

    page.$方法选择元素,evaluate方法在浏览器上下文中执行JavaScript代码以提取数据。

    const puppeteer = require('puppeteer');(async function () {const browser = await puppeteer.launch({headless: false,args: ['--window-size=1920,1080']});const page = await browser.newPage();await page.setViewport({width: 1920, height: 1080});await page.goto('https://scrapingclub.com/exercise/detail_json/');const imageElement = await page.$('.card-img-top');const titleElement = await page.$('.card-title');const priceElement = await page.$('.card-price');const descriptionElement = await page.$('.card-description');const image = await page.evaluate(el => el.src, imageElement);const title = await page.evaluate(el => el.innerText, titleElement);const price = await page.evaluate(el => el.innerText, priceElement);const description = await page.evaluate(el => el.innerText, descriptionElement);console.log('产品名称:', title);console.log('产品价格:', price);console.log('产品图片:', image);console.log('产品描述:', description);// 暂停5秒await new Promise(r => setTimeout(r, 5000));await browser.close();
    })();
    

绕过反抓取保护

完成ScrapingClub的练习相对简单。然而,在实际的数据抓取场景中,获取数据并不总是那么容易。一些网站采用反抓取技术,可能会检测到你的脚本为机器人并将其封锁。最常见的情况是遇到验证码挑战,如funcaptcha、datadome、recaptcha、hcaptcha和geetest。
在这里插入图片描述
在这里插入图片描述

要解决这些验证码挑战,需要在机器学习、逆向工程和浏览器指纹对抗措施方面有丰富的经验,这可能需要大量时间。

幸运的是,你不再需要自己处理所有这些工作了。CapSolver提供了一个全面的解决方案,帮助你轻松解决所有挑战。CapSolver提供了一个浏览器扩展,允许你在使用Puppeteer进行数据抓取时自动解决验证码挑战。此外,它还提供了一个API方法来解决验证码并获取令牌。所有这些都可以在几秒钟内完成。查看这个文档以了解如何解决你遇到的各种验证码问题!

结论

网页抓取对于任何从事网页数据提取的人来说都是一项无价的技能,而Puppeteer作为一个具有高级API和强大功能的工具,是实现这一目标的最佳选择之一。其处理动态内容和绕过反抓取机制的能力使其在众多抓取工具中脱颖而出。

在本指南中,我们探讨了什么是Puppeteer,它在网页抓取中的优势,以及如何设置和有效使用它。我们通过示例演示了如何访问网页、设置视口大小以及使用各种方法提取数据。此外,我们讨论了反抓取技术带来的挑战以及CapSolver如何提供强大的解决方案来应对验证码挑战。

CapsolverCN官 方代理交流扣 群:497493756

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

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

相关文章

【扩散对抗】AdvDiffuser: Natural Adversarial Example Synthesis with Diffusion Models

原文标题: AdvDiffuser: Natural Adversarial Example Synthesis with Diffusion Models 原文代码: https://github.com/lafeat/advdiffuser 发布年度: 2023 发布期刊: ICCV 目录 摘要背景创新点模型Adversarial GuidanceAdversar…

FlutterFlame游戏实践#15 | 生命游戏 - 演绎启动

theme: cyanosis 本文为稀土掘金技术社区首发签约文章,30天内禁止转载,30天后未获授权禁止转载,侵权必究! Flutter\&Flame 游戏开发系列前言: 该系列是 [张风捷特烈] 的 Flame 游戏开发教程。Flutter 作为 全平台 的 原生级 渲…

零基础做项目---五子棋对战---day02

用户模块 完成注册登录,以及用户分数管理~使用数据库来保存上述用户信息. 使用 MyBatis来连接并操作数据库了 主要步骤: 1.修改 Spring的配置文件,使数据库可以被连接上. 2.创建实体类,用户, User 3.创建Mapper接口~ 4.实现MyBatis 的相关xml配置…

【ffmpeg系列二点五】(失败,建议放弃)ubuntu下进行源码构建,给ffmpeg7.0.1添加hevc支持。

背景 windows下构建失败,ffmpeg对于flv-h265的处理得到新的报错。 开始ubuntu22下编译 pre:清除我们之前编译的nightly版本 sudo rm -rf /usr/local/bin/ffmpeg sudo rm -rf /usr/local/bin/ffprobe sudo rm -rf /usr/local/bin/ffserver sudo rm -…

轻松掌握图片压缩技巧,释放存储空间!

前言 在这个充满视觉冲击的时代,我们每天都在创造和分享图片。但你是否发现,手机和电脑的存储空间越来越不够用了?图片文件过大,不仅占用空间,还影响传输速度和网页加载。今天,就让我来教你几招&#xff0…

Python爬虫:BeautifulSoup的基本使用方法!

1.简介 Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析“标签树”等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。 Beautiful Soup…

Python基础语法:变量和数据类型详解(整数、浮点数、字符串、布尔值)①

文章目录 变量和数据类型详解(整数、浮点数、字符串、布尔值)一、变量二、数据类型1. 整数(int)2. 浮点数(float)3. 字符串(str)4. 布尔值(bool) 三、类型转换…

生物打印后的生物力学过程

生物打印后的生物力学过程 3D生物打印技术在组织工程领域展现出巨大的潜力,但打印后组织的生物力学特性对其最终成功至关重要。本文将详细介绍打印后组织的生物力学特性及其在组织工程中的应用。 1. 打印后水凝胶交联 原位交联可以在生物打印过程中提供足够的机械…

LoRaWAN网络协议Class A/Class B/Class C三种工作模式说明

LoRaWAN是一种专为广域物联网设计的低功耗广域网络协议。它特别适用于物联网(IoT)设备,可以在低数据速率下进行长距离通信。LoRaWAN 网络由多个组成部分构成,其中包括节点(终端设备)、网关和网络服务器。Lo…

【Unity2D 2022:NPC】制作任务系统

一、接受任务 1. 编辑NPC对话脚本: (1)创建静态布尔变量用来判断ruby是否接受到任务 public class NPCDialog : MonoBehaviour {// 创建全局变量用来判断ruby是否接到任务public static bool receiveTask false; } (2&#xff…

类型“RouteRecordName”上不存在属性“includes”。 类型“symbol”上不存在属性“includes”

确定 route.name 运行时是 字符串,强制转换 为字符串。 removeRoute(id: string) { this.dynamRoute this.dynamRoute.filter(route > !(route.name as string).includes(id)) localStorage.setItem(dynamRoute, JSON.stringify(this.dynamRoute)) delete this.t…

4.3 设备管理

大纲 设备分类 输入输出 虚设备和SPOOLING技术

【C语言之高级编程】如何将指定变量或函数编译至固定的内存区域中?

如何将指定变量或函数编译至固定的内存区域? 1. 内存类型1.1 bss段(Block Started by Symbol)1.2 data段(data segment)1.3 text段(code segment/text segment)1.4 dec1.5 堆(heap&a…

绝区玖--人工智能物料清单 (AI BOM)

前言 AI BOM 涵盖了从输入模型的数据到为模型提供支持的基础设施以及将 AI 从概念转化为生产的过程的一切。 但为什么我们需要人工智能物料清单?答案在于当今世界人工智能/Gen AI系统的复杂性和关键性: 透明度和可重复性:AI BOM 提供所有组件…

python怎么求因数

要想做到python语言求因数方法,首先要明白其中的原理: 1、对由123456789这九个数字组成的9位数进行分解质因数。 2、1234576982x3x3x7x13x23x29x113,所以他的值因数是113。 3、总共有362880种可能,从中找出值因数中最小的数字和…

动态规划算法专题二--路径问题

目录 专题二: 路径问题 题五 不同路径 1、算法解析 1、确定状态: 2、状态转移方程: 3、初始化: 4、填表顺序: 5、返回值: 2、代码 题六 不同路径II 1、算法解析 1、确定状态: 2、状态…

前端面试题(CSS篇六)

一、浏览器如何判断是否支持 webp 格式图片 (1)宽高判断法。通过创建image对象,将其src属性设置为webp格式的图片,然后在onload事件中获取图片的宽高,如果能够获取,则说明浏览器支持webp格式图片。如果不能…

Qt:13.多元素控件(QLinstWidget-用于显示项目列表的窗口部件、QTableWidget- 用于显示二维数据表)

目录 一、QLinstWidget-用于显示项目列表的窗口部件: 1.1QLinstWidget介绍: 1.2属性介绍: 1.3常用方法介绍: 1.4信号介绍: 1.5实例演示: 二、QTableWidget- 用于显示二维数据表: 2.1QTabl…

Vue学习笔记(小满zs)

本文章记录一下我的学习笔记,供复习参考。🏆 向大佬学习!!! ⭐小满zs Nodejs Nodejs 三层组成 libuv(处理事件循环、I/O操作) 第三方库(处理HTTP等) V8引擎&#xff08…

Windows10系统下mysql5.6的安装步骤

1.下载mysql 下载地址:https://downloads.mysql.com/archives/community/ 在这里我们下载zip的包 2.解压mysql包到指定目录 3. 添加my.ini文件 # For advice on how to change settings please see # http://dev.mysql.com/doc/refman/5.6/en/server-configurat…