使用 chromedriver 实现网络爬虫【手抄】

1、引用 selenium 包

<dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.29.0</version>
</dependency>
<dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-chrome-driver</artifactId><version>4.29.0</version>
</dependency>
<dependency><groupId>org.openqa.selenium</groupId><artifactId>selenium-support</artifactId><version>4.29.0</version>
</dependency>

2、下载 chromedriver

下载地址:https://chromedriver.storage.googleapis.com/index.html

这里引用包支持版本为 114,我下载使用的是 114.0.5734.0,分为 windows版本以及 linux 版本。

114这个版本的 chromedriver 软件将放在源码中供大家学习使用。

3、对应的浏览器下载

由于chromedriver 最新版本为 114所以,最新的 chrome浏览器无法使用只能下载114这个版本chrome浏览器。

linux 下载地址:

https://www.googleapis.com/download/storage/v1/b/chromium-browser-snapshots/o/Linux%2F114059%2Fchrome-linux.zip?generation=1&alt=media

windows下载地址:

https://www.googleapis.com/download/storage/v1/b/chromium-browser-snapshots/o/Win_x64%2F1140629%2Fchrome-win.zip?generation=1683480562257014&alt=media

4、具体现实代码

public static void main(String[] args) throws IOException {// 设置 ChromeDriver 路径System.setProperty("webdriver.chrome.driver", "D:\\Project\\web-crawler\\chromedriver\\chromedriver.exe");// 配置 Chrome 浏览器ChromeOptions options = new ChromeOptions();// 如果不想显示浏览器界面
//    options.addArguments("--headless");// 设置启动时最大化浏览器窗口options.addArguments("--start-maximized");// 指定浏览器位置options.setBinary("D:\\Project\\web-crawler\\chrome-windows\\chrome.exe");WebDriver driver = new ChromeDriver(options);driver.get("http://182.131.3.xxx:8000/noticerpt/user/popup_login");// 显式等待,确保登录页面加载完成WebDriverWait loginWait = new WebDriverWait(driver, Duration.ofSeconds(30));// 获取背景图和拼图块// 拼图背景图WebElement button = loginWait.until(ExpectedConditions.presenceOfElementLocated(By.className("button4")));button.click();WebElement automv = loginWait.until(ExpectedConditions.presenceOfElementLocated(By.id("automv_1")));WebElement aBtn = automv.findElement(By.tagName("a"));aBtn.click();// 拼图块WebElement nav = driver.findElement(By.id("nav"));List<WebElement> elementList = nav.findElements(By.tagName("li"));WebElement navLi = elementList.get(1);WebElement navLiA = navLi.findElement(By.tagName("a"));navLiA.click();WebElement smsLoginFormsc = driver.findElement(By.id("smsLoginFormsc"));WebElement embedCaptchaSms = smsLoginFormsc.findElement(By.id("embed-captcha-sms"));WebElement gtSlider = embedCaptchaSms.findElement(By.className("gt_slider"));WebElement gtSliderKnob = gtSlider.findElement(By.className("gt_slider_knob"));new Actions(driver).moveToElement(gtSliderKnob).perform();//    WebElement gtWidget = smsLoginFormsc.findElement(By.className("gt_widget"));
//    WebElement gtWidget = smsLoginFormsc.findElement(By.className("gt_widget"));
//    WebElement gtWidget = smsLoginFormsc.findElement(By.className("gt_widget"));// 获取拼图块的位置
//    Point sliderPosition = slider.getLocation();
//    System.out.println("拼图块的初始位置: " + sliderPosition);//    // 计算缺失的拼图块位置(假设通过图像处理得出:x = 200, y = 0)
//    int targetX = 200;
//    int targetY = 0;
//    String imageUrl = backgroundElement.getAttribute("src");
//    BufferedImage background = ImageIO.read(new URL(imageUrl));
//    imageUrl = puzzlePieceElement.getAttribute("src");
//    BufferedImage puzzlePiece = ImageIO.read(new URL(imageUrl));
//
//    // 比较两张图片的差异
//    int diffX = 0;
//    int diffY = 0;
//
//    for (int y = 0; y < background.getHeight(); y++) {
//      for (int x = 0; x < background.getWidth(); x++) {
//        int bgPixel = background.getRGB(x, y);
//        int puzzlePixel = puzzlePiece.getRGB(x, y);
//
//        if (bgPixel != puzzlePixel) {
//          diffX = x;
//          diffY = y;
//          break;
//        }
//      }
//    }// 获取拼图块的当前位置
//    Point start = slider.getLocation();//    // 模拟滑动拼图块
//    Actions actions = new Actions(driver);
//    actions.clickAndHold(slider)
//        .moveByOffset(targetX - start.getX(), targetY - start.getY())
//        .release()
//        .perform();// 等待拼图验证完成
//    WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
//    wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("success-message")));
//
//    System.out.println("拼图解锁成功!");// 关闭浏览器
//    driver.quit();}

以上代码主要就是实现关闭弹窗、显示滑动拼图验证码。其中代码 

http://182.131.3.xxx:8000/noticerpt/user/popup_login  xxx 为了安逸将最后一段修改为了XXX根据逻辑可以修改为自己的业务需求

5、总结

只是个人作为研究的手抄还是有很多不足,而且具体逻辑也没有写(但是会持续的更新)

6、代码

爬虫代码:维基框架/wiki-web-crawler

如果觉得还不错误,请支持一下作者开源框架 维基框架  维基代理

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

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

相关文章

Python项目--基于Python的自然语言处理文本摘要系统

1. 项目概述 自然语言处理(NLP)是人工智能领域中一个重要的研究方向&#xff0c;而文本摘要作为NLP的一个重要应用&#xff0c;在信息爆炸的时代具有重要意义。本项目旨在开发一个基于Python的文本摘要系统&#xff0c;能够自动从长文本中提取关键信息&#xff0c;生成简洁而全…

【Vue #3】指令补充样式绑定

一、指令修饰符 Vue 的指令修饰符&#xff08;Directive Modifiers&#xff09;是 Vue 模板语法中的重要特性&#xff0c;它们以半角句号 . 开头&#xff0c;用于对指令的绑定行为进行特殊处理 修饰符作用如下&#xff1a; 简化事件处理&#xff08;如阻止默认行为、停止冒泡…

Reinforcement Learning强化学习--李宏毅机器学习笔记

个人学习笔记&#xff0c;如有错误欢迎指正&#xff0c;也欢迎交流&#xff0c;其他笔记见个人空间 强化学习 vs 监督学习 监督学习&#xff08;Supervised Learning&#xff09;&#xff1a;你有输入和明确的输出标签&#xff0c;例如图像分类。 强化学习&#xff08;Rein…

Windows VsCode Terminal窗口使用Linux命令

背景描述&#xff1a; 平时开发环境以Linux系统为主&#xff0c;有时又需要使用Windows系统下开发环境&#xff0c;为了能像Linux系统那样用Windows VsCode&#xff0c;Terminal命令行是必不可少内容。 注&#xff1a;Windows11 VsCode 1.99.2 下面介绍&#xff0c;如何在V…

软件测试之测试数据生成(Excel版)

这是Excel生成测试数据的函数使用 1.时间 1.1.时间 例生成2022-05-01之前一年内任意时间点: =TEXT("2022-05-01"-RAND()-RANDBETWEEN(1,365),"yyyy-mm-dd hh:mm:ss")1.2.年月日 yyyy-mm-dd 以当前时间生成10年的日期 =TEXT(NOW()-RAND()-RANDBETWE…

libwebsocket建立服务器需要编写LWS_CALLBACK_ADD_HEADERS事件处理

最近在使用libwebsocket&#xff0c;感觉它搭建Http与websocket服务器比较简单&#xff0c;不像poco库那么庞大&#xff0c;但当我使用它建立websocket服务器后&#xff0c;发现websocket客户端连接一直没有连接成功&#xff0c;不知道什么原因&#xff0c;经过一天的调试&…

从 PyTorch 到 ONNX:深度学习模型导出全解析

在模型训练完毕后&#xff0c;我们通常希望将其部署到推理平台中&#xff0c;比如 TensorRT、ONNX Runtime 或移动端框架。而 ONNX&#xff08;Open Neural Network Exchange&#xff09;正是 PyTorch 与这些平台之间的桥梁。 本文将以一个图像去噪模型 SimpleDenoiser 为例&a…

Hadoop集群部署教程-P6

Hadoop集群部署教程-P6 Hadoop集群部署教程&#xff08;续&#xff09; 第二十一章&#xff1a;监控与告警系统集成 21.1 Prometheus监控体系搭建 Exporter部署&#xff1a; # 部署HDFS Exporter wget https://github.com/prometheus/hdfs_exporter/releases/download/v1.1.…

【Altium】AD-生成PDF文件图纸包含太多的空白怎么解决

1、 文档目标 AD设计文件导出PDF时&#xff0c;图纸模板方向设置问题 2、 问题场景 AD使用Smart PDF导出PDF时&#xff0c;不管你怎么设置页面尺寸&#xff0c;只要从横向转为纵向输出&#xff0c;输出的始终是横向纸张&#xff08;中间保留纵向图纸&#xff0c;两边大量留白…

大厂面试:六大排序

前言 本篇博客集中了冒泡&#xff0c;选择&#xff0c;二分插入&#xff0c;快排&#xff0c;归并&#xff0c;堆排&#xff0c;六大排序算法 如果觉得对你有帮助&#xff0c;可以点点关注&#xff0c;点点赞&#xff0c;谢谢你&#xff01; 1.冒泡排序 //冒泡排序&#xff…

大模型开发:源码分析 Qwen 2.5-VL 视频抽帧模块(附加FFmpeg 性能对比测试)

目录 qwen 视频理解能力 messages 构建 demo qwen 抽帧代码分析 验证两个实际 case 官网介绍图 性能对比&#xff1a;ffmpeg 抽帧、decord 库抽帧 介绍 联系 对比 测试结果 测试明细 ffmpeg 100 qps 测试&#xff08;CPU&#xff09; decord 100 qps 测试&#x…

git的上传流程

好久没使用git 命令上传远程仓库了。。。。。温习了一遍&#xff1b; 几个注意点--单个文件大小不能超过100M~~~ 一步步运行下面的命令&#xff1a; 进入要上传的文件夹内&#xff0c;点击git bash 最终 hbu的小伙伴~有需要nndl实验的可以自形下载哦

驱动学习专栏--字符设备驱动篇--2_字符设备注册与注销

对于字符设备驱动而言&#xff0c;当驱动模块加载成功以后需要注册字符设备&#xff0c;同样&#xff0c;卸载驱动模 块的时候也需要注销掉字符设备。字符设备的注册和注销函数原型如下所示 : static inline int register_chrdev(unsigned int major, const char *name, const…

redis 放置序列化的对象,如果修改对象,需要修改版本号吗?

在 Redis 中存储序列化对象时,如果修改了对象的类结构(例如增删字段、修改字段类型或顺序),是否需要修改版本号取决于序列化协议的兼容性策略和业务场景的容错需求。以下是详细分析: 1. 为什么需要考虑版本号? 序列化兼容性问题: 当对象的类结构发生变化时,旧版本的序列…

WPF ObjectDataProvider

在 WPF(Windows Presentation Foundation)中,ObjectDataProvider 是一个非常有用的类,用于将非 UI 数据对象(如业务逻辑类或服务类)与 XAML 绑定集成。它允许在 XAML 中直接调用方法、访问属性或实例化对象,而无需编写额外的代码。以下是关于 ObjectDataProvider 的详细…

深度学习-损失函数 python opencv源码(史上最全)

目录 定义 种类 如何选择损失函数&#xff1f; 平方&#xff08;均方&#xff09;损失函数&#xff08;Mean Squared Error, MSE&#xff09; 均方根误差 交叉熵 对数损失 笔记回馈 逻辑回归中一些注意事项&#xff1a; 定义 损失函数又叫误差函数、成本函数、代价函数…

poll为什么使用poll_list链表结构而不是数组 - 深入内核源码分析

一&#xff1a;引言 在Linux内核中,poll机制是一个非常重要的I/O多路复用机制。它允许进程监视多个文件描述符,等待其中任何一个进入就绪状态。poll的内部实现使用了poll_list链表结构而不是数组,这个设计选择背后有其深层的技术考量。本文将从内核源码层面深入分析这个设计决…

使用 Azure AKS 保护 Kubernetes 部署的综合指南

企业不断寻求增强其软件开发和部署流程的方法。DevOps 一直是这一转型的基石,弥合了开发与运营之间的差距。然而,随着安全威胁日益复杂,将安全性集成到 DevOps 流水线(通常称为 DevSecOps)已变得势在必行。本指南深入探讨了如何使用 Azure Kubernetes 服务 (AKS) 来利用 D…

2025年常见渗透测试面试题-webshell免杀思路(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 webshell免杀思路 PHP免杀原理 webshell免杀测试&#xff1a; webshell免杀绕过方法&#xff1a; 编…

访问不到服务器上启动的llamafactory-cli webui

采用SSH端口转发有效&#xff0c;在Windows上面进行访问 在服务器上启动 llamafactory-cli webui 后&#xff0c;访问方式需根据服务器类型和网络环境选择以下方案&#xff1a; 一、本地服务器&#xff08;物理机/虚拟机&#xff09; 1. 直接访问 若服务器与操作设备处于同一…