Selenium+Tesseract

网友投稿 820 2022-12-04

Selenium+Tesseract

Selenium+Tesseract

目录1.项目需求描述2.整体思路3.功能实现

1.项目需求描述

通过订单号获取某系统内订单的详细数据,不需要账号密码的登录验证,但有图片验证码的动态识别,将获取到的数据存到数据库。

2.整体思路

1.通过Selenium技术,无窗口模式打开浏览器

2.在输入框中动态输入订单号

3.将图片验证码截图保存到本地

4.通过Tesseract-OCR技术去本地识别验证码转化为文字

5.将获取的验证码输入输入框

6.点击查询获取列表数据

3.功能实现

1.-并安装Google浏览器,安装Google驱动chromedriver.exe,获取安装路径,配置在项目中

2.使用Selenium进行浏览器操作

System.setProperty(浏览器驱动, 浏览器驱动安装位置);

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(爬取网站URL);

driver.manage().window().setSize(new Dimension(450, 260)); // 设置游览器打开后调整大小

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数据

WebElement addButton = driver.findElement(By.id(SELECT_BUTTON));

addButton.click();

List tRCollection = driver.findElement(By.id(TABLE_ID)).findElements(By.tagName("tr"));

for (int t = 1; t < tRCollection.size(); t++) {

List tDCollection = tRCollection.get(t).findElements(By.tagName("td"));

VipLogisticsMinHangDetailVo minHangDetailVo = new VipLogisticsMinHangDetailVo();

minHangDetailVo.setLogistics_number(code);

http:// 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));

//创建全屏截图

WrapsDriver wrapsDriver = (WrapsDriver) element;

File screen = ((TakesScreenshot) wrapsDriver.getWrappedDriver()).getScreenshotAs(OutputType.FILE);

try {

BufferedImage image = ImageIO.read(screen);

//创建一个矩形使用上面的高度,和宽度

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;

}

综上,该网页的数据就可以获取了。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:2021年小程序白皮书发布:小程序生态能力全面爆发!微信小程序生态
下一篇:五个点告诉你金融小程序的优势,工银微金融小程序
相关文章

 发表评论

暂时没有评论,来抢沙发吧~