使用 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.pswp.cn/pingmian/77075.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77075.shtml
英文地址,請注明出處:http://en.pswp.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. 直接訪問 若服務器與操作設備處于同一…