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
如果覺得還不錯誤,請支持一下作者開源框架?維基框架? 維基代理