Selenium隐藏浏览器和元素截屏实践

news2025/7/18 5:47:23

文章目录

  • 隐藏浏览器
    • 介绍
    • 示例代码
  • 浏览器截图
    • 介绍
    • 示例代码
      • 对整个浏览器页面进行截屏
      • 指定特定HTML元素进行截屏

隐藏浏览器

介绍

在使用Selenium采集网页数据时,需要不断地调用浏览器。实际上,通过对Selenium的设置,可以达到隐藏浏览器的效果。在程序中,对浏览器设置了headless,其作用是实现无界面状态。当设置了隐藏浏览器时也是可以正常进行和之前不隐藏浏览器一样的操作的。

 FirefoxBinary firefoxBinary = new FirefoxBinary();
 // 设置隐藏浏览器模式
 firefoxBinary.addCommandLineOptions("--headless");
 FirefoxOptions firefoxOptions = new FirefoxOptions();
 firefoxOptions.setBinary(firefoxBinary);
 driver = new FirefoxDriver(firefoxOptions);

示例代码

使用隐藏浏览器模式访问百度,并尝试获取其按钮的文字信息。通过测试验证可以在隐藏浏览器模式下正常获取元素值。

import lombok.extern.slf4j.Slf4j;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxBinary;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxOptions;

/**
 * 使用Selenium采集网站数据,隐藏浏览器模式
 *
 * @author zhangyu
 * @date 2022/11/18
 **/
@Slf4j
public class HeadlessAppExample {

    public static void main(String[] args) {
        WebDriver driver = null;
        try {
            System.setProperty("webdriver.gecko.driver", "driver/firefox/geckodriver.exe");
            FirefoxBinary firefoxBinary = new FirefoxBinary();
            // 设置隐藏浏览器模式
            firefoxBinary.addCommandLineOptions("--headless");
            FirefoxOptions firefoxOptions = new FirefoxOptions();
            firefoxOptions.setBinary(firefoxBinary);
            driver = new FirefoxDriver(firefoxOptions);
            Thread.sleep(1000);
            driver.get("https://www.baidu.com");
            // 查找某一元素是否存在
            WebElement webElement = driver.findElement(By.id("su"));
            log.info("元素text信息:{}", webElement.getAttribute("value"));
        } catch (Exception e) {
            log.error(e.getMessage());
        } finally {
            assert driver != null;
            driver.quit();
        }
    }
}

在这里插入图片描述
在这里插入图片描述
【说明】
在这里插入图片描述
隐藏浏览器资源消耗情况
在这里插入图片描述
显示浏览器资源消耗情况

当我们设置隐藏浏览器不代表不启动浏览器,当我们打开任务管理器可以看到此时firefox是以后台进程的方式运行的,而且在相同的运行流程下,可以看到显示浏览器资源消耗明显是大于隐藏浏览器的。消耗更少的资源也意味着我们或许可以在同一台机器上运行更多的流程。但是隐藏浏览器可能会出现一些无法预料的问题,这个需要在开发中注意下,同时隐藏浏览器也无法实时看到运行情况,对于可以使用类似浏览器截屏的方式记录流程视图。

如果服务器资源紧张,可以尝试下这个方式,开发阶段设置显示生产环境设置隐藏模式。
此外,如果所处理流程涉及隐私数据,那么此模式也可以作为一种解决方案,通过搭配截屏保存私有服务器方式,既避免了处理流程时数据隐私问题也保存了数据处理流程记录。

浏览器截图

介绍

在网络爬虫中,很多网站会采用验证码的方式来反爬虫,例如在登录时设置验证码、频繁访问时自动弹出验证码等。针对模拟登录时的验证码输入问题,一种简单的解决方案是将验证码保存到本地,之后在程序中手动输入即可。但对于采集每页都需要验证码的网站来说,则需要使用验证码识别算法或调用一些OCR API来自动识别验证码,以保证其效率。
使用Jsoup或者Httpclient,可以直接将验证码下载到本地。而对Selenium来说,可以使用截图的方式截取验证码,并保存到本地。然后通过对该截图进行OCR识别。
不仅对于验证码场景适用,对于自动化处理场景,我们也可以通过周期性的浏览器页面截图做到流程操作记录留存,对于一些关键性的场景设置一些截图可以帮助我们更好的监控线上运行情况。尤其是对于发生异常时,截屏当前页面,对于排查问题非常的方便。
对于Selenium的截屏可以大致分为两种,一种是getScreenshotAs(OutputType.FILE);的方式直接对整个浏览器页面进行截图,另一种是对指定特定HTML元素进行截屏。

示例代码

对整个浏览器页面进行截屏

import cn.hutool.core.io.FileUtil;
import lombok.extern.slf4j.Slf4j;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

import java.io.File;

