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

news2024/11/15 9:11:24

在这里插入图片描述

网页抓取已经成为任何处理网页数据提取的人都必须掌握的一项重要技能。无论你是开发者、数据科学家还是希望从网站收集信息的爱好者,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://www.coloradmin.cn/o/1914789.html

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

相关文章

真正高水平的一流领导,从不和员工打成一片,这3点原因太真实

真正高水平的一流领导,从不和员工打成一片,这3点原因太真实 第一个:分化团队 在团队管理过程中,如果人不多,那还好。 可一旦人数多了,领导就不可能面面俱到,顾及到每一个人。 肯定会出现&am…

基于Java技术的网上图书商城系统

你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。 开发语言:Java 数据库:MySQL 技术:Java技术、SpringBoot框架 工具:Eclipse、Navicat、Maven 系统展示 首页 用户注册界面…

Java中的公平锁和非公平锁

1、什么是公平锁和非公平锁 公平锁和非公平锁是指在多线程环境下,如何对锁进行获取的顺序和策略的不同。 公平锁是指多个线程按照申请锁的顺序来获取锁,即先到先得的策略。当一个线程释放锁之后,等待时间最长的线程将获得锁。公平锁的优点是保…

第2章 信息技术知识

第2章 信息技术知识 本章简要叙述了信息技术相关基础知识,包含软件工程、面向对象系统分析与设计、应用集成技术、计算机网络技术和新一代信息技术内容。 2.1 软件工程 随着所开发软件的规模越来越大、复杂度越来越高,加之用户需求又并不十分明确&…

【RIP实验-熟悉基础配置】

实验拓扑 实验要求 根据实验拓扑的IP地址分配,为所有设备配置对应的IP地址和环回地址。全网运行RIPv2,将R1、R2、R3和R4的物理端口、Loopback地址和10.1.00网段进行宣告。并在rip协议下配置路由自动汇总,观察R1/R2是否能够收到10.0.0.0的详细…

【Pytorch实用教程】transformer中创建嵌入层的模块nn.Embedding的用法

文章目录 1. nn.Embedding的简单介绍1.1 基本用法1.2 示例代码1.3 注意事项2. 通俗的理解num_embeddings和embedding_dim2.1 num_embeddings2.2 embedding_dim2.3 使用场景举例结合示例1. nn.Embedding的简单介绍 nn.Embedding 是 PyTorch 中的一个模块,用于创建一个嵌入层。…

MATLAB engine for python调用m文件函数输出变量值python调用MATLAB函数混合编程

MATLAB engine for python调用m文件函数输出变量值python调用MATLAB函数混合编程 说明(废话)解决方案总结 说明(废话) python调用MATLAB函数,MATLAB函数实现在m文件,python直接调用MATLAB中的函数。 首先还是要安装好MATLAB engine python setup.py ins…

3d已经做好的模型怎么改单位?---模大狮模型网

在展览3D模型设计行业中,经常会遇到需要将已完成的模型进行单位转换的需求。这可能涉及从一种度量单位转换为另一种,例如从英制单位转换为公制单位,或者根据特定的展览场地要求进行尺寸调整。本文将探讨如何有效地修改已完成的3D模型的单位&a…

标签印刷检测,如何做到百分百准确?

印刷标签是一种用于标识、识别或包装产品的平面印刷制品。这些标签通常在纸张、塑料膜、金属箔等材料上印刷产品信息、条形码、图像或公司标识,以便于产品识别和管理。印刷标签有各种形状、尺寸和材质,可以根据具体需求进行定制设计。常见的印刷标签包括…

分类模型的算法性能评价

一、概述 分类模型是机器学习中一种最常见的问题模型,在许多问题场景中有着广泛的运用,是模式识别问题中一种主要的实现手段。分类问题概况起来就是,对一堆高度抽象了的样本,由经验标定了每个样本所属的实际类别,由特定…

南京邮电大学运筹学课程实验报告1 线性规划求解 指导

一、题目描述 实验 一 线性规划求解 实验属性: 验证性     实验目的 1.理解线性规划解的基本概念; 2.掌握运筹学软件的使用方法; 3. 掌握线性规划的求解原理和方法。 实验内容 认…

MQTT是什么,物联网

写文思路: 以下从几个方面介绍MQTT,包括:MQTT是什么,MQTT和webSocket的结合,以及使用场景, 一、MQTT是什么 MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅消息…

手慢无,速看︱PMO大会内部学习资料

全国PMO专业人士年度盛会 每届PMO大会,组委会都把所有演讲嘉宾的PPT印刷在了会刊里面,供大家会后回顾与深入学习。 第十三届中国PMO大会-会刊 《2024第十三届中国PMO大会-会刊》 (内含演讲PPT) 会刊:750个页码&…

泽众云真机-远程自助兼容性测试报告新功能已上线

之前泽众云真机平台有用户咨询,是否支持团队管理,因项目时间上线紧急,需要多人参与测试, 否则项目有延期的风险,后来用户选择了泽众云测试平台的第三方专业兼容性测试服务。事后技术团队认真评估用户需要,从…

京东商品历史价格查询

当前资料来源于网络,禁止用于商用,仅限于学习。 下载京东APP 登录后 打开商品详情就可以看到 要获取京东商品的历史价格,你可以在京东网站上搜索该商品,并进入该商品的详情页面。然后,在页面中找到“商品详情”一栏&…

电脑32位和62位是什么意思

在现代计算机世界中,32位和64位是两个常见的术语,但许多用户可能不太清楚它们的确切含义以及它们之间的区别。本文将详细介绍32位和64位计算机的基本概念、如何查看您的计算机是32位还是64位,以及它们对用户的实际影响。 32位与64位的基本概…

针对tcp不出网打——HTTP封装隧道代理(以CFS演示)

目录 上传工具到攻击机 使用说明 生成后门文件 由于电脑短路无法拖动文件,我就wget发送到目标主机tunnel.php文件​ 成功上传​ 可以访问上传的文件 启动代理监听 成功带出 后台私信获取弹药库工具reGeorg 上传工具到攻击机 使用说明 生成后门文件 pyt…

【Linux】进程(9):进程控制3(进程程序替换)

大家好,我是苏貝,本篇博客带大家了解Linux进程(9)进程控制1,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 (A)什么是进程程序替换&#xf…

PLC数采网关在实际应用中有哪些效能?天拓四方

在工业自动化领域中,PLC扮演着至关重要的角色,它负责控制和监测生产线的各个环节。然而,随着工业4.0的推进和智能制造的快速发展,单纯依靠PLC进行现场控制已无法满足企业对数据集中管理、远程监控和智能分析的需求。因此&#xff…

优化爬虫体验:揭秘IP重复率过高问题解决方案

在当今信息爆炸的时代,网络中蕴藏着大量宝贵的数据,而爬虫技术成为我们提取这些数据的重要工具。然而,随着爬虫的广泛使用,IP重复率高的问题也随之而来。本篇博文将揭秘解决这一问题的关键方法——使用IP代理。 一、 IP高重复问题…