如何使用Selenium+Tesseract-OCR智能识别验证码爬取网页数据
发表于:2025-02-05 作者:千家信息网编辑
千家信息网最后更新 2025年02月05日,这篇文章将为大家详细讲解有关如何使用Selenium+Tesseract-OCR智能识别验证码爬取网页数据,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.项目需求
千家信息网最后更新 2025年02月05日如何使用Selenium+Tesseract-OCR智能识别验证码爬取网页数据1.项目需求描述
2.整体思路
3.功能实现
这篇文章将为大家详细讲解有关如何使用Selenium+Tesseract-OCR智能识别验证码爬取网页数据,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
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"); // 禁用GPUoptions.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(); ListtRCollection = 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); 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;}
关于"如何使用Selenium+Tesseract-OCR智能识别验证码爬取网页数据"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
验证
数据
图片
输入
浏览器
浏览
地址
错误
智能
元素
截图
模式
篇文章
订单
驱动
网页
动态
技术
更多
订单号
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
珠海电商软件开发定制
仓山区服务器维护
网络安全工程应学哪个专业
东莞市红方网络技术有限公司
服务器安全狗端口设置
数据库数据存放位置
数据文件加载到数据库
网络安全调研心得
国家网络安全知识资料
重庆网络安全工程师怎样报考
河北服务器机柜设计方案
大连广昱软件开发有限公司
汉阳好的软件开发团队
意识形态网络安全讲话
阿里云服务器托管备案
专业数据库营销公司
sql数据库空值怎么写
为网络安全题目的心得题会
宏怎么引入数据库
数据库缓存一致性解决方案
tcl广告服务器地址
百度员工网络安全创业
服务器安全狗端口设置
工程管理Access数据库模板
k8s服务器部署
湖北企业软件开发费用是多少
沈阳互联网软件开发工程师
违反网络安全法的学生事例
闫洪生计算机网络安全与防护
网络安全机考试题