如何在 Puppeteer 中运行无头浏览器?

什么是无头浏览器?

我们都知道,用户界面(UI)是任何软件中最重要的部分。因此,“无头浏览器”的“无头”部分意味着它们确实缺少一个关键元素,即图形用户界面(GUI)。

这意味着浏览器本身可以在后台正常运行(联系目标网站、上传/下载文档、呈现信息等),但你看不到任何东西。

相反,软件测试工程师更喜欢使用像“命令行”这样的界面,其中命令作为文本行处理。

如何检测无头Chrome?

无头浏览器示例

  • Headlesschrome
  • Chromium
  • Firefox Headless
  • HTML Unit
  • Apple Safari (Webkit)
  • Zombie.JS
  • PhantomJS
  • Splash

为什么Puppeteer最适合网页抓取?

Puppeteer是Google开发的一个开源Node.js库,提供了控制无头Chrome或Chromium浏览器的高级API。以下7个优势说明了为什么开发人员更喜欢使用它进行网页抓取。

1. 无头Chrome自动化

Puppeteer操作无头版的Google Chrome,这意味着它可以在没有图形用户界面的情况下运行。这允许更快、更高效的抓取,因为它减少了与渲染完整浏览器窗口相关的开销。

2. JavaScript执行

许多现代网站严重依赖JavaScript动态加载内容。传统的抓取工具通常难以处理此类网站。然而,Puppeteer可以像真实浏览器一样执行JavaScript,确保所有动态内容完全加载并可供抓取。

3. 高质量API

Puppeteer提供了高质量的API,可以精确控制浏览器。这包括点击按钮、填写表单和在页面之间导航等操作,这些对于抓取复杂网站至关重要。

4. 自动截图

Puppeteer的一个功能是能够自动截图。这对于调试和验证内容是否正确加载非常有用,然后进行抓取。

5. 跨浏览器测试

Puppeteer支持跨浏览器测试,这意味着你可以在不同的浏览器(如Chrome和Firefox)上测试和抓取网站。这种灵活性确保你的抓取脚本稳健并能处理各种网络环境。

6. 社区和扩展

Puppeteer拥有强大的社区,并与TeamCity、Jenkins和TravisCI等其他工具有良好集成。这使得更容易找到支持和增强抓取任务的扩展。

7. 模拟真实用户交互

Puppeteer可以模拟真实用户交互,例如鼠标移动和键盘输入。这使得网站更难检测和阻止抓取活动,因为这些交互看起来更像是人类行为。

如何使用Puppeteer抓取网站?

现在,我将向你展示如何使用Nstbrowserles完成抓取!

让我们以抓取TikTok首页Explore页面上的视频链接地址为例具体说明:

你可能还喜欢: 如何使用Playwright抓取头像。

第一步 页面分析

我们需要:

  1. 进入TikTok首页。
  2. 打开控制台元素页面并定位Explore页面元素。此元素是具有data-e2e="nav-explore"属性的a链接元素标签。

点击上面的元素进入预览页面以进行进一步分析。

我们可以发现我们想要的目标数据属于具有data-e2e="explore-item-list"属性的列表元素下的一个div元素项。

每个视频元素由data-e2e="explore-item"表示,我们想要的视频链接是其下的div a链接标签的href属性值。

成功定位到我们需要的元素后,我们可以进入抓取过程:

第二步 使用Nstbrowserless,你必须预先安装并运行Docker。

# 拉取镜像
docker pull nstbrowser/browserless:0.0.1-beta
# 运行nstbrowserless
docker run -it -e TOKEN=xxx -e SERVER_PORT=8848 -p 8848:8848 --name nstbrowserless nstbrowser/browserless:0.0.1-beta

第三步 编码 (Python-Pyppeteer)

现在我们需要设置Nstbrowser为无头模式