/**
 * 使用Selenium对网页特定区域进行截图并保存本地
 *
 * @author zhangyu
 * @date 2022/11/18
 **/
@Slf4j
public class ScreenshotExample {

    public static void main(String[] args) {
        WebDriver driver = null;
        try {
            System.setProperty("webdriver.gecko.driver", "driver/firefox/geckodriver.exe");
            driver = new FirefoxDriver();
            Thread.sleep(1000);
            driver.get("https://www.baidu.com");
            driver.manage().window().maximize();
            // 进行整个屏幕截图,设置输出文件
            TakesScreenshot scrShot = ((TakesScreenshot) driver);
            File SrcFile = scrShot.getScreenshotAs(OutputType.FILE);
            // 创建本地文件
            File DestFile = new File("screenshot", System.currentTimeMillis() + ".png");
            FileUtil.copyFile(SrcFile, DestFile);
            Thread.sleep(3000);
        } catch (Exception e) {
            log.error(e.getMessage());
        } finally {
            assert driver != null;
            driver.quit();
        }
    }
}

在这里插入图片描述

指定特定HTML元素进行截屏


import lombok.extern.slf4j.Slf4j;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;

/**
 * 使用Selenium对网页特定区域进行截图并保存本地
 *
 * @author zhangyu
 * @date 2022/11/18
 **/
@Slf4j
public class Screenshot2Example {

