获取图片分为两步:从 HTML 提取地址,再按地址下载。搜索结果能显示图片不代表你拥有使用许可;缩略图、原图和页面地址也可能不同。
先解析自己准备的页面
使用 Java HTML 解析教程 的 Maven 依赖。保存 ImageLinksDemo.java,与 HtmlDemo 放在同一个目录:
import org.jsoup.Jsoup;
public class ImageLinksDemo { public static void main(String[] args) { var document = Jsoup.parse(""" <img src="/images/demo.jpg" alt="示例图片"> <img data-src="/images/lazy.png"> """, "https://example.com/"); for (var image : document.select("img")) { String attr = image.hasAttr("src") ? "src" : "data-src"; String url = image.absUrl(attr); if (!url.isBlank()) System.out.println(url); } }}mvn packagejava -cp 'target/classes;target/dependency/*' ImageLinksDemo预期得到 /images/demo.jpg 和 /images/lazy.png 对应的两个完整地址。真实页面还可能使用 srcset、picture 或 JavaScript 加载,需检查响应 HTML 后再决定解析方式。
下载前检查什么
确认地址协议、响应状态、Content-Type 和大小上限。保留查询参数,它们可能包含图片转换、签名或有效期;删除参数不保证得到原图,可能使地址失效。
旧 Bing/百度抓包接口及固定 class 选择器依赖内部实现,不作为这里的可复制步骤。需要搜索结果时,使用平台提供并允许使用的 API;下载失败、鉴权失败和没有图片分别处理。
若在服务器接受用户提供的 URL,还需要限制可访问主机和重定向,防止请求内网地址。不要直接把原文件名当本地路径,也不要把搜索结果中的 HTML 不经处理插入页面。
参考:jsoup URL 处理。
评论