在进行一些数据收集、图像处理或研究工作时,我们可能需要从网络上批量下载高质量的图片。本文将介绍如何使用 Java 和 Jsoup
库,从搜索引擎中抓取图片,解析详情页并过滤出高质量图片。通过以下几个步骤,您可以自动化这个图片收集的过程。
前置条件
- 环境:确保您的开发环境配置了 Java 8+ 和
Jsoup
库。 - 工具依赖:引入
Jsoup
库,通过Maven
或Gradle
直接添加依赖。
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.15.3</version>
</dependency>
基本思路
- 构建搜索 URL:通过搜索引擎构建一个带有关键字的查询 URL,限制结果为高分辨率图片。
- 解析搜索结果页面:获取所有图片链接或详情页链接。
- 进入详情页抓取大图:访问详情页,提取大图的真实 URL。
- 质量过滤与下载:根据图片尺寸、类型等条件,过滤并下载符合要求的图片。
步骤一:构建搜索 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();
}
}
完整代码
将以上方法整合,形成一个完整的批量图片下载程序。以下是完整的工作流程:
- 构建并发送搜索请求,获取搜索结果。
- 解析搜索结果页面,抓取每张图片的详情页 URL。
- 访问详情页,筛选符合条件的大图。
- 下载高质量图片并保存至本地。
总结
通过上述步骤,我们实现了一个简单的批量图片下载工具。整个过程涉及 URL 构建、HTML 解析、图片过滤和下载等多个步骤,适用于数据收集或批量处理需求。在实际应用中,建议加入适当的延迟控制访问频率,以避免触发搜索引擎的限制。