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

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

使用 chromedriver 实现网络爬虫【手抄】的更多相关文章

  1. [原创]手把手教你写网络爬虫(5):PhantomJS实战

    手把手教你写网络爬虫(5) 作者:拓海 摘要:从零开始写爬虫,初学者的速成指南! 封面: 大家好!从今天开始,我要与大家一起打造一个属于我们自己的分布式爬虫平台,同时也会对涉及到的技术进行详细介绍.大 ...

  2. Python3 网络爬虫(请求库的安装)

    Python3 网络爬虫(请求库的安装) 爬虫可以简单分为几步:抓取页面,分析页面和存储数据 在页面爬取的过程中我们需要模拟浏览器向服务器发送请求,所以需要用到一些python库来实现HTTP的请求操 ...

  3. Python3之网络爬虫<0>初级

    由于Python3合并URLib与URLlib2统一为URLlib,Python3将urlopen方法放在了urllib.request对象下. 官方文档:https://docs.python.or ...

  4. python网络爬虫之自动化测试工具selenium[二]

    目录 前言 一.获取今日头条的评论信息(request请求获取json) 1.分析数据 2.获取数据 二.获取今日头条的评论信息(selenium请求获取) 1.分析数据 2.获取数据 房源案例(仅供 ...

  5. Python3网络爬虫开发实战PDF高清完整版免费下载|百度云盘

    百度云盘:Python3网络爬虫开发实战高清完整版免费下载 提取码:d03u 内容简介 本书介绍了如何利用Python 3开发网络爬虫,书中首先介绍了环境配置和基础知识,然后讨论了urllib.req ...

  6. Python初学者之网络爬虫(二)

    声明:本文内容和涉及到的代码仅限于个人学习,任何人不得作为商业用途.转载请附上此文章地址 本篇文章Python初学者之网络爬虫的继续,最新代码已提交到https://github.com/octans ...

  7. 网络爬虫:使用Scrapy框架编写一个抓取书籍信息的爬虫服务

      上周学习了BeautifulSoup的基础知识并用它完成了一个网络爬虫( 使用Beautiful Soup编写一个爬虫 系列随笔汇总 ), BeautifulSoup是一个非常流行的Python网 ...

  8. 网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(3): 抓取amazon.com价格

    通过上一篇随笔的处理,我们已经拿到了书的书名和ISBN码.(网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(2): 抓取allitebooks.com书籍信息 ...

  9. 网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(2): 抓取allitebooks.com书籍信息及ISBN码

    这一篇首先从allitebooks.com里抓取书籍列表的书籍信息和每本书对应的ISBN码. 一.分析需求和网站结构 allitebooks.com这个网站的结构很简单,分页+书籍列表+书籍详情页. ...

  10. 网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(1): 基础知识Beautiful Soup

    开始学习网络数据挖掘方面的知识,首先从Beautiful Soup入手(Beautiful Soup是一个Python库,功能是从HTML和XML中解析数据),打算以三篇博文纪录学习Beautiful ...

随机推荐

  1. DeepSeek+PageAssist实现本地大模型联网

    技术背景 在前面的几篇博客中,我们分别介绍过在Ubuntu上部署DeepSeek.在Windows上部署DeepSeek.使用AnythingLLM构建本地知识库的方法,其中还包含了ChatBox的基 ...

  2. 工业机器人维修保养|ABB机器人IRB 6700维修保养技巧

    通过机器人维修保养服务定制合理的维修保养工作,可以确保ABB机器人IRB 6700的持续稳定运行,延长其使用寿命,为企业的生产提供有力保障. 一.ABB机器人IRB 6700日常检查与维护 外观检查: ...

  3. 【软件开发】CMake学习笔记

    [软件开发]CMake 学习笔记 CMake 是什么? 是构建系统(如 Visual Studio)的文件(如 .vcxproj .sln)的创建器,具体要生成的构建系统可以通过 CMakePrese ...

  4. 赛博朋克2077/Cyberpunk 2077 v2.1|整合DLC|容量96.9GB|官方简体中文

    <赛博朋克2077>是知名<巫师>系列开发商CD PROJEKT RED公布的一款角色扮演游戏,故事设定在黑暗的.科技极度发达的腐败未来世界中,并且兼有沙盒元素与RPG机制.游 ...

  5. 有关C++程序设计基础的各种考题解答参考汇总

    早先年考研的主考科目正是[算法与数据结构],复习得还算可以.也在当时[百度知道]上回答了许多相关问题,现把他们一起汇总整理一下,供读者参考. [1] 原题目地址:https://zhidao.baid ...

  6. 机器学习 | 强化学习(3) | 无模型预测(Model-Free Prediction)

    无模型预测(Model-Free Prediction) 无模型预测概论 上一节课<通过DP求解>可以解决一个已知的马尔科夫决策过程 本节课 实践无模型预测 解决或者估计一个未知马尔科夫决 ...

  7. Loongson Log

    就看看能坚持多久吧 22/2/2及以前: 参照想象中的p7内容增添部分版CP0.部分中断/异常机制: 改sram接口:查阅文档func_test.sram相关内容:查阅vivado bram IP核相 ...

  8. 网络虚拟存储 Iscsi实现方案

    网络虚拟存储,通过Iscsi协议可以实现本地挂载磁盘,扩展本机设备存储. Iscsi有以下实现方案,简单介绍下: 1.Powershell 脚本 PowerShell 提供了一些 cmdlet,比如  ...

  9. Kubernetes:根据进程 Pid 获取 Pod 名称

    前言 在管理 Kubernetes 集群的过程中,我们经常会遇到这样一种情况:在某台节点上发现某个进程资源占用量很高,却又不知道是哪个容器里的进程.有没有办法可以根据进程 PID 快速找到 Pod 名 ...

  10. hotmail 获取邮箱授权码

    第一步:登录microsoft账户,进入到安全性页面. https://account.microsoft.com/?lang=zh-CN&refd=account.live.com& ...