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://www.mzph.cn/news/872378.shtml

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

相关文章

日志的编写与线程池的结合

目录 一、认识日志 二、时间的等级划分 三、日志的输出端 3.1 保存至文件 四、日志的部分信息 4.1 日志等级 4.2 日志时间 五、加载日志 六、日志的宏编写 七、ThreadPool Log 一、认识日志 记录事件: 日志用于记录系统运行过程中发生的各种事件&…

elementui 日历组件el-calendar使用总结

功能: 1.日历可以周视图、月视图切换; 2.点击月视图中日期可以切换到对应周视图; 3.点击周视图查看当日对应数据; 4.周、月视图状态下,点击前后按钮,分别切换对应上下的周、月; 5.点击回到…

算法 —— 高精度(模拟)

目录 加法高精度 两个正整数相加 两个正小数相加 两正数相加 减法高精度 两个正整数相减 两个正小数相减 两正数相减 加减法总结 乘法高精度 两个正整数相乘 两个正小数相乘 乘法总结 加法高精度 题目来源洛谷:P1601 AB Problem(高精&#x…

如何PR到别人仓库(指定分支,无废话)

如何PR到别人仓库(指定分支) 记录一下,之前都是直接master分支,现在记录如何pr到别人仓库的其他分支 首先进入别人仓库然后点击fork到自己仓库 步骤(以博主自己一个例子为例) (1)…

c++ primer plus 第16章string 类和标准模板库,16.1.3 使用字符串

c primer plus 第16章string 类和标准模板库,16.1.3 使用字符串 c primer plus 第16章string 类和标准模板库,16.1.3 使用字符串 文章目录 c primer plus 第16章string 类和标准模板库,16.1.3 使用字符串16.1.3 使用字符串程序清单16.3 hangman.cpp 16.1.3 使用字符串 现在&a…

【题目/训练】二叉树的创建遍历(递归非递归)

一、根据二叉树创建字符串 思路:在正常前序递归遍历的基础上,单独加上一个考虑到右子树为空的情况,如下:其结果为 1(2(4(5)(6)))&…

馥郁珍藏:品味红酒的层次与细腻

在生活的点滴中,总有一些事物以其不同的魅力,让我们为之驻足,为之沉醉。红酒,便是其中之一。它不仅仅是一种饮品,更是一种情感的寄托,一种生活的艺术。今天,就让我们一起走进红酒的世界&#xf…

工控主板:搭载海光3300处理器的全国产化工控主板

最近为客户定做了一款全国产化的工控机主板。搭载海光3300核心板的含有丰富接口的工控主板。

一张图生成绘画全过程,这下人人都成“原画师”了

玩过SD的应该都知道ControlNet吧,最近ControlNet的作者Lvmin Zhang 又搞了一个开源项目PaintsUndo,在Github刚上线就收获了2.7k Star。 只需要上传一张静态图像,PaintsUndo就可以根据提供的图像自动生成对应的绘画全过程视频。 展示从一张白…

linux中关于环境变量的常用的设置方法

一. linux中设置环境变量的方式 1.使用/etc/environment, 是一个全局的环境变量设置文件,它会影响到所有用户和所有进程。当你需要设置一个全局的环境变量时,应该使用这个文件。这个文件的格式是 KEYvalue,每行一个环境变量。 2. 使用/etc/…

C# Winform的三态CheckBox,以及批量修改Panel中的控件

在C# WinForms中,如果你想批量修改一个Panel容器内的所有CheckBox控件的状态,你可以使用foreach循环来遍历Panel的Controls集合。下面是一个示例,展示了如何将一个Panel内所有的CheckBox控件设为选中状态(Checked true&#xff0…

昇思25天学习打卡营第13天|munger85

文本解码原理–以MindNLP为例 重要的就是怎么样把数字最后转化成真正的文字。而且自回归模型它会一个字给一个字的预测,下一个字应该是什么? 如果这个模型下载很慢,你就可以通过这种方式从摩大社区进行下载。 这种方式, 每一次候…

如何让LabVIEW程序框图的图标简化,从而节省空间?

再点击选项 取消掉箭头所示的√即可。 这样就可以将生成的图标从下面所示: 变成简化的图标,如下所示:

【Pytorch】数据集的加载和处理(一)

Pytorch torchvision 包提供了很多常用数据集 数据按照用途一般分为三组:训练(train)、验证(validation)和测试(test)。使用训练数据集来训练模型,使用验证数据集跟踪模型在训练期间…

安全防御拓扑1

目录 实验的拓扑: 要求: 我搭建的实验拓扑 步骤: 创建vlan: 接口配置: 防火墙: 防火墙配置: 建立安全策略: 防火墙的用户: 办公区的市场部和研发部用户 市场部…

杰发科技AC7801 —— __attribute__指定地址存储常量

const uint8_t usFlashInitVal[] __attribute__((at(0x08002800))) {0x55,0x55,0x55,0x55,0x55};//定位在flash中,0x00030000开始的6个字节信息固定 注意7801的地址在8000000之后 如地址选0x00000800烧录时候报错 不知道是不是atclinktool的bug,使用_…

勒索防御第一关 亚信安全AE防毒墙全面升级 勒索检出率提升150%

亚信安全信舷AE高性能防毒墙完成能力升级,全面完善勒索边界“全生命周期”防御体系,筑造边界勒索防御第一关! 勒索之殇,银狐当先 当前勒索病毒卷携着AI技术,融合“数字化”的运营模式,形成了肆虐全球的网…

数据结构(4.4)——求next数组

next数组的作用:当模式串的第j个字符失配时,从模式串的第next[j]的继续往后匹配 求模式串的next数组(手算) next[1] 任何模式串都一样,第一个字符不匹配时,只能匹配下一个子串,因此,往后,next[1]都无脑写…

Classifier-Free Guidance (CFG) Scale in Stable Diffusion

1.Classifier-Free Guidance Scale in Stable Diffusion 笔记来源: 1.How does Stable Diffusion work? 2.Classifier-Free Diffusion Guidance 3.Guide to Stable Diffusion CFG scale (guidance scale) parameter 1.1 Classifier Guidance Scale 分类器引导是…

达梦数据库的系统视图v$dict_cache_item

达梦数据库的系统视图v$dict_cache_item 在达梦数据库(DM Database)中,V$DICT_CACHE_ITEM 是一个系统视图,用于显示字典缓存(Dictionary Cache)中的项信息。字典缓存是数据库中的一个重要组件,…