千家信息网

如何使用Selenium+Tesseract-OCR智能识别验证码爬取网页数据

发表于:2024-10-05 作者:千家信息网编辑
千家信息网最后更新 2024年10月05日,这篇文章将为大家详细讲解有关如何使用Selenium+Tesseract-OCR智能识别验证码爬取网页数据,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.项目需求
千家信息网最后更新 2024年10月05日如何使用Selenium+Tesseract-OCR智能识别验证码爬取网页数据

这篇文章将为大家详细讲解有关如何使用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();            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);                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安全错误 数据库的锁怎样保障安全 世界服务器数量排行榜 多串口服务器维修 带网络安全模式无法联网 护苗网络安全课视频6 软件开发学校北京 奥特曼王者传奇怎么换服务器 数据库sql等值连接什么意思 悦悦access数据库密码 代表web服务器的字母 网络安全日志的基本要素有 基于数据库管理图片 一伽网络技术有限公司 数据库不锁表备份 网络技术人员是程序员吗 网络安全检测平台都有哪一些 电商的服务器 测试在软件开发中的地位和作用 上网方式中采用无线网络技术的是 软件开发屏幕 安阳市委网络安全座谈会 温州中灵网络技术有限公司 外文数据库中有哪些引文数据库 人工智能算法软件开发公司 属于数据库安全技术的是什么 鄞州计算机软件开发公司 我的世界主播直播的服务器手机版 创世战车服务器维护 计算机软件网络技术专业 数据库是把其管理shiwu 数据库查找所有设备信息
0