CDP与Selenium相结合——玩转网页端自动化数据采集/爬取程序

news/2025/3/1 7:17:16/文章来源:https://www.cnblogs.com/kaiblog/p/18600539

Selenium

Selenium 是一款开源且可移植的自动化软件测试工具,专门用于测试网页端应用程序或者采集网页端数据。它能够在不同的浏览器和操作系统上运行,具有很强的跨平台能力。Selenium可以帮助测试人员更高效地自动化测试基于Web网页端的应用程序,也可以帮忙开发者方便地完成网页端数据的采集工作。

Chrome Dev Tools

Chrome Dev Tools 是直接内置于 Chrome 浏览器中的调试工具。它为开发人员提供了一整套用于检查、调试、分析和优化 Web 网页端应用程序的工具。下面举例讲述 Chrome Dev Tools 支持的一些功能:

元素选项卡

元素选项卡可以显示当前页面的 DOM 树,使用者也可以通过该功能实时修改当前页面的 DOM 树。举例来讲,我们现在想修改百度搜索按钮背景颜色成红色,我们就可以通过元素选项卡来完成。我们在元素选项卡中选中搜索框的按钮并且将 background-color 样式设置为红色即可,下方截图是实现的效果。

图片 图片

控制台选项卡

控制台选项卡类似于交互式的终端,我们可以在这里看到JavaScript代码打印的日志信息,方便我们定位问题,也可以在这里输入 JavaScript 代码,并且可以让这些代码实时生效,甚至改变原有网页的行为。例如,我们打开某个网站的登录页面并且在控制台选项卡中输入如下的代码:

document.querySelector('button').addEventListener('click', function(){alert("login button is clicked");
});

通过网页中注入上面的代码,我们可以监控到该页面上面所有 button 元素的点击操作,当用户点击登录按钮的时候就会弹窗显示消息“login button is clicked”。具体情形如下图所示:
图片

源代码选项卡

源代码选项卡可以查看完整的网页源代码,对源代码进行单步调试,观察代码的调用堆栈,也可以动态修改代码变量。为了能够更加清晰地说明源代码选项卡的作用,我简单编写了一个 HTML 页面。其内容如下所示:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>example page 1</title>
</head>
<body>
<input type = "button" value = "点击我" onclick = "hello('World')" />  
<script>function hello(name) {  let phrase = `Hello, ${name}!`;  say(phrase);}function say(phrase) {  alert(phrase);}
</script>
</body>
</html>

首先,我们在 Chrome 浏览器中打开上面的网页内容,进入到开发者工具,切换到源代码选项卡,我们会看到下面的视图:
图片
如上图所示,源代码选项卡主要由3个部分组成:

  1. 文件导航窗口:文件导航窗口中列举了整个网页相关的文件列表和路径,主要包括:HTML,JavaScript,CSS 和浏览器扩展插件等。

  2. 代码编辑窗口:源代码选项卡的第二个窗口是一个源代码编辑器,我们可以在这里查看和编辑各个文件的源代码,也可以在这里设置调试断点。

  3. 调试信息窗口:调试信息窗口展示了当前设置的断点信息和调用堆栈信息等。

我们有两种方法可以给当前页面的代码设置断点。

设置断点的第一种方法是在代码编辑窗口中点击对应的行号设置断点。具体视图如下所示:

图片
调试信息窗口中会展示我们设置的所有断点信息。除了设置普通的断点,我们还可以设置条件断点(Conditional Breakpoints)。现在,我们将上图中的第一个断点修改为条件断点,设置只有当 param 变量等于 World 的时候才会触发断点。设置后的效果如下图所示:

图片
设置断点的第二种方式是直接在代码编辑窗口中插入 debugger 命令。具体效果如下图所示:

图片

网络选项卡

通过网络选项卡,我们可以观察到网络流量的情况以及网络的请求和响应。对于爬虫开发者来说,最感兴趣的内容应该是各个文件的具体请求和响应信息。通过网络选项卡,我们会看到浏览器实时发送和接收的每个请求。通过点击每个请求,我们可以可以访问请求和响应的具体信息,cookie 和耗时等。

图片

Chrome DevTools Protocol (CDP)

Chrome DevTools Protocol(CDP)是一套用于与基于Chromium内核浏览器进行通信的 API。它允许开发者通过发送命令和接收事件来与浏览器进行交互,以实现自动化测试、性能分析、调试等功能。CDP 在自动化测试、前端开发和爬虫程序开发等很多领域都发挥着重要的作用。

