当前位置: 首页 > 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 解析、图片过滤和下载等多个步骤,适用于数据收集或批量处理需求。在实际应用中,建议加入适当的延迟控制访问频率,以避免触发搜索引擎的限制。

http://www.lryc.cn/news/474753.html

相关文章:

  • 基于Matlab GUI的说话人识别测试平台
  • Leetcode 热题100之二叉树2
  • <项目代码>YOLOv8 煤矸石识别<目标检测>
  • GA/T1400视图库平台EasyCVR视频分析设备平台微信H5小程序:智能视频监控的新篇章
  • LVM与磁盘配额
  • xmuoj [蒙德里安的梦想] 状压dp个人笔记
  • ubuntu22安装搜狗输入法不能输入中文
  • HtmlAgilityPack 操作详解
  • 基于SSM医院门诊互联电子病历管理系统的设计
  • 【读书笔记/深入理解K8S】集群网络
  • 【专有网络VPC】连接公网
  • 论文 | Legal Prompt Engineering for Multilingual Legal Judgement Prediction
  • 国科安芯抗辐照MCU和CANFD芯片发布
  • C++ 并发专题 - 无锁数据结构(概述)
  • NLP领域的经典算法和模型
  • 提升安全上网体验:Windows 11 启用 DOH(阿里公共DNS)
  • 论文概览 |《Journal of Transport Geography》2024.10 Vol.120
  • yum不能使用: cannot find a valid baseurl for repo: base/7/x86_64
  • 什么品牌的护眼台灯比较好?五款护眼效果比较明显的护眼台灯
  • HTML 表单设计与验证
  • qt QDialog详解
  • supervisor服务“Exited too quickly“解决方案
  • 动态规划 —— 路径问题-地下城游戏
  • 沈阳乐晟睿浩科技有限公司抖音小店短视频时代的电商蓝海
  • ubuntu20.04安装ros与rosdep
  • 推理加速papers
  • 【02基础】- RabbitMQ基础
  • vue3中跨层传递provide、inject
  • Nacos-1.4.6升级2.3.2
  • 东识集中文印管理系统|DW-S408系统的主要功能