当前位置: 首页 > news >正文

使用 Java 实现从搜索引擎批量下载图片

在进行一些数据收集、图像处理或研究工作时,我们可能需要从网络上批量下载高质量的图片。本文将介绍如何使用 Java 和 Jsoup 库,从搜索引擎中抓取图片,解析详情页并过滤出高质量图片。通过以下几个步骤,您可以自动化这个图片收集的过程。

前置条件

  • 环境:确保您的开发环境配置了 Java 8+ 和 Jsoup 库。
  • 工具依赖:引入 Jsoup 库,通过 MavenGradle 直接添加依赖。
<dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.15.3</version>
</dependency>

基本思路

  1. 构建搜索 URL:通过搜索引擎构建一个带有关键字的查询 URL,限制结果为高分辨率图片。
  2. 解析搜索结果页面:获取所有图片链接或详情页链接。
  3. 进入详情页抓取大图:访问详情页,提取大图的真实 URL。
  4. 质量过滤与下载:根据图片尺寸、类型等条件,过滤并下载符合要求的图片。

步骤一:构建搜索 URL

搜索引擎提供了 URL 参数限制,我们可以添加关键字和图片大小筛选条件。以bing搜索为例,在 Bing 的 URL 中可以使用 imagesize-huge 参数过滤出大尺寸图片。例如:

private static final String BASE_URL = "https://cn.bing.com/images/search?q=%s&form=ANNTH1&qft=+filterui:imagesize-huge";

其中 %s 为占位符,可动态替换为需要查询的关键字。

步骤二:解析搜索结果页面

使用 Jsoup 加载搜索结果页面并解析出所有图片的详情页链接。以下代码示例展示了如何提取搜索结果中的详情页链接:

