Java利用ChromeDriver插件网页截图(Wondows版+Linux版)
chromedriver是谷歌浏览器驱动,用来模拟谷歌运行操作的一个工具,此处主要讲解Java后端利用此插件进行网页截图,并且适配Linux部署。
环境准备
Wondows服务器或电脑
本机需安装Chrome谷歌浏览器,根据本机浏览器版本,下载对应的chromedriver版本,chromedrive插件下载地址: 谷歌chromeDriver插件地址,下载后解压即可。PS:网上看到许多需要配置环境变量的,实测根本不需要。
注意:插件版本和本机浏览器版本一定要对应
Linux服务器
安装Chrome
yum install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
查看版本
google-chrome --version
根据版本下载插件,chromedrive插件下载地址:https://registry.npmmirror.com/binary.html?path=chromedriver/,选择Linux版,上传到服务器后解压,上面默认安装最新版本。
// 解压
unzip chromedriver_linux64.zip
// 赋权
chmod 777 chromedriver
// 安装浏览器中文字体
yum -y groupinstall Fonts
Java代码部分
引入maven
<!-- 浏览器截图jar包 --><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>
截图工具方法类
代码里面用到的是ChromeDriverService启动,还有一种是:
ChromeDriver driver = new ChromeDriver(options);
System.setProperty(“webdriver.chrome.driver”, “/data/server/legal-document-library-task/chromedriver”);
这种在高并发,频繁截图时会遇到ChromeDriver插件未正常关闭的情况,会占用端口或内存。推荐使用ChromeDriverService方式。
public String imgUntil(String url){ChromeDriver driver = null;FileInputStream inputFile = null;ChromeDriverService service = null;try {//(推荐),利用ChromeDriverService启动//这里"/data/server/legal/chromedriver"是下载的驱动路径,Windows对应chromedriver.exe Linux对应chromedriver,具体路径看你把驱动放在哪service = new ChromeDriverService.Builder().usingDriverExecutable(new File("/data/server/legal/chromedriver")).usingAnyFreePort().build();service.start();ChromeOptions options = new ChromeOptions();//ssl证书支持options.setCapability("acceptSslCerts", true);//截屏支持options.setCapability("takesScreenshot", true);//css搜索支持options.setCapability("cssSelectorsEnabled", true);//设置浏览器参数options.addArguments("--headless");options.addArguments("--no-sandbox");options.addArguments("--disable-gpu");options.addArguments("--disable-dev-shm-usage");options.setHeadless(true);driver = new ChromeDriver(service,options);//设置超时,避免有些内容加载过慢导致截不到图driver.manage().timeouts().pageLoadTimeout(1, TimeUnit.MINUTES);driver.manage().timeouts().implicitlyWait(1, TimeUnit.MINUTES);driver.manage().timeouts().setScriptTimeout(1, TimeUnit.MINUTES);//设置需要访问的地址driver.get(url);Thread.sleep(2000);//获取高度和宽度一定要在设置URL之后,不然会导致获取不到页面真实的宽高;Long width = (Long)driver.executeScript("return document.documentElement.scrollWidth");Long height =(Long) driver.executeScript("return document.body.parentNode.scrollHeight");System.out.println("高度:"+height);/*//这里按照网页需求有些是滑动的时候才加在的,如ajax的异步加载long temp_height = 0;while (true) {//每次滚动500个像素,因为懒加载所以每次等待2S 具体时间可以根据具体业务场景去设置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);// 这里的需求是将图片转为Base64码后换回,实际按需求控制inputFile = new FileInputStream(srcFile);byte[] buffer = new byte[(int)srcFile.length()];inputFile.read(buffer);String content = new BASE64Encoder().encode(buffer);return content;//设置截图文件保存的路径//String screenshotPath = "C:\\wenjian\\YA\\imgGG1.png";//FileUtils.copyFile(srcFile, new File(screenshotPath));}catch (Exception e){e.printStackTrace();log.error("截图失败:"+e);return null;}finally {try{if (inputFile != null){inputFile.close();}}catch (Exception ee){}if (driver!= null){driver.quit();service.stop();}}}
工具2
全面截屏//配置本地的chromediver.exe谷歌的内核System.setProperty("webdriver.gecko.driver", "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");//设置ChromeOptions打开方式,设置headless:不弹出浏览器//设置好使用ChromeDriver使用ChromeDriver driver = new ChromeDriver(); driver.get("https://www.jianshu.com/u/a2b05c68b03b");//设置浏览器弹窗页面的大小driver.manage().window().maximize();//使用getScreenshotAs进行截取屏幕File srcFile = driver.getScreenshotAs(OutputType.FILE); FileUtils.copyFile(srcFile, new File("G:\\pyChar\\jj.png")); 长截屏//配置本地的chromediver.exe谷歌的内核System.setProperty("webdriver.gecko.driver", "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");//设置ChromeOptions打开方式,设置headless:不弹出浏览器ChromeOptions options = new ChromeOptions();options.addArguments("headless");//设置好使用ChromeDriver使用ChromeDriver driver = new ChromeDriver(options); //获取要截图的地址,注:需要先获取地址哦,不然下方获取的宽度高度就会是弹窗的高和宽,而不是页面内容的高宽driver.get("https://www.jianshu.com/u/a2b05c68b03b");//获取页面高宽使用:return document.documentElement.scrollWidth//Long width = (Long)driver.executeScript("return document.documentElement.scrollWidth");// Long height =(Long) driver.executeScript("return document.documentElement.scrollHeight");Long width = (Long) ((JavascriptExecutor)driver).executeScript("return document.documentElement.scrollWidth");Long height = (Long) ((JavascriptExecutor)driver).executeScript("return document.documentElement.scrollHeight");//设置浏览器弹窗页面的大小driver.manage().window().setSize(new Dimension(width.intValue(), height.intValue()));//使用getScreenshotAs进行截取屏幕File srcFile = driver.getScreenshotAs(OutputType.FILE); FileUtils.copyFile(srcFile, new File("G:\\pyChar\\jj.png")); 元素截图使用方法WebElement findElementByXPath = ToolDriver.findElement(By.xpath("//*[@id=\"s_lg_img\"]"));File screenshotAs = findElementByXPath.getScreenshotAs(OutputType.FILE);String prName = "src/main/resources/" + "Toolimg" + ".png";try {FileUtils.copyFile(screenshotAs, new File(prName));} catch (IOException e) {e.printStackTrace();}
--全面截图再截图
File src = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
WebElement element = driver.findElement(By.xpath("//div[@class='msn']"));Rectangle rect = element.getRect();
BufferedImage subImage= ImageIO.read(src).getSubimage(rect.x, rect.y, rect.getWidth(), rect.height);
ImageIO.write(subImage, "png", src);
相关文章:
Java利用ChromeDriver插件网页截图(Wondows版+Linux版)
chromedriver是谷歌浏览器驱动,用来模拟谷歌运行操作的一个工具,此处主要讲解Java后端利用此插件进行网页截图,并且适配Linux部署。 环境准备 Wondows服务器或电脑 本机需安装Chrome谷歌浏览器,根据本机浏览器版本,下载对应的chr…...
无人机之交互系统篇
一、系统构成 无人机交互系统通常由多个子系统组成,包括但不限于: 多模式人机交互装置:这是人机交互系统的基础层,通常包括计算机、局域网、传感器等设备,用于实现操作员与无人机之间的数据交互和指令传递。例如&…...
MarsCode--找出数字比例超过n/2的【简单】
问题描述 给定一个长度为n的整型数组,已知其中一个数字的出现次数超过数组长度的一半,找出这个元素 输入格式 一个长度为n的数组,其中某个元素的出现次数大于n/2 输出格式 一个整数 输入样例 [1,3,8,2,3,1,3,3,3] 输出样例 3 数据范…...
Python网络爬虫快速入门指南
Python网络爬虫快速入门指南 网络爬虫,也称为网络蜘蛛,是一种自动访问互联网并提取信息的程序。Python因其简洁明了的语法和丰富的库支持,成为开发网络爬虫的理想选择。在这篇博客中,我们将探讨如何快速入门Python网络爬虫技术&a…...
C86 架构一键离线安装 docker 和 docker-compose 实战指南
C86 架构一键离线安装 docker 和 docker-compose 实战指南 文章目录 C86 架构一键离线安装 docker 和 docker-compose 实战指南一 磁盘挂载二 docker 部署1 上传安装包2 解压安装包3 安装包 docker 三 验证安装四 清除安装包五 安装包下载地址 本文提供了在 C86 架构环境下&…...
【LwIP源码学习2】调试输出相关宏
前言 本文对lwip中debug.h文件里的调试相关宏进行分析。 正文 debug.h中有3个重要的调试相关宏: LWIP_ASSERT(message, assertion) LWIP_ERROR(message, expression, handler) LWIP_DEBUGF(debug, message) 断言 LWIP_ASSERT(message, assertion) 源代码为&…...
Python 列表专题:删除元素
Python 是一种强大的编程语言,广泛应用于数据分析、Web 开发、人工智能等多个领域。而列表(List)作为 Python 中最基本的数据结构之一,扮演着非常重要的角色。列表不仅可以存储各种类型的数据,还提供了丰富的操作接口,方便我们进行数据的增删改查。本篇博文将深入探讨 Py…...
Spring Boot 快速入门与核心原理详解
引言 在上一篇文章中,我们详细探讨了 Spring 框架中的事件监听与发布机制。本文将转向 Spring Boot,介绍如何快速入门 Spring Boot,并深入探讨其核心原理。Spring Boot 是由 Pivotal 团队提供的全新框架,旨在简化 Spring 应用的初…...
UniApp 与微信小程序详细对比
UniApp 与微信小程序详细对比 1. 开发环境 微信小程序: 主要使用微信开发者工具提供模拟器、调试工具和性能监控只能开发微信小程序 UniApp: 主要使用 HBuilderX,但也支持 VS Code 等其他编辑器HBuilderX 提供可视化界面、代码提示、调试工…...
【用大模型提示工程处理NLP任务】
Batch API Prompt 工程 任务一:文本分类 任务二:情感分析 任务三:文档处理 任务四:信息抽取 任务五:机器翻译 任务六:生成任务 任务七:文本纠错 Batch API Prompt 工程 Batch API 适用于…...
适配器模式、代理模式(C++)
适配器模式: 定义:适配器模式是一种结构型设计模式,它允许接口不兼容的类一起工作。它通过将一个类的接口转换成客户端期望的另一个接口,使原本由于接口不兼容而不能一起工作的那些类可以一起工作。 代理模式: 定义&a…...
unity 2d 近战攻击判定的三种方式以及精确获取碰撞点
精确获取碰撞点 核心是获取武器碰撞盒最顶点,然后获取敌人碰撞盒距离该点最近的点 /// <summary>/// 获取获取武器前端位置 碰撞盒最左或最右顶点/// </summary>/// <param name"collider"></param>/// <param name"…...
矩形函数的傅里叶变换——从一维到二维,从连续到离散
一维连续矩形函数的傅里叶变换 二维连续矩形函数的傅里叶变换 禹晶、肖创柏、廖庆敏《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》P109 2D DFT 禹晶、肖创柏、廖庆敏《数字图像处理(面向新工科的电工电子信息基础课程系…...
潜水打捞系统助力,破解汽车打捞难题
随着人类活动的不断扩展,汽车落水事故频发,成为救援工作中的一大难题。汽车因其重量和结构特性,一旦沉入水体,打捞工作将面临巨大挑战。传统的打捞方法往往效率低下,且在操作过程中可能会对汽车造成进一步的损害&#…...
【深度学习】经典的深度学习模型-01 开山之作:CNN卷积神经网络LeNet-5
【深度学习】经典的深度学习模型-01 开山之作:CNN卷积神经网络LeNet-5 Note: 草稿状态,持续更新中,如果有感兴趣,欢迎关注。。。 0. 论文信息 article{lecun1998gradient, title{Gradient-based learning applied to document r…...
LeetCode 每日一题 2024/10/7-2024/10/13
记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录 10/7 871. 最低加油次数10/8 1436. 旅行终点站10/9 3171. 找到按位或最接近 K 的子数组10/10 3162. 优质数对的总数 I10/11 3164. 优质数对的总数 II10/12 3158. 求出出现两…...
ZYNQ使用XGPIO驱动外设模块(前半部分)
目录 目录 一、新建BD文档,添加ZYNQ处理器 1.BD文档: 2.在Vivado中,BD文件的生成过程通常包括以下步骤: 1)什么是Tcl Console: 3.PL部分是FPGA可编程逻辑部分,它提供了丰富的IO资源,可以用于实现各种硬件接口和功…...
【FastAdmin】全栈视角下的页面跳转实现:从原生html、javascrpt、php技术到jQuery、FastAdmin框架
全栈视角下的页面跳转实现:从原生html、javascrpt、php技术到jQuery、FastAdmin框架 1 引言 页面跳转是Web开发中的基本操作,不同的技术栈提供了不同的实现方法。本文将详细介绍在原生JavaScript、原生HTML、原生PHP、jQuery以及FastAdmin框架中实现页…...
从零开始搭建一个node.js后端服务项目
目录 一、下载node.js及配置环境 二、搭建node.js项目及安装express框架 三、集成nodemon,实现代码热部署 四、Express 应用程序生成器 一、下载node.js及配置环境 网上很多安装教程,此处就不再赘述了 版本信息 C:\Users\XXX>node -v v20.15.0…...
自定义注解和组件扫描在Spring Boot中动态注册Bean(一)
博客主页: 南来_北往 系列专栏:Spring Boot实战 在Spring Boot中,自定义注解和组件扫描是两种强大的机制,它们允许开发者以声明性的方式动态注册Bean。这种方式不仅提高了代码的可读性和可维护性,还使得Spring Boot应用的…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
FFmpeg avformat_open_input函数分析
函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...
