JAVA使用selenium实现后台浏览器截图(含代码+docker打包)

这篇具有很好参考价值的文章主要介绍了JAVA使用selenium实现后台浏览器截图(含代码+docker打包)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近接到一个特殊需求,需要每天定时截图某网站首页,保存备查,因此使用JAVA实现了后台截图。

下面是完整的方法。

技术方案

JAVA实现浏览器截图,浏览器选用的是chrome,使用selenium-java依赖。selenium可以帮助我们调用浏览器,完成想要的功能。
由于是后台截图,不需要显示界面,chrome也支持不显示界面的调用。

selenium使用的是 较新的版本4.18.1 (截止2024-3-8)。
java版本为21(应该是11以及后,或者8也可以)
使用了hutool工具包。

前置准备

首先,我们在windows上开发,需要下载最新的chrome浏览器和他对应的driver,下载地址为:
https://chromedriver.chromium.org/downloads
根据下载界面的介绍,chrome115版本及以后的,下载地址为:
https://googlechromelabs.github.io/chrome-for-testing/

下载自己架构的windows版本 chromedriver。

JAVA代码

pom:

<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>4.18.1</version>
</dependency>
            <dependency>
                <groupId>cn.hutool</groupId>
                <artifactId>hutool-all</artifactId>
                <version>5.8.26</version>
            </dependency>

java是使用spring开发的service,支持读取spring配置文件,截出来的bytes数组是png格式的图片,可以自己直接保存成文件,或者base64发到其他服务。代码如下:

/**
 */
public interface ChromeService {

    /**
     * 对指定界面截图
     * @param url 要截图的url
     * @return 图片二进制数据
     */
    byte[] screenshot(String url);
}


import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

/**
 */
@ConfigurationProperties("myservice.chrome")
@Data
public class ChromeProperties {
    private String driverPath;
    private int width;
    private int height;
}


import cn.hutool.core.io.resource.ClassPathResource;
import cn.hutool.core.thread.ThreadUtil;
import  xxx.ChromeService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeDriverService;
import org.openqa.selenium.chrome.ChromeOptions;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.stereotype.Service;

import java.io.File;
import java.io.IOException;
import java.nio.file.Paths;
import java.time.Duration;
import java.util.concurrent.TimeUnit;

/**
 */
@Service
@Slf4j
@EnableConfigurationProperties(ChromeProperties.class)
public class ChromeServiceImpl implements ChromeService {

    @Resource
    private ChromeProperties chromeProperties;

    public ChromeDriverService getService()  {
        // 利用ChromeDriverService启动
        // Windows对应chromedriver.exe Linux对应chromedriver
        // linux下的chromedriver 需要有执行权限!
        File driverFile;
        if (chromeProperties.getDriverPath().startsWith("classpath")){
            driverFile = new ClassPathResource(chromeProperties.getDriverPath()).getFile();
        }else {
            // 常规文件
            driverFile = Paths.get(chromeProperties.getDriverPath()).toFile();
        }

        ChromeDriverService service = new ChromeDriverService.Builder().usingDriverExecutable(driverFile).usingAnyFreePort().build();
        try {
            service.start();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return service;
    }


    @Override
    public byte[] screenshot(String url) {
        ChromeDriverService service = getService();
        ChromeDriver driver = getDriver(service);
        try {
            //设置需要访问的地址
            log.info("chrome 截图: {}", url);
            driver.get(url);
            ThreadUtil.sleep(5, TimeUnit.SECONDS);
            //设置窗口宽高,设置后才能截全
            driver.manage().window().setSize(new Dimension(chromeProperties.getWidth(), chromeProperties.getHeight()));
            return driver.getScreenshotAs(OutputType.BYTES);
        } finally {
            driver.quit();
            service.stop();
            log.info("chrome 实例 销毁成功!");
        }
    }

    private ChromeDriver getDriver(ChromeDriverService service) {
        ChromeOptions options = new ChromeOptions();
        options.setAcceptInsecureCerts(true);

        //设置浏览器参数
        options.addArguments("--no-sandbox");
        options.addArguments("--disable-gpu");
        options.addArguments("--disable-dev-shm-usage");
        options.addArguments("--headless=new");
        ChromeDriver driver = new ChromeDriver(service, options);
        //设置超时,避免有些内容加载过慢导致截不到图
        driver.manage().timeouts()
                .pageLoadTimeout(Duration.ofMinutes(1))
                .implicitlyWait(Duration.ofMinutes(1))
                .scriptTimeout(Duration.ofMinutes(1));
        log.info("chrome driver 初始化成功!");
        return driver;
    }
}

使用时,先在application.yaml中配置chromedriver的地址:

myservice:
  chrome:
    driver-path: 'classpath:/chromedriver.exe'
    width: 1366
    height: 768

在windows下,chromedriver.exe可以随便放到哪个目录,或者直接放到resources下,配置好路径即可。
在linux下,要放到jar包外面,并授予可执行权限,否则无法调用。

width和height是要截图的浏览器宽高,可以按照自己屏幕的分辨率自行调整。

打包docker

这里把基础镜像的制作方法放出来。jar包放到基础镜像中的操作就不再赘述了。

基础镜像包含jdk和chrome软件。

首先,在 https://pkgs.org/download/google-chrome-stable 下载chrome安装包。
下载最新的即可。
按照安装包版本,去上面的chrome-driver下载对应的chromedriver。

下面是下载好以后的目录结构。
chromedriver是解压出来的;由于我选的jdk镜像支持的是deb,所以这里面的rpm可以不需要,按照自己的实际情况下载即可。
JAVA使用selenium实现后台浏览器截图(含代码+docker打包),java,selenium,docker
dockerfile如下,安装了一些额外的工具包,其中language-pack-zh-hans fonts-wqy-zenhei这俩包安装后才可以正常显示中文,否则截出来的图里面的中文会是空框框。

FROM azul/zulu-openjdk:21.0.2-jre
ADD google-chrome-stable_current_amd64.deb /google-chrome-stable_current_amd64.deb
RUN apt-get update
RUN apt-get install -y  curl
RUN apt-get install -y sudo
RUN apt-get install /google-chrome-stable_current_amd64.deb -y
RUN apt-get install language-pack-zh-hans fonts-wqy-zenhei -y
ADD chromedriver /usr/bin/chromedriver

结束。文章来源地址https://www.toymoban.com/news/detail-839387.html

到了这里,关于JAVA使用selenium实现后台浏览器截图(含代码+docker打包)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Windows使用selenium操作Edge浏览器实现爬虫

    以前的大部分程序都是操作Chrome,很少有操作Edge,现在以Edge为例。 Selenium本身是无法直接控制浏览器的,不同的浏览器需要不同的驱动程序,Google Chrome需要安装ChromeDriver、Edge需要安装Microsoft Edge WebDriver,其他浏览器也需要安装相应的驱动。 edge://version/ https://developer.micros

    2024年02月03日
    浏览(38)
  • java + Selenium 实现自动化测试,模拟人手点击操作 chrome 浏览器

    引入 maven 依赖: 安装 chromeDriver:略 SeleniumUtils.java: ChromeDriverUtils.java: 使用示例:

    2024年02月11日
    浏览(47)
  • 使用selenium驱动浏览器时携带cookie实现模拟登陆

    selenium可以帮助我们驱动浏览器打开网页,并进行一些特定的操作。但是现在越来越多的网站,也会识别selenium,并且限制了访问条件,比如:必须登录。 在selenium中,get_cookies()方法可以帮助我们获取cookie。这里以知乎为例演示一下使用。 这里用到的浏览器驱动对象为 unde

    2024年04月14日
    浏览(42)
  • Java爬虫 通过Chromedriver+Chrome浏览器+selenium获取页面的请求和响应(未完全实现)

    因为最近看到一个软件可以实现网页的识别,自动导入网页的内容,感觉这个功能很厉害(真心佩服设计那个软件的人)。但不清楚这个软件的网页识别的实现,也没有接触过相关的技术,就上网搜索并学习一些相关的技术,所以有了这篇文章。但是只能获取简单的请求,一

    2024年02月13日
    浏览(46)
  • java爬虫遇到网页验证码怎么办?(使用selenium模拟浏览器并用python脚本解析验证码图片)

            笔者这几天在爬取数据的时候遇到了一个很闹心的问题,就是在我爬取数据的时候遇到了验证码,而这个验证码又是动态生成的,尝试了很多方法都没能绕开这个验证码问题。         我的解决方案是:使用selenium模拟浏览器行为,获取到动态生成的验证码后用

    2024年02月09日
    浏览(69)
  • Selenium调用使用360浏览器,QQ浏览器,遨游浏览器,猎豹浏览器,Chromium

    国产的360安全浏览器,360急速浏览器,QQ浏览器,遨游浏览器甚至新版还未上市的Edge浏览器都是基于Chrome浏览器的开源版本Chronium开发来的。所以360浏览器可以理解为一个定制的Chrome浏览器,最新360安全浏览器是基于Chromium 63版本的,落后正式的Chrome版本。 我们下载对应的2

    2024年02月06日
    浏览(45)
  • 使用Selenium需要浏览器驱动与浏览器版本统一

    安装浏览器驱动 针对不同的浏览器,需要安装不同的驱动。 这里以安装 Chrome 驱动作为演示。 确定浏览器版本 进入设置界面,然后选择 【关于 Chrome】 查看自己的版本信息。这里我的版本是114,下载对应版本的 Chrome 驱动即可。 下载驱动 打开Chrome驱动。单击对应的版本。(

    2024年02月08日
    浏览(45)
  • selenium浏览器自动化测试【基于java】

    Selenium 是一个用于Web应用程序的自动化测试工具。它直接运行在浏览器中,可以模拟用户在浏览器上面的行为操作。 chrome.exe 默认安装位置:C:Program FilesGoogleChromeApplicationchrome.exe 结果我的在:C:Users91073AppDataLocalGoogleChromeApplicationchrome.exe 。。。为啥? 下载驱动 最新

    2024年02月04日
    浏览(43)
  • selenium的java方式打开IE浏览器

    3)选择项目下的已解压selenium-java-3.141.59后的lib目录及两个jar,点击确定完成即可。 IE驱动下载地址:https://www.selenium.dev/downloads/,根据自己电脑选择对应的下载,放入电脑E:driver 1)打开edge浏览器,启用IE模式,找到更多工具的 Internet选项 2)点击安全,将下图四个选项都设置

    2024年02月15日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包