import json
from urllib.parse import urlencode
from pyppeteer import launcherasync def main():config = {"once": True,"headless": True,  # 支持:true或false"autoClose": True,"args": ["--disable-gpu", "--no-sandbox"],  # 浏览器参数应为列表"fingerprint": {"name": 'tiktok_scraper',"platform": 'windows',  # 支持:windows, mac, linux"kernel": 'chromium',  # 仅支持:chromium"kernelMilestone": '120',"hardwareConcurrency": 8,  # 支持:2, 4, 8, 10, 12, 14, 16"deviceMemory": 8,  # 支持:2, 4, 8},}query = {'config': json.dumps(config)}browser = await launcher.connect(browserWSEndpoint=f"ws://127.0.0.1:8848/ws/connect?{urlencode(query)}")page = await browser.newPage()await page.goto('chrome://version')await page.screenshot({'path': 'chrome_version.png'})await browser.close()if __name__ == "__main__":import asyncioasyncio.run(main())

运行上述代码后,你可以在chrome://version页面上看到以下信息:

在内核启动命令中添加--headless参数表示内核以无头模式运行。

整体代码展示:

import json
from urllib.parse import urlencode
from pyppeteer import launcherasync def main():config = {"once": True,"headless": True,  # 支持:true或false"autoClose": True,"args": ["--disable-gpu", "--no-sandbox"],  # 浏览器参数应为列表"fingerprint": {"name": 'tiktok_scraper',"platform": 'windows',  # 支持:windows, mac, linux"kernel": 'chromium',  # 仅支持:chromium"kernelMilestone": '120',"hardwareConcurrency": 8,  # 支持:2, 4, 8, 10, 12, 14, 16"deviceMemory": 8,  # 支持:2, 4, 8},"proxy": "",  # 如果你无法浏览TikTok网站,请设置适当的代理}query = {'config': json.dumps(config)}browser = await launcher.connect(browserWSEndpoint=f"ws://127.0.0.1:8848/ws/connect?{urlencode(query)}")try:# 创建新页面page = await browser.newPage()await page.goto("https://www.tiktok.com/")await page.waitForSelector('[data-e2e="nav-explore"]', {'timeout': 30000})explore_elem = await page.querySelector('[data-e2e="nav-explore"]')if explore_elem:await explore_elem.click()await page.waitForSelector('[data-e2e="explore-item-list"]', {'timeout': 30000})ul_element = await page.querySelector('[data-e2e="explore-item-list"]')if ul_element:li_elements = await ul_element.querySelectorAll('div')hrefs = []for li in li_elements:a_element = await li.querySelector('[data-e2e="explore-item"] div a')if a_element:href = await page.evaluate('(element) => element.getAttribute("href")', a_element)if href:print(href)hrefs.append(href)# TODOfinally:await browser.close()if __name__ == "__main__":import asyncioasyncio.run(main())

抓取结果:

到目前为止,我们已经完成了使用Nstbrowserless抓取TikTok视频链接的操作。获得链接后,你可以进一步完成你想要的操作,例如存储、下载视频或重定向播放。

无头Chrome总是好吗?

虽然无头浏览器在网页抓取和自动化中非常重要,但实际上它并非全都是优点。在使用之前请仔细考虑以下优缺点:

优点:

  1. 无头Chrome在从目标网站提取特定数据点(例如竞争对手产品定价)时更高效。
  2. 无头浏览器比常规浏览器更快——它们加载CSS和JavaScript的速度更快,并且不需要打开和渲染HTML。
  3. 无头浏览器为开发人员节省时间,例如在执行单元测试代码更改(移动和桌面)时,可以使用命令行完成。

缺点:

  1. 无头浏览器操作仅限于后台任务,这意味着它无法解决前端问题(例如生成GUI截图)。
  2. 无头浏览器提高了速度,但有时会有代价,例如调试问题变得更加困难。

重点总结

无头Chrome为网页抓取过程提供了许多好处,只需几行代码即可实现抓取和自动化。它最小化内存使用,完美处理JavaScript,并在无GUI环境中运行。

在本指南中,你学习了:

  1. 什么是无头浏览器?
  2. Puppeteer用于网页抓取的优势
  3. Puppeteer网页抓取的详细步骤

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

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

相关文章

探索.NET内存之海:垃圾回收的艺术与实践

简述 在.NET的广阔天地中,内存管理如同航海中的罗盘,指引着程序的稳健运行和性能的极致优化。作为软件工程师,我们时常在代码的海洋中航行,而内存管理则是确保航程顺畅的关键。本文将带您深入.NET的内存管理世界,一探垃…

webrtc QOS方法十三(视频渲染平滑)

一、背景介绍 视频渲染时间的确定需要考虑三方面的因素:网络抖动、网络延时、音视频同步 网络抖动:视频帧在网络上传输,会受到网络抖动的影响,不能收到立刻播放,需要进行适当的平滑 网络延时:一些报文在…

mysql8和mysql5版本在使用mybatis框架时的注意事项

mysql8和mysql5版本在使用mybatis框架时有些注意事项,两者的区别在于两处地方的设置。有一处未设置好,就会出现以下错误:java.sql.SQLException: Error setting driver on UnpooledDataSource. Cause: java.lang.ClassNotFoundException: Can…

基于深度学习的车距检测系统

1. 引言 详细内容: 车距检测在自动驾驶和驾驶辅助系统中具有重要意义,可以帮助避免车辆碰撞事故,提升驾驶安全性。YOLO(You Only Look Once)系列模型在实时目标检测中表现优异,可以用于车距检测任务。本文…

docker 安装并测试(Ubuntu下)

1. 确认安装环境(操作系统版本和 CPU 架构) 2. 如果有旧版本的 docker 需要进行卸载 使用 docker 命令检查是否已经安装了 docker 如果 docker 已经安装,使用以下命令卸载: apt-get purge docker-ce docker-ce-cli containerd…

@RequestBody接收到的参数中如何限制List的长度?

在Spring MVC中,你可以使用Valid注解和自定义的验证注解来限制List的长度,防止DOS攻击。具体步骤如下: 创建自定义注解:首先,创建一个自定义注解来验证List的长度。 import javax.validation.Constraint; import jav…

力扣3202:找出有效子序列的最大长度||

class Solution { public:int maximumLength(vector<int>& nums, int k) {int res0;for(int m0;m<k;m){//假设子序列两数%k之后的结果为m 相当于枚举vector<int> v(k,0);for(auto num:nums){v[num%k]v[(m-num%kk)%k]1; //知道m之后可以知道需要的子序列当前…

maven内网依赖包编译报错问题的一种解决方法

背景 外网开发时可以连接互联网&#xff0c;所以编译没有什么问题&#xff0c;但是将数据库、代码、maven仓库全部拷贝到内网&#xff0c;搭建内网环境之后&#xff0c;编译失败。 此依赖包的依赖层级图 maven镜像库配置使用拷贝到内网的本地库&#xff0c;配置如下&#xff…

【Linux】Linux环境设置环境变量操作步骤

Linux环境设置环境变量操作步骤 在一些开发过程中本地调试经常需要依赖环境变量的参数&#xff0c;但是怎么设置对小白来说有点困难&#xff0c;今天就介绍下具体的操作步骤&#xff0c;跟着实战去学习&#xff0c;更好的检验自己的技术水平&#xff0c;做技术还是那句话&…

【iOS】——内存对齐

内存对齐是什么 内存对齐指的是数据在内存中的布局方式&#xff0c;它确保每个数据类型的起始地址能够满足该类型对齐的要求。这是因为现代处理器在访问内存时&#xff0c;如果数据的起始地址能够对齐到一定的边界&#xff0c;那么访问速度会更快。这种对齐通常是基于数据类型…

BUUCTF逆向wp [MRCTF2020]Transform

第一步 查壳。该题为64位。 第二步 进入主函数&#xff0c;跟进dword_40F040,它应该与关键字符串有关 分析一下&#xff1a; 初始化和输入 sub_402230(argc, argv, envp); 这行可能是一个初始化函数&#xff0c;用于设置程序环境或处理命令行参数。具体功能不明&#xff0c…

高性能、安全、低碳绿色的趋势下,锐捷网络发布三擎云办公解决方案 3.0

桌面虚拟化作为云时代的主流和热门技术&#xff0c;已经取得了广泛应用。随着生成式 AI 爆炸式发展&#xff0c;CSDN 看到&#xff0c;人工智能正在引发计算、开发、交互三大范式的全面升级&#xff0c;技术开发或将迎来一次全新的科技变革周期&#xff0c;因此 VDI 云桌面随之…

C#语法基础详解(万字总结)

文章目录 **参考书籍&#xff1a;C#7.0 核心技术指南**类型类字段解构器对象初始化器属性表达式属性(只读属性才可以)自动属性属性初始化器 索引器静态构造器nameof运算符 继承类型转换和引用转换as运算符is运算符is与模式变量 虚函数成员抽象类和抽象成员new和重写base关键字构…

Android C++系列:Linux线程(四)线程同步

多个线程同时访问共享数据时可能会冲突,这跟我们前面信号文章所说的可重入性是同样的问题。比如两个线程都要把某个全局变量增加1,这个操作在某平台需要三条指令完成: 从内存读变量值到寄存器;寄存器的值加1;将寄存器的值写回内存假设两个线程在多处理器平台上同时执行这三…

JavaSE学习复习题总结

一.什么是继承与多态&#xff1f; 1.继承 2.多态多态是面向对象编程的另一个核心特性&#xff0c;它允许我们以统一的接口处理不同的对象。在Java中&#xff0c;多态通常通过方法的重写&#xff08;Override&#xff09;和重载&#xff08;Overload&#xff09;以及接口&#…

【linux】Shell脚本中While循环的详细用法教程

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

AWS backup服务和 RDS snapshot的关系

首先&#xff0c;其实RDS的snapshot&#xff0c;自动备份和手动备份&#xff0c;就是调用的AWS backup服务&#xff0c;只不过是通过RDS控制台&#xff0c;API等等进行控制和管理的。 1. AWS backup 服务对于RDS的备份来说包括两部分&#xff1a; --连续备份&#xff08;需要…

排序系列 之 选择排序

&#xff01;&#xff01;&#xff01;排序仅针对于数组哦本次排序是按照升序来的哦 介绍 快速排序英文名为SelectSort从数组中找到最小的放到前边 基本思路 1、默认待排序数组中第一个作为最小值2、找待排序数组&#xff08;注意不是整个数组哦&#xff09;中真正的最小值3…

每天一个数据分析题(四百三十五)- 统计分析

抽样是统计分析中常用的技术手段&#xff0c;现有一抽样的描述&#xff1a;“将总体中的所有单位&#xff08;抽样单位&#xff09;按一定顺序排列&#xff0c;在规定的范围内随机地抽取一个单位作为初始单位&#xff0c;然后按事先规定好的规则确定其它样本单位”&#xff0c;…

AMEYA360:思瑞浦推出汽车级理想二极管ORing控制器TPS65R01Q

聚焦高性能模拟芯片和嵌入式处理器的半导体供应商思瑞浦3PEAK(股票代码&#xff1a;688536)发布汽车级理想二极管ORing控制器TPS65R01Q。 TPS65R01Q拥有20mV正向调节功能&#xff0c;降低系统损耗。快速反向关断(Typ&#xff1a;0.39μs)&#xff0c;在电池反向和各种汽车电气瞬…