    public static void main(String[] args) {
        WebDriver driver = null;
        try {
            System.setProperty("webdriver.gecko.driver", "driver/firefox/geckodriver.exe");
            driver = new FirefoxDriver();
            Thread.sleep(1000);
            driver.get("https://www.baidu.com");
            driver.manage().window().maximize();
            // 获取页面中某个元素
            WebElement webElement = driver.findElement(By.id("lg"));
            // 进行元素截图,设置输出文件
            TakesScreenshot scrShot = ((TakesScreenshot) driver);
            File srcFile = scrShot.getScreenshotAs(OutputType.FILE);
            BufferedImage bufferedImage = ImageIO.read(srcFile);
            Point location = webElement.getLocation();
            int width = webElement.getSize().getWidth();
            int height = webElement.getSize().getHeight();
            BufferedImage imageSubimage = bufferedImage.getSubimage(location.getX(), location.getY(), width, height);
            ImageIO.write(imageSubimage, "png", new File("screenshot", System.currentTimeMillis() + ".png"));
            Thread.sleep(3000);
        } catch (Exception e) {
            log.error(e.getMessage());
        } finally {
            assert driver != null;
            driver.quit();
        }
    }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/17589.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

堆 (带图详解)

文章目录1.堆的基本概念1. 概念2.性质1.必须为完全二叉树2.满足大堆/小堆成立的条件3.存储方式1.逻辑结构2.物理结构4. 孩子与父亲之间下标的关系2.堆的基本实现1.push——插入1.代码2. 情况分析情况1情况23. 向上调整算法1.过程分析2. 临界条件的判断2. pop—— 删除1.代码2. …

[附源码]计算机毕业设计JAVA火车票订票管理系统

[附源码]计算机毕业设计JAVA火车票订票管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM myba…

【HDU No. 4006】 第k 大的数 The kth great number

【HDU No. 4006】 第k 大的数 The kth great number 杭电OJ 题目地址 【题意】 小明和小宝正在玩数字游戏。游戏有n轮,小明在每轮中都可以写一个数,或者问小宝第k 大的数是什么(第k 大的数指有k -1个数比它大)。 游戏格式为&am…

运维开发实践 - Docker - 容器实现原理

1.Docker容器是什么 按照Docker官网,容器是运行在宿主机上的一个进程,但与宿主机上的其他进程相隔离; 2.容器实现原理 这种隔离机制使用了内核中的namespace和cgroups功能; 2.1.Linux namespace Linux通过将系统的资源放置在…

Redis数据类型之string

文章目录stringⅠ. 增删查改Ⅱ. 加减操作Ⅲ. 数据生命周期Ⅳ. 业务场景 - 高频数据Ⅴ. 注意事项提示:以下是本篇文章正文内容,Redis系列学习将会持续更新 string ● 存储的数据:单个数据,最简单的数据存储类型,也是最常…

Paket在Linux下使用问题

1. 系统软件版本 Linux系统:Debian 10,需安装mono-devel Paket版本:7.1.5 关于Paket的介绍:https://github.com/fsprojects/Paket Paket的发布版本:https://github.com/fsprojects/Paket/releases 2. 使用方法 将…

原来背后都是商业利益,看到网易和暴雪的解约之后,原来是要定以后的KPI,坐地起价,但是一个时代已经结束了,都留在了记忆之中

1,大瓜新闻,2023年1月暴雪游戏中国将不会续约?? 2,原因是主要坐地起价,提高分成设置KPI 还好网易有自研游戏,估计早知道会有现在这样的情况。 提前做好了准备。还记得有个公司叫 九城吗&#x…

Linux操作系统~带你理解文件系统与软硬链接

目录 1.C语言中的FILE和文件描述符对应的file 2.Linux的EXT系列的文件系统 (1).block group中六个部分的内容 inode索引结点相关 Q:这两个inode有什么不同? (2).一个文件的inode和对应的block如何关联…

off-by-one (b00ks)

前言 个人简略记录,过程不详细 gdb开始调试 vmmap查看程序基地址为 0x555555400000 继续运行,输入auth search hollk关键字,auth存放的地址可以找出为:0x555555602040 圈起来的是溢出的 \x00 创建两个books 因为图书的结构体指…

数据库以及数据库常用概念、ER模型相关概念

目录 1.我们为什么要学习数据库? 2.数据库的相关概念: 2.关系型数据库和非关系型数据库的区别 A.关系型数据库: B.非关系型数据库: C.非关系型数据库的相关类别有以下几种: 3.关系型数据库设计规则 4.表、记录、…

华为数据中心VS技术理论讲解

目录 VS之间的关系 VS的配置管理权限 VS之间、VS与外部通信 VS资源分配 VS与其它技术的联合部署 VS的创建和删除 VS(Virtual System)虚拟系统是指将一台物理设备虚拟成多个相互隔离的逻辑设备 逻辑设备之间软硬件隔离,互不影响&#xff…

立体式校验保护,让你的系统避免 90% 以上的 bug

1. 概览 在实际开发过程中,数据校验是最为重要的一环,问题数据一旦进入系统,将对系统造成不可估量的损失。轻者,查询时触发空指针异常,导致整个页面不可用;重者,业务逻辑错误,造成流…

为了买个硬盘,我专门写了篇笔记

文章目录SSD是固态硬盘的一些参数插槽接口总线类型传输协议插槽接口/总线/协议关联参考连接HDD是机械硬盘;SSD是固态硬盘。 SSD是固态硬盘的一些参数 插槽接口 外观不同而已;插槽接口不影响传输速度,但是插槽接口不适配的话是肯定插不到电脑…

力扣(LeetCode)12. 整数转罗马数字(C++)

模拟 罗马数字和掰手指数数的区别在于,IV/IXIV/IXIV/IX 这类倒着数数的,和阿拉伯数字最大的区别在于 555 的 10k10^k10k 倍 k∈Nk\isin Nk∈N ,需要被表示出来。所以除了记录 I/X/C/MI/X/C/MI/X/C/M ——1/10/100/10001/10/100/10001/10/100…

activiti-image-generator

activiti-image-generator目录概述需求:设计思路实现思路分析1.ActivitiImageException2.ProcessDiagramGenerator3.ProcessDiagramSVGGraphics2D4.ProcessDiagramDOMGroupManager5.DefaultProcessDiagramGenerator参考资料和推荐阅读Survive by day and develop by…

Smart point智能指针(part.1)

1:为什么出现智能指针   为了避免多个指针指向一个对象的时候 销毁其中一个point 其他的point就会变成空point 或者多次删除被指向对象而发生报错   或者单纯删除指针 不删除其指向的对象 当最后一个指向对象被删除的时候 对象依然存在 造成资源泄露  智能指针…

MATLAB continue语句

详细例子&#xff1a; 在MATLAB中建立一个脚本文件&#xff0c;并输入下述代码&#xff1a; a 10; %while loop execution while a < 20if a 15% skip the iteration a a 1;continue;endfprintf(value of a: %d , a);a a 1; end 运行该文件&#xff0c;显示下…

unet医学肺部ct图分割简单记录

UNet医学图像分割 说明&#xff1a; 本项目采用pytorch——gpu——cuda11.6本项目用的UNet网络架构一、硬件&#xff1a; Windows GPU 二、软件环境安装&#xff1a; pytorchNibabel 三、用法&#xff1a; 医学数据采集为kaggle的官网新冠肺炎ct图数据预处理&#xff1a;1…

青少年python系列 45.文件操作1

青少年python系列目录_老程序员115的博客-CSDN博客 青少年python教学视频ppt源码 在计算机信息时代&#xff0c;我们知道文本文件可存储的数据量多得难以置信&#xff0c;例如气象站的天气数据、交管部门的交通数据、金融商业街的社会经济数据、电子图书馆或博物馆的文学作品等…

做斗音都要经历的几个时期,你目前处于哪个阶段呢?

大家好&#xff0c;我是我赢助手&#xff0c;专注于自媒体短视频去水印、去重和文案提取运营。 今天给大家分享下做斗音的几个时期 1、兴奋期 听别人说斗音遍地是黄金开始到处学艺买资料准备大干一场。 这时是最关键的&#xff0c;能学到可以实操的项目才是最重要的&#x…