Selenium+Tesseract-OCR智能識別驗證碼爬取網(wǎng)頁數(shù)據(jù)的實例
1.項目需求描述
通過訂單號獲取某系統(tǒng)內(nèi)訂單的詳細數(shù)據(jù),不需要賬號密碼的登錄驗證,但有圖片驗證碼的動態(tài)識別,將獲取到的數(shù)據(jù)存到數(shù)據(jù)庫。
2.整體思路
1.通過Selenium技術(shù),無窗口模式打開瀏覽器
2.在輸入框中動態(tài)輸入訂單號
3.將圖片驗證碼截圖保存到本地
4.通過Tesseract-OCR技術(shù)去本地識別驗證碼轉(zhuǎn)化為文字
5.將獲取的驗證碼輸入輸入框
6.點擊查詢獲取列表數(shù)據(jù)
3.功能實現(xiàn)
1.下載并安裝Google瀏覽器,安裝Google驅(qū)動chromedriver.exe,獲取安裝路徑,配置在項目中
2.使用Selenium進行瀏覽器操作
System.setProperty(瀏覽器驅(qū)動, 瀏覽器驅(qū)動安裝位置);
ChromeOptions options = new ChromeOptions();
options.addArguments("--headless"); // 無窗口模式
options.addArguments("--disable-infobars"); // 禁言消息條
options.addArguments("--disable-extensions"); // 禁用插件
options.addArguments("--disable-gpu"); // 禁用GPU
options.addArguments("--no-sandbox"); // 禁用沙盒模式
options.addArguments("--disable-dev-shm-usage");
options.addArguments("--hide-scrollbars"); // 隱藏滾動條
WebDriver driver = new ChromeDriver(options);
driver.get(爬取網(wǎng)站URL);
driver.manage().window().setSize(new Dimension(450, 260)); // 設(shè)置游覽器打開后調(diào)整大小
try {
// 保存IMG圖片到本地
saveImgToLocal(driver);
Thread.sleep(2000);
// OCR智能識別驗證碼
String codeByOCR = getCodeByOCR();
if (codeByOCR != null) {
try {
WebElement input1 = driver.findElement(By.id(TEXTBOX1));
input1.sendKeys(code);
WebElement input2 = driver.findElement(By.id(TEXTBOX2));
input2.sendKeys(codeByOCR);
// 獲取table數(shù)據(jù)
WebElement addButton = driver.findElement(By.id(SELECT_BUTTON));
addButton.click();
List<WebElement> tRCollection = driver.findElement(By.id(TABLE_ID)).findElements(By.tagName("tr"));
for (int t = 1; t < tRCollection.size(); t++) {
List<WebElement> tDCollection = tRCollection.get(t).findElements(By.tagName("td"));
VipLogisticsMinHangDetailVo minHangDetailVo = new VipLogisticsMinHangDetailVo();
minHangDetailVo.setLogistics_number(code);
for (int i = 0; i < tDCollection.size(); i++) {
String text = tDCollection.get(i).getText();
switch (i) {
case 0:
minHangDetailVo.setTime(text);
case 1:
minHangDetailVo.setOutlet(text);
case 2:
minHangDetailVo.setOrganization(text);
case 3:
minHangDetailVo.setEvent(text);
case 4:
minHangDetailVo.setDetail(text);
}
}
list.add(minHangDetailVo);
}
log.info("驗證碼識別成功!");
} catch (Exception e) {
if (e.toString().contains("錯誤提示:驗證碼錯誤或已過期!")) {
log.error("驗證碼識別錯誤!" + e.toString());
} else if (e.toString().contains("錯誤提示:請輸入驗證碼!")) {
log.error("未輸入驗證碼?。? + e.toString());
} else {
log.error("其他異常:" + e.toString());
}
}
}
driver.quit();
} catch (Exception e) {
e.printStackTrace();
}
3.將圖片驗證碼截圖保存到本地(截屏法)
private void saveImgToLocal(WebDriver driver) {
WebElement element = driver.findElement(By.id(img元素ID));
//創(chuàng)建全屏截圖
WrapsDriver wrapsDriver = (WrapsDriver) element;
File screen = ((TakesScreenshot) wrapsDriver.getWrappedDriver()).getScreenshotAs(OutputType.FILE);
try {
BufferedImage image = ImageIO.read(screen);
//創(chuàng)建一個矩形使用上面的高度,和寬度
Point p = element.getLocation();
//元素坐標
BufferedImage img = image.getSubimage(p.getX(), p.getY(), element.getSize().getWidth(), element.getSize().getHeight());
ImageIO.write(img, "png", screen);
FileUtils.copyFile(screen, new File(保存本地地址 + "imgname.png"));
} catch (IOException e) {
e.printStackTrace();
}
}
4.將圖片驗證碼保存到本地(鼠標法)
private static void saveImgToLocal1(WebDriver driver) {
Actions action = new Actions(driver);
action.contextClick(driver.findElement(By.id(img元素ID))).build().perform();
try {
Robot robot = new Robot();
Thread.sleep(1000);
robot.keyPress(KeyEvent.VK_DOWN);
Thread.sleep(1000);
robot.keyPress(KeyEvent.VK_DOWN);
Thread.sleep(1000);
robot.keyPress(KeyEvent.VK_ENTER);
Thread.sleep(1000);
//釋放向下鍵,不然在此之前的條目將起作用
robot.keyRelease(KeyEvent.VK_DOWN);
Thread.sleep(1000);
//運行保存
Runtime.getRuntime().exec(SAVE_IMG_EXE);
Thread.sleep(10000);
} catch (Exception e) {
e.printStackTrace();
}
}
5.對本地驗證碼進行OCR識別
private String getCodeByOCR() {
String result = null;
File file = new File(本地圖片地址);
if (!file.exists()) {
if (systemFalg != 1) {
file.setWritable(true, false);
}
file.mkdirs();
}
File imageFile = new File(本地圖片地址 + "imgname.png");
if (imageFile.exists()) {
ITesseract instance = new Tesseract();
instance.setDatapath(tessdata存放地址);
try {
String doOCR = instance.doOCR(imageFile);
result = replaceBlank(doOCR);
log.info("解析的驗證碼為:{}", result != null ? result : "為空!");
} catch (Exception e) {
e.printStackTrace();
log.error("解析驗證碼異常!");
}
} else {
log.error("解析驗證碼的文件不存在!");
}
return result;
}
綜上,該網(wǎng)頁的數(shù)據(jù)就可以獲取了。
到此這篇關(guān)于Selenium+Tesseract-OCR智能識別驗證碼爬取網(wǎng)頁數(shù)據(jù)的實例的文章就介紹到這了,更多相關(guān)Selenium+Tesseract-OCR智能識別驗證碼爬取 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java使用Tesseract-Ocr識別數(shù)字
- python3使用Pillow、tesseract-ocr與pytesseract模塊的圖片識別的方法
- Python識別快遞條形碼及Tesseract-OCR使用詳解
- Python3.6使用tesseract-ocr的正確方法
- Perl使用Tesseract-OCR實現(xiàn)驗證碼識別教程
- python利用 pytesseract快速識別提取圖片中的文字((圖片識別)
- 使用Python中的pytesseract模塊實現(xiàn)抓取圖片中文字
- opencv+tesseract實現(xiàn)驗證碼識別的示例
- C#使用Tesseract進行Ocr識別的方法實現(xiàn)
- tesseract-ocr使用以及訓練方法
相關(guān)文章
springboot啟動時如何指定spring.profiles.active
這篇文章主要介紹了springboot啟動時如何指定spring.profiles.active問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04
springboot+rabbitmq實現(xiàn)智能家居實例詳解
這篇文章主要為大家介紹了springboot+rabbitmq實現(xiàn)智能家居的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-07-07
SpringCloud Config分布式配置中心使用教程介紹
springcloud config是一個解決分布式系統(tǒng)的配置管理方案。它包含了 client和server兩個部分,server端提供配置文件的存儲、以接口的形式將配置文件的內(nèi)容提供出去,client端通過接口獲取數(shù)據(jù)、并依據(jù)此數(shù)據(jù)初始化自己的應(yīng)用2022-12-12