Chrome 浏览器的开发者将 Chrome DevTools 的功能领域划分为大约50个,每个版本的浏览器支持的功能领域可能会有些许差异。具体的功能领域划分我们可以通过官方文档链接进行查询,https://chromedevtools.github.io/devtools-protocol/。打开浏览器的开发者工具,我们可以开启实验特性下的协议监视器(protocol monitor)功能来查看当前浏览器页面发送的所有 CDP 指令。

Selenium与CDP协议结合使用

在 Selenium 4 框架中,提供了两种与 Chrome Devtools 进行交互的方法,分别是 DevTools.send 方法和 ChromiumDriver.executeCdpCommand 方法。

DevTools 是 Selenium 框架为 CDP 协议编写的一个封装类,它内置了部分 CDP 协议指令。

ChromiumDriver 对象中的 executeCdpCommand 方法则是根据 CDP 协议指令的定义采用更加原始的方式直接向 Chrome 浏览器内核发送 CDP 协议指令。两种发送指令方式的差异性如下图所示:

图片
接下来,我们分别采用DevTools.send方法和ChromiumDriver.sendCdpCommand方法来发送CDP协议指令来展示Selenium与CDP协议是如何结合在一起使用的。

示例1:捕获网络请求数据和网络响应数据

首先,我们来看一看如何使用 DevTools 对象来操作 CDP 协议指令。假设,我们在进行数据采集的时候,希望能够实时记录某一个网站针对特定 URL 的请求数据和响应数据。这个时候,我们可以利用 CDP 协议中的 Network 领域功能来跟踪页面的相关网络活动。要实现捕获网络请求和响应数据的功能,我们首先需要使用 Network.enable 方法来开启页面的网络活动追踪功能,然后监听 Network.requestWillBeSent 事件和 Network.responseReceived 事件。具体代码示例如下所示:

DevTools devTools = chromeDriver.getDevTools();
devTools.createSession();
devTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty()));
ThreadUtils.sleepQuietly(Duration.ofSeconds(5));
devTools.addListener(Network.responseReceived(), response -> {if(response.getResponse().getUrl().contains("token") || response.getResponse().getUrl().contains("userinfo")) {String url = response.getResponse().getUrl();String responseBody = devTools.send(Network.getResponseBody(response.getRequestId())).getBody();System.out.println(String.format("request url & response body: %s, %s", url, responseBody));}
});
chromeDriver.get("https://www.cnblogs.com/");

执行上述代码之后,我们会得到如下所示的打印结果。
图片

示例2:打印网页内容

在第二个示例中,我们采用 executeCdpCommand 方法来直接发送 CDP 指令给浏览器内核。假设我们现在使用的是 v96 版本的 Chrome 浏览器,与该版本浏览器对应的 Selenium DevTools 包装类中并不支持 Page.printToPDF 的 CDP 协议指令,这样我们就不得不使用 executeCdpCommand 方法来直接发送 CDP 协议指令。

首先,我们打开链接:https://chromedevtools.github.io/devtools-protocol/tot/Page/#method-printToPDF,查看具体的 Page.printToPDF 指令定义。

了解完指令定义之后,我们就可以按照指令定义来编写相关代码,具体代码示例如下所示:

chromeDriver.get("https://www.cnblogs.com/");
Thread.sleep(3000);
Map<String, Object> params = Maps.newHashMap();
params.put("displayHeaderFooter", true);
params.put("paperWidth", 11.0f);
params.put("headerTemplate", "<div style= \"font-size: 8px;\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"url\"></span></div>");
Map<String, Object> response = chromeDriver.executeCdpCommand("Page.printToPDF", params);
Path destination = Paths.get("fullpage-screenshot-chrome.pdf");
Files.write(destination, Base64.getDecoder().decode(response.get("data").toString()));
chromeDriver.quit();

上述代码执行之后,我们会得到一个 PDF 文件。

总结

本文介绍了有关 Chrome DevTools,Chrome DevTools Protocol 以及 Selenium 与 CDP 协议结合应用的一些基本知识。希望它可以您在编写自动化爬取/采集程序的时候帮助到您。

另外,更多有关网络数据采集\爬取、验证码识别和逆向分析等相关知识,可以阅读我最近出版的《Java网络爬虫精解与实践》一书,该书知识结构紧凑,内容覆盖全面。

另外,该书还提供了对应的网络数据采集训练平台:https://benshu.tech/crawler。

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

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

相关文章

记一次TIA V16下面1200PLC硬件编译错误的处理

今天使用TIA V16做了一个CPU 1214C AC/DC/Rly的程序,编译的时候报错如下:双击错误之处也没跳转到出错位置。刚开始以为是不是路径有中文,项目名有中文,后来一想都16版本了,不至于吧? 电脑里面另一个虚拟机里有TIA V17,把项目程序拷贝到那边,打开编译通过了。我估计是固…

转载:【AI系统】AI系统架构的组成

AI 系统组成 如图所示,大致可以将 AI 系统分为以下几个具体的方向:AI 训练与推理框架 AI 框架不仅仅是指如 PyTorch 等训练框架,还包括推理框架。其负责提供用户前端的 AI 编程语言,接口和工具链。负责静态程序分析与计算图构建,编译优化等工作。AI 框架本身通过提供供用户…

转载:【AI系统】AI系统概述与设计目标

AI 系统全栈架构 通过对 AI 的发展、以及模型算法、硬件与数据的趋势介绍,我们已经了解了 AI 系统的重要性。本文将介 AI 系统的设计目标、组成和生态,让读者形成 AI 系统的知识体系,为后续展开每篇文章的内容做好铺垫。 AI 系统设计本身需要各个环节通盘考量,无论是系统性…

转载:【AI系统】AI 发展驱动力

AI 起源于上世纪五十年代,经历了几次繁荣与低谷,直到 2016 年谷歌旗下的 DeepMind 发布 AlphaGo 程序赢得与世界围棋冠军的比赛,大众对 AI 的关注与热情被重新点燃。其实 AI 技术早在这个标志事件之前已经在工业界很多互联网公司中得到了广泛应用与部署。例如,搜索引擎服务…

转载:【AI系统】昇腾数据布局转换

NHWC 的数据排布方式更适合多核 CPU 运算, NCHW 的数据排布方式更适合 GPU 并行运算。那么接下来让我们了解一下在华为昇腾的 NPU 中,这种特征图的存储方式。截止到 2024 年,华为昇腾在私有格式的数据处理和特殊的数据形态越来越少,主要是得益于 AI 编译器和软件的迭代升级…

转载:【AI系统】AI的领域、场景与行业应用

AI 的历史与现状 本文将介绍 AI 的由来、现状和趋势,让大家能够了解 AI 应用的由来与趋势,为后面理解 AI 系统的设计形成初步的基础。在后面文章介绍的人工智能系统(AI System)奠定基础,值得注意的是,这些系统设计原则大部分也适合于机器学习系统(ML System)。 因为系统…

转载:【AI系统】分布式通信与 NVLink

在进入大模型时代后,大模型的发展已成为 AI 的核心,但训练大模型实际上是一项比较复杂的工作,因为它需要大量的 GPU 资源和较长的训练时间。 此外,由于单个 GPU 工作线程的内存有限,并且许多大模型的大小已经超出了单个 GPU 的范围。所以就需要实现跨多个 GPU 的模型训练,…

转载:【AI系统】NVLink 原理剖析

随着 AI 技术的飞速发展,大模型的参数量已经从亿级跃升至万亿级,这一变化不仅标志着 AI 的显著提升,也对支持这些庞大模型训练的底层硬件和网络架构提出了前所未有的挑战。为了有效地训练这些复杂的模型,需要依赖于大规模的 GPU 服务器集群,它们通过高速网络相互连接,以便…

转载:【AI系统】代数简化

代数简化(Algebraic Reduced)是一种从数学上来指导我们优化计算图的方法。其目的是利用交换率、结合律等规律调整图中算子的执行顺序,或者删除不必要的算子,以提高图整体的计算效率。 代数化简可以通过子图替换的方式完成,具体实现:1)可以先抽象出一套通用的子图替换框架…

转载:【AI系统】死代码消除

死代码消除(Dead Code Elimination)是一种编译器优化技术,旨在删除程序中不会被执行的代码,从而提高程序的执行效率和资源利用率。死代码是指在程序的当前执行路径下不会被访问或执行的代码片段。 传统编译器的死代码消除 死代码消除的目的是删除程序中无用和不可达操作对应…

CTFshow菜狗杯

杂项签到 一张图片直接拖入010,既然是签到就不要想这么多,ctfshow{a62b0b55682d81f7f652b26147c49040} 损坏的压缩包 拖入010是png的头部改掉ctfshow{e19efe2eb86f10ccd7ca362110903c05} 谜之栅栏 两张图片找不同Ltso{06071f997b5bdd1aLcfhwfaab2cb4af5a5820 之后是栅栏解码c…

2024鹏城杯-misc

网安第一课 改zip解压找到key1key2 6iMmn76ucYG9PDtsvu 解压之后上脚本 from PIL import Imageimages = [Image.open(f"{i}.png") for i in range(1, 38)] qr_code = Image.new("RGB", (128, 128), (255, 255, 255)) for i in range(37):img1 = images[i]f…