public static void downloadLargeImages(String searchValue) {try {String searchUrl = String.format(BASE_URL, searchValue);Document document = Jsoup.connect(searchUrl).get();// 选择所有带有详情链接的元素Elements linkElements = document.select("a[class*='item-link']"); //(以实际情况为准)int count = 0;for (Element linkElement : linkElements) {if (count >= 10) break;  // 设置下载数量上限// 获取详情页链接String detailPageUrl = linkElement.absUrl("href");if (!detailPageUrl.isEmpty()) {processDetailPage(detailPageUrl, count);count++;}}} catch (IOException e) {e.printStackTrace();}
}

步骤三:进入详情页抓取大图

在详情页中,通过 img 标签或特定属性来筛选大图的 URL。此处使用 img 标签的 src 属性,并进行其他属性检查,以确保我们下载的是大图而非缩略图。

private static void processDetailPage(String detailPageUrl, int count) {try {Document detailPage = Jsoup.connect(detailPageUrl).get();// 查找所有 img 标签Elements imgElements = detailPage.select("img");for (Element imgElement : imgElements) {String imgUrl = imgElement.absUrl("src");// 过滤掉无效图片链接if (!imgUrl.startsWith("data:image/") && isHighQualityImage(imgUrl)) {downloadImage(imgUrl);break;}}} catch (IOException e) {e.printStackTrace();}
}

步骤四:质量过滤与下载

在下载图片前,确保图片符合质量要求(例如尺寸),避免下载不符合条件的小图或缩略图。我们可以使用 HTTP 请求获取图片的元数据或直接下载后通过 BufferedImage 获取尺寸信息:

private static boolean isHighQualityImage(String imgUrl) {try {HttpURLConnection connection = (HttpURLConnection) new URL(imgUrl).openConnection();connection.setRequestMethod("GET");connection.connect();BufferedImage img = ImageIO.read(connection.getInputStream());if (img != null && img.getWidth() >= 800 && img.getHeight() >= 600) {return true;}} catch (IOException e) {e.printStackTrace();}return false;
}

下载图片方法

使用 Java 的 ImageIO 将图片保存到本地,确保路径正确且避免重名文件。

private static void downloadImage(String imgUrl) {try (InputStream in = new URL(imgUrl).openStream()) {Files.copy(in, Paths.get("downloaded_images/" + UUID.randomUUID() + ".jpg"));System.out.println("图片下载成功:" + imgUrl);} catch (IOException e) {e.printStackTrace();}
}

完整代码

将以上方法整合,形成一个完整的批量图片下载程序。以下是完整的工作流程:

  1. 构建并发送搜索请求,获取搜索结果。
  2. 解析搜索结果页面,抓取每张图片的详情页 URL。
  3. 访问详情页,筛选符合条件的大图。
  4. 下载高质量图片并保存至本地。

总结

通过上述步骤,我们实现了一个简单的批量图片下载工具。整个过程涉及 URL 构建、HTML 解析、图片过滤和下载等多个步骤,适用于数据收集或批量处理需求。在实际应用中,建议加入适当的延迟控制访问频率,以避免触发搜索引擎的限制。

相关文章:

使用 Java 实现从搜索引擎批量下载图片

在进行一些数据收集、图像处理或研究工作时&#xff0c;我们可能需要从网络上批量下载高质量的图片。本文将介绍如何使用 Java 和 Jsoup 库&#xff0c;从搜索引擎中抓取图片&#xff0c;解析详情页并过滤出高质量图片。通过以下几个步骤&#xff0c;您可以自动化这个图片收集的…...

基于Matlab GUI的说话人识别测试平台

基于Matlab GUI的说话人识别测试平台 摘 要&#xff1a;为了克服在Matlab中语音处理工具箱的不足&#xff0c;设计出基于Matlab图形用户界面&#xff08;GUI&#xff09;的说话人识别测试平台。系统框架设计&#xff1a;特征参数采用美尔倒谱系数及差分美尔倒谱系数&#xff0c…...

Leetcode 热题100之二叉树2

1.二叉树的层序遍历 思路分析&#xff1a;层序遍历是逐层从左到右访问二叉树的所有节点&#xff0c;通常可以使用广度优先搜索&#xff08;BFS&#xff09;来实现。我们可以使用一个队列&#xff08;FIFO&#xff09;来存储每一层的节点&#xff0c;并逐层访问。 初始化队列&a…...

<项目代码>YOLOv8 煤矸石识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…...

GA/T1400视图库平台EasyCVR视频分析设备平台微信H5小程序:智能视频监控的新篇章

GA/T1400视图库平台EasyCVR是一款综合性的视频管理工具&#xff0c;它兼容Windows、Linux&#xff08;包括CentOS和Ubuntu&#xff09;以及国产操作系统。这个平台不仅能够接入多种协议&#xff0c;还能将不同格式的视频数据统一转换为标准化的视频流&#xff0c;通过无需插件的…...

LVM与磁盘配额

文章目录 LVM与磁盘配额1 LVM概述1.1 名词解释1.2 LVM优势 2 LVM相关命令2.1 创建逻辑卷过程2.2 对逻辑卷扩容 3 磁盘配额3.1 磁盘配额的特点3.2 磁盘配额的命令3.3 查看配额使用情况3.4 验证磁盘配额3.5 实验 LVM与磁盘配额 1 LVM概述 1.1 名词解释 LVM&#xff1a;logical…...

xmuoj [蒙德里安的梦想] 状压dp个人笔记

本题是状压dp经典题目&#xff0c;很多人都是通过这一题开始对状压dp有所了解。 在进行讲解之前&#xff0c;我们先通过几个问答大致了解状压dp。 一、问答 1. 问题&#xff1a;什么是状压dp? 回答&#xff1a;状压dp即为状态压缩动态规划&#xff0c;何为状态压缩&#x…...

ubuntu22安装搜狗输入法不能输入中文

关闭Wayland 在/etc/gdm3/custom.conf文件内&#xff0c;取消注释WaylandEnable cat /etc/gdm3/custom.conf | grep WaylandEnable WaylandEnablefalse 其它步骤参考搜狗官方教程 https://pinyin.sogou.com/linux/help.php...

HtmlAgilityPack 操作详解

目录 1.安装 HtmlAgilityPack 2. 示例 HTML 3. 使用 HtmlAgilityPack 进行 HTML 解析与操作 4. 代码详解 1.加载html文档 2.选择元素 3. 提取属性 4.修改属性 5.常用的几种获取元素的 XPath 写法 HtmlAgilityPack&#xff1a; 轻量且高效&#xff0c;适合进行常规的 H…...

基于SSM医院门诊互联电子病历管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;医生管理&#xff0c;项目分类管理&#xff0c;项目信息管理&#xff0c;预约信息管理&#xff0c;检查信息管理&#xff0c;系统管理 用户账号功能包括&#xff1a;系统首页&…...

【读书笔记/深入理解K8S】集群网络

前言 上一章讲了集群控制器的一个大概的原理&#xff0c;这一章讲一下集群网络。网络是集群通信的载体&#xff0c;因为该书是阿里云团队出品的&#xff0c;所以也以阿里云的集群网络方案为例&#xff0c;其他云厂商的网络集群方案一般来说也大同小异。所以通过本章的学习&…...

【专有网络VPC】连接公网

通过ECS实例固定公网IP、弹性公网IP、NAT网关、负载均衡使专有网络中的云资源可以访问公网&#xff08;Internet&#xff09;或被公网访问。 概述 专有网络是您自定义的云上私有网络。专有网络中的云资源默认无法访问公网&#xff0c;也无法被公网访问。您可以通过配置ECS实例…...

论文 | Legal Prompt Engineering for Multilingual Legal Judgement Prediction

这篇文章探讨了如何利用“法律提示工程”&#xff08;LPE&#xff09;来指导大型语言模型&#xff08;LLM&#xff09;进行多语言法律判决预测&#xff08;LJP&#xff09;。主要内容&#xff1a; LPE 的概念&#xff1a; LPE 是指通过设计特定的提示&#xff08;promp…...

国科安芯抗辐照MCU和CANFD芯片发布

国科安芯科技有限公司近期发布了两款重要的芯片产品&#xff1a;抗辐照MCU芯片和抗辐照CANFD芯片。这两款芯片的发布标志着国科安芯在高性能、高安全性芯片产品研制方面取得了显著进展&#xff0c;特别是在抗辐照技术领域。 1. 抗辐照MCU芯片&#xff1a;国科安芯研发的AS32A4…...

C++ 并发专题 - 无锁数据结构(概述)

一&#xff1a;概述&#xff1a; 无锁数据结构是一种在多线程环境中实现线程安全的结构&#xff0c;它允许多个线程在没有传统锁机制的情况下并发访问和修改数据。这种设计的目标是提高程序的性能和响应性&#xff0c;避免锁竞争和上下文切换的开销。 二&#xff1a;原理&…...

NLP领域的经典算法和模型

在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;经典算法和模型众多&#xff0c;它们在不同任务中发挥着重要作用。以下是一些NLP领域的经典算法和模型的详细介绍&#xff1a; 一、基础模型 词袋模型&#xff08;Bag of Words&#xff0c;BoW&#xff09; 原理&a…...

提升安全上网体验:Windows 11 启用 DOH(阿里公共DNS)

文章目录 阿里公共 DNS 介绍免费开通云解析 DNS 服务Windows 编辑 DNS 设置配置 IPv4配置 IPv6 路由器配置 DNS 阿里公共 DNS 介绍 https://alidns.com/ 免费开通云解析 DNS 服务 https://dnsnext.console.aliyun.com/pubDNS 开通服务后&#xff0c;获取 DOH 模板&#xff0…...

论文概览 |《Journal of Transport Geography》2024.10 Vol.120

本次给大家整理的是《Journal of Transport Geography》杂志2024年9月第120卷的论文的题目和摘要&#xff0c;一共包括17篇SCI论文&#xff01; 论文1 Modelling scenarios in planning for future employment growth in Stockholm 斯德哥尔摩未来就业增长规划情景建模 【摘要…...

yum不能使用: cannot find a valid baseurl for repo: base/7/x86_64

使用yum命令时报错&#xff1a; 原因&#xff1a; CentOS 已经停止维护的问题。2020 年 12 月 8 号&#xff0c;CentOS 官方宣布了停止维护 CentOS Linux 的计划&#xff0c;并推出了 CentOS Stream 项目&#xff0c;CentOS Linux 8 作为 RHEL 8 的复刻版本&#xff0c;生命周期…...

什么品牌的护眼台灯比较好?五款护眼效果比较明显的护眼台灯

在当今信息爆炸的时代背景下&#xff0c;挑选一款真正符合个人需求的护眼台灯&#xff0c;确实是一项不小的挑战。市场上品牌众多、型号繁杂&#xff0c;功能特点各不相同&#xff0c;价格区间也相当广泛&#xff0c;许多消费者在选购时往往感到迷茫不已。当大家询问“什么品牌…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

Python 训练营打卡 Day 47

注意力热力图可视化 在day 46代码的基础上&#xff0c;对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)

Name&#xff1a;3ddown Serial&#xff1a;FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名&#xff1a;Axure 序列号&#xff1a;8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...

前端调试HTTP状态码

1xx&#xff08;信息类状态码&#xff09; 这类状态码表示临时响应&#xff0c;需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分&#xff0c;客户端应继续发送剩余部分。 2xx&#xff08;成功类状态码&#xff09; 表示请求已成功被服务器接收、理解并处…...

用递归算法解锁「子集」问题 —— LeetCode 78题解析

文章目录 一、题目介绍二、递归思路详解&#xff1a;从决策树开始理解三、解法一&#xff1a;二叉决策树 DFS四、解法二&#xff1a;组合式回溯写法&#xff08;推荐&#xff09;五、解法对比 递归算法是编程中一种非常强大且常见的思想&#xff0c;它能够优雅地解决很多复杂的…...