chromedriver+Selenium+springboot+Java实现后端截图

chromedriver这种方法实现截图,依赖服务器端的谷歌浏览器软件,需要在服务器端下载谷歌浏览器。
Windows服务器说明
1.下载谷歌浏览器
2.根据第一步下载的谷歌浏览器版本,下载chromedriver,可以在这个页面找到和版本相近的版本去下载https://googlechromelabs.github.io/chrome-for-testing/
3.下载之后进行解压,将chromedriver.exe放到适合目录下

centos linux服务器说明
1.安装谷歌浏览器

yum install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm

2.查看浏览器版本

google-chrome --version

在这里插入图片描述

3.去https://googlechromelabs.github.io/chrome-for-testing/上面下载最接近的chromedriver。可以下载好放到服务器上,也可以通过下面命令下载(以我安装的120版本为列)

wget https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/120.0.6099.109/linux64/chromedriver-linux64.zip

4.解压chromedriver-linux64.zip

unzip chromedriver-linux64.zip

5.进入解压后的目录,查询chromedriver是否具有可执行权限,没的话记得赋权,之后记得chromedriver所在的目录路径,代码中需要
在这里插入图片描述
至此,安装完成,接下来进行Java代码开发
pom.xml中添加下面依赖

<dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>3.141.59</version></dependency><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>27.0-jre</version></dependency>

CutPictureController.java

 @GetMapping("/getCutPictureBySelenium")public void getCutPictureBySelenium(String url, String token,HttpServletResponse response) {cutPictureService.getCutPictureBySelenium(url,token,response) ;}

CutPictureService.java
@Value(“${chromedriverPath}”)
private String chromedriverPath;//在配置文件中进行路径配置

public void getCutPictureBySelenium(String url, String token,HttpServletResponse response) {//这里设置下载的驱动路径,Windows对应chromedriver.exe Linux对应chromedriver,具体路径看你把驱动放在哪System.setProperty("webdriver.chrome.driver", chromedriverPath);ChromeOptions options = new ChromeOptions();//ssl证书支持options.setCapability("acceptSslCerts", true);//截屏支持options.setCapability("takesScreenshot", true);//css搜索支持options.setCapability("cssSelectorsEnabled", true);options.setPageLoadStrategy(PageLoadStrategy.NORMAL);//设置浏览器参数options.addArguments("--headless");options.addArguments("--disable-gpu");options.addArguments("--no-sandbox");options.addArguments("lang=zh_CN.UTF-8");options.addArguments("--disable-dev-shm-usage");//指定浏览器分辨率options.addArguments("window-size=1920x1080");options.setHeadless(true);ChromeDriver driver = new ChromeDriver(options);//设置超时,避免有些内容加载过慢导致截不到图driver.manage().timeouts().pageLoadTimeout(3, TimeUnit.MINUTES);driver.manage().timeouts().implicitlyWait(3, TimeUnit.MINUTES);driver.manage().timeouts().setScriptTimeout(3, TimeUnit.MINUTES);try {//设置需要访问的地址driver.get(url);//进行cookie的设置,我这里是用于跳过登录Cookie c1 = new Cookie("admin-token",token);Cookie c2 = new Cookie("Authentication",token);driver.manage().addCookie(c1);driver.manage().addCookie(c2);//获取高度和宽度一定要在设置URL之后,不然会导致获取不到页面真实的宽高;Long width = (Long)driver.executeScript("return document.documentElement.scrollWidth");Long height =(Long) driver.executeScript("return document.documentElement.scrollHeight");System.out.println("高度:"+height);//这里需要模拟滑动,有些是滑动的时候才加在的long temp_height = 0;while (true) {//每次滚动500个像素,因为懒加载所以每次等待1S 具体时间可以根据具体业务场景去设置Thread.sleep(1000);driver.executeScript("window.scrollBy(0,500)");temp_height += 500;if(temp_height>=height){break;}}//设置窗口宽高,设置后才能截全driver.manage().window().setSize(new Dimension(width.intValue(), height.intValue()));//设置截图文件保存的路径File srcFile = driver.getScreenshotAs(OutputType.FILE);FileInputStream fis = new FileInputStream(srcFile);//            String screenshotPath = "D:\\imgghh.png";
//            FileUtils.copyFile(srcFile, new File(screenshotPath));//给前端放回流,可以进行下载,或者用上面注释的两行,将图片下载到本地response.setHeader("Content-Disposition","attachment;filename=test.jpg");OutputStream out = response.getOutputStream();byte[] buffer = new byte[1024];int length;while ((length = fis.read(buffer)) != -1) {out.write(buffer,0,length);}out.close();fis.close();}catch (Exception e){throw new RuntimeException("截图失败",e);}finally {driver.quit();}}

之后就可以执行程序,设置想截图的网页url进行截图,我遇到了一些页面加载很慢的,截的图可能不全或者是截不出图,目前还没更好的解决方案。如果大家有可以给我留言哦!

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

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

相关文章

docker部署Jira+配置MySQL8数据库

写在前面&#xff1a;如果你通过docker安装Jira且启动过&#xff0c;然后你现在又想使用mysql数据库&#xff0c;需要注意 你除了停掉原有容器&#xff0c;还需要删除&#xff1a;/var/lib/docker/volumes/jiraVolume/_data下的文件&#xff0c;否则启动后会无法正常使用。注意…

Redis 笔记一

概览 1.Redis核心数据存储结构 2.Redis底层String编码int&embstr&raw 3.Redis底层压缩列表&跳表&哈希表 4.Redis底层Zset实现压缩列表和跳表如何选择 5.基于Redis实现微博&抢红包&12306核心业务 辅助学习&#xff1a;Redis 教程 | 菜鸟教程 1.Redis为什…

ArcGIS初始化软件界面Normal.mxt

ArcGIS有时候永久了&#xff0c;或者呢突然不自觉软件界面乱了&#xff0c;或者一些窗口打开却找不到&#xff01; 这时候可以去删除arcgis的界面配置文件&#xff0c;Normal.mxt 删除后再打开软件&#xff0c;软件界面就会回到初始化设置了&#xff01; 文件所在的路径&…

从零开始学习Zeppelin:大数据可视化分析的交互式开发系统!

介绍&#xff1a;Apache Zeppelin是一个基于Web的交互式开发系统&#xff0c;主要用于进行大数据可视化分析。其核心概念是notebook&#xff0c;所有的操作都可以在notebook中完成。Zeppelin提供了一套非常全面的数据分析解决方案&#xff0c;支持数据采集、数据发现、数据分析…

网络安全应急响应灾备KB

目录 应急响应 定义 特点 国家相关标准和文件 事件分类与分级 应急响应组织 取证与保全 信息安全应急响应管理过程 灾备 关键词 灾备政策 灾备等级 灾备策略 受害恢复能力级别 灾难恢复管理过程 应急响应 定义&#xff1a; 指组织为了应对突发/重大信息安全管理…

canal server初始化源码分析

CanalLauncher类是canal server端启动的入口类&#xff0c;跟随代码进行深入。 在开始之前&#xff0c;我们可以先了解下&#xff0c; canal 配置方式 ManagerCanalInstanceGenerator&#xff1a; 基于manager管理的配置方式&#xff0c;实时感知配置并进行server重启Spring…

k8s---ingress对外服务(七层)

ingress 概念 k8s的对外服务&#xff0c;ingress service作用现在两个方面&#xff1a; 1、集群内部&#xff1a;不断跟踪的变化&#xff0c;更新endpoint中的pod对象&#xff0c;基于pod的ip地址不断变化的一种服务发现机制。 2、集群外部&#xff1a;类似于负载均衡器&a…

elasticsearch[二]-DSL查询语法:全文检索、精准查询(term/range)、地理坐标查询(矩阵、范围)、复合查询(相关性算法)、布尔查询

ES-DSL查询语法&#xff08;全文检索、精准查询、地理坐标查询&#xff09; 1.DSL查询文档 elasticsearch 的查询依然是基于 JSON 风格的 DSL 来实现的。 1.1.DSL 查询分类 Elasticsearch 提供了基于 JSON 的 DSL&#xff08;Domain Specific Language&#xff09;来定义查…

Python ddddocr 构建 exe 程序后运行报错:Failed Load model ... common_old.onnx

文章目录 ddddocr版本简单的 demo解决方案个人简介 ddddocr ddddocr是由sml2h3开发的专为验证码厂商进行对自家新版本验证码难易强度进行验证的一个python库&#xff0c;其由作者与kerlomz共同合作完成&#xff0c;通过大批量生成随机数据后进行深度网络训练&#xff0c;本身并…

qwen在vLLM下的长度外推简易方法

目的 在当前的版本vLLM中实现qwen的长度外推。 解决方法 在qwen的config.json中&#xff0c;增加如下内容&#xff1a; {"rope_scaling": { "type": "dynamic", "factor": 4.0} }dynamic:动态NTK factor:缩放因子&#xff0c;外推长…

虚拟环境中pip install不生效的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

R语言【base】:interactive():R语言是否在交互状态下运行?

Package base version 4.2.0 Usage interactive() Details 交互式的 R 会话是指有一个虚拟的操作手与 R 交互&#xff0c;比如 R 可以针对错误的输入提示更正&#xff0c;或者也可以询问接下来如何处理&#xff0c;或者认为这是可以的并且进行下一步。 GUI 控制台将安排在交…

宏集干货丨探索物联网HMI的端口转发和NAT功能

来源&#xff1a;宏集科技 工业物联网 宏集干货丨探索物联网HMI的端口转发和NAT功能 原文链接&#xff1a;https://mp.weixin.qq.com/s/zF2OqkiGnIME6sov55cGTQ 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; #工业自动化 #工业物联网 #HMI 前 言 端口转发和NAT功…

vue 里 props 类型为 Object 时设置 default: () => {} 返回的是 undefined 而不是 {}?

问题 今天遇到个小坑&#xff0c;就是 vue 里使用 props 传参类型为 Object 的时候设置 default: () > {} 报错&#xff0c;具体代码如下 <template><div class"pre-archive-info"><template v-if"infoData.kaimo ! null">{{ infoD…

ubuntu系统(10):使用samba共享linux主机中文件

目录 一、samba安装步骤 1、Linux主机端操作 &#xff08;1&#xff09;安装sabma &#xff08;2&#xff09;修改samba配置文件 &#xff08;3&#xff09;为user_name用户设置samba访问的密码 &#xff08;4&#xff09;重启samba服务 2、Windows端 二、使用 1、代码…

K8s(四)Pod资源——pod生命周期、重启策略、容器钩子与容器探测

目录 Pod生命周期 Pod重启策略 初始化容器 容器钩子 容器探测 启动探测 存活探测 就绪探测 参考资料 Pod 的生命周期 | Kubernetes Init 容器 | Kubernetes Pod的生命周期可以分为以下几个阶段&#xff1a; Pending&#xff08;等待&#xff09;&#xff1a;在这个…

Linux系统文件类型简介

Linux中的文件类型 在Linux系统中&#xff0c;每个文件都有一个文件类型&#xff0c;用于表示文件的种类。常见的文件类型包括: -&#xff1a; 普通文件&#xff1b; d&#xff1a; 目录文件&#xff1b; b&#xff1a; 块设备文件&#xff1b; c&#xff1a; 字符设备文件&a…

掌上单片机实验室 – 低分辨率编码器测速方式完善(24)

一、背景 本以为“掌上单片机实验室”这一主题已告一段落&#xff0c;可最近在测试一批新做的“轮式驱动单元”时&#xff0c;发现原来的测速算法存在问题。 起因是&#xff1a;由于轮式驱动单元的连线较长&#xff0c;PCB体积也小&#xff0c;导致脉冲信号有干扰&#xff0c;加…

2. FPGA的电路结构概述

文章目录 1. 引言2. FPGA的一般结构2.1 概要2.2 FPGA三部分构成间的关系&#xff1a; 3. 小结 1. 引言 结构决定原理。原理未必决定结构。理解FPGA结构&#xff0c;进而能阐明其工作原理很有必要。FPGA产品的风云变换&#xff0c;其基本结构保持相对不变。 2. FPGA的一般结构…

使用 Postman 发送 get 请求的简易教程

在API开发与测试的场景中&#xff0c;Postman 是一种普遍应用的工具&#xff0c;它极大地简化了发送和接收HTTP请求的流程。要发出GET请求&#xff0c;用户只需设定正确的参数并点击发送即可。 如何使用 Postman 发送一个GET请求 创建一个新请求并将类型设为 GET 首先&#…