ดึงรูปภาพจากเว็บไซต์ด้วย Java
Aspose.HTML for Java
โหลดหน้าเว็บลงใน HTMLDocument และเปิดให้อ่านองค์ประกอบผ่าน HTML DOM รวบรวมองค์ประกอบ <img> อ่านแอตทริบิวต์ src แต่ละรายการ แปลงเส้นทางสัมพัทธ์เป็น URL แบบสัมบูรณ์โดยใช้ URI ฐานของเอกสาร และส่งคำขอสำหรับแต่ละรูปภาพผ่านบริการเครือข่ายของเอกสาร
กระบวนการนี้ดาวน์โหลดข้อมูลไบต์ของทรัพยากรที่หน้าเว็บอ้างอิง โดยไม่แปลงหรือเข้ารหัสรูปภาพใหม่ JPEG, PNG, GIF, WebP, SVG และรูปแบบรูปภาพอื่นจึงคงอยู่ในรูปแบบที่เซิร์ฟเวอร์ส่งกลับมา
ดาวน์โหลดรูปภาพจากเว็บไซต์ด้วย Java
ตัวอย่างนี้เปิดหน้าเว็บสาธารณะ รวบรวมค่า src ที่ไม่ซ้ำกัน และบันทึกการตอบกลับที่สำเร็จลงในไดเรกทอรี images คำนำหน้าแบบตัวเลขช่วยป้องกันไม่ให้ไฟล์ที่มีชื่อพาธ URL เดียวกันเขียนทับกัน
ดึงรูปภาพจากเว็บไซต์ด้วย Java
Path outputDirectory = Paths.get("images");
Files.createDirectories(outputDirectory);
try (HTMLDocument document = new HTMLDocument("https://docs.aspose.com/html/java/web-accessibility-rules/")) {
// Collect distinct image sources from the HTML document
HTMLCollection images = document.getElementsByTagName("img");
Set<String> sources = new LinkedHashSet<>();
for (Element image : images) {
String source = image.getAttribute("src");
if (!source.isEmpty()) {
sources.add(source);
}
}
int imageNumber = 1;
for (String source : sources) {
// Resolve a relative source against the document base URI
Url imageUrl = new Url(source, document.getBaseURI());
RequestMessage request = new RequestMessage(imageUrl);
ResponseMessage response = document.getContext().getNetwork().send(request);
if (!response.isSuccess()) {
continue;
}
Path urlPath = Paths.get(imageUrl.getPathname());
Path name = urlPath.getFileName();
String fileName = name == null || name.toString().isEmpty()
? "image"
: name.toString();
Path outputPath = outputDirectory.resolve(imageNumber + "-" + fileName);
// Save the original response bytes
Files.write(outputPath, response.getContent().readAsByteArray());
imageNumber++;
}
}
ขั้นตอนการดึงรูปภาพจาก HTML ด้วย Java
- โหลดหน้าเป้าหมายด้วย
HTMLDocument - เรียก
getElementsByTagName("img")เพื่อรวบรวมองค์ประกอบรูปภาพ - อ่านค่า
srcที่ไม่ว่าง และเก็บเฉพาะแหล่งที่มาไม่ซ้ำกัน - แปลงแหล่งที่มาแบบสัมพัทธ์แต่ละรายการเป็น URL แบบสัมบูรณ์ด้วย
Urlและdocument.getBaseURI() - ส่ง
RequestMessageสำหรับแต่ละรูปภาพ และตรวจสอบResponseMessage - สร้างชื่อไฟล์ภายในเครื่องที่ไม่ซ้ำกัน และเขียนข้อมูลไบต์ของการตอบกลับด้วย
Files.write()
Java สามารถดึงรูปภาพใดจากเว็บไซต์ได้บ้าง?
ตัวอย่างนี้ดึงทรัพยากรเครือข่ายที่อ้างอิงโดยตรงผ่านแอตทริบิวต์ src ขององค์ประกอบ <img> นอกจากนี้ยังแปลงเส้นทางสัมพัทธ์เป็น URL แบบสัมบูรณ์ รวมถึงเส้นทางที่ได้รับผลจากองค์ประกอบ <base> ของเอกสาร ก่อนส่งคำขอแต่ละรายการ รูปแบบคำขอเดียวกันสามารถใช้กับ URL ของทรัพยากรอื่นได้หลังจากค้นพบใน DOM หรือ CSS
ดูตัวอย่างฉบับสมบูรณ์ได้ที่ Extract Images From Website in Java
ข้อควรระวังในการดึงรูปภาพ
- คงรูปแบบรูปภาพที่ได้รับ โค้ดบันทึกเนื้อหาการตอบกลับโดยไม่แปลงรูปแบบ เมื่อ URL ไม่มีนามสกุลที่เชื่อถือได้ ให้ตรวจสอบชนิดเนื้อหาของการตอบกลับและกำหนดชื่อไฟล์ภายในเครื่องที่เหมาะสม
- หลีกเลี่ยงชื่อไฟล์ซ้ำกัน URL ของรูปภาพต่างกันอาจลงท้ายด้วยชื่อไฟล์เดียวกัน ตัวอย่างเพิ่มคำนำหน้าแบบตัวเลข แต่แอปพลิเคชันที่ใช้งานจริงอาจใช้แฮชหรือกฎการตั้งชื่อที่คงที่แบบอื่น
- ตรวจสอบการตอบกลับทุกครั้ง คำขอรูปภาพอาจส่งคืนหน้าแสดงข้อผิดพลาด การตอบกลับการยืนยันตัวตน การเปลี่ยนเส้นทาง หรือทรัพยากรที่ไม่พร้อมใช้งานแทนข้อมูลไบต์ของรูปภาพ
- เตรียมพร้อมสำหรับทรัพยากรขนาดใหญ่
readAsByteArray()เก็บรูปภาพทั้งหมดไว้ในหน่วยความจำ ใช้การประมวลผลแบบสตรีมเมื่อหน้าเว็บอาจอ้างอิงไฟล์ขนาดใหญ่หรือรูปภาพจำนวนมาก - ตรวจสอบแหล่งข้อมูลที่ไม่น่าเชื่อถือ จำกัดรูปแบบและโฮสต์ที่อนุญาตเมื่อ URL ของหน้าหรือเส้นทางรูปภาพมาจากผู้ใช้ และบันทึกไฟล์เฉพาะในไดเรกทอรีที่อนุมัติแล้ว
- เคารพลิขสิทธิ์และข้อกำหนดของเว็บไซต์ ดึงและนำกลับมาใช้เฉพาะรูปภาพที่เป็นของคุณหรือที่คุณได้รับอนุญาตเท่านั้น การเข้าถึงแบบสาธารณะไม่ได้ให้สิทธิ์ในการคัดลอก เผยแพร่ต่อ หรือใช้รูปภาพในเชิงพาณิชย์
คำถามที่พบบ่อย
1. จะดึงรูปภาพแบบ responsive และ lazy loading จาก HTML ด้วย Java ได้อย่างไร?
ตรวจสอบ src, srcset และองค์ประกอบ <picture><source> รวมถึงแอตทริบิวต์เฉพาะของหน้า เช่น data-src ที่เก็บ URL ของรูปภาพซึ่งโหลดภายหลัง แปลง URL ที่เลือกแต่ละรายการเป็น URL แบบสัมบูรณ์โดยใช้ URI ฐานของเอกสารก่อนส่งคำขอทรัพยากรรูปภาพ
2. จะดึงรูปภาพพื้นหลัง CSS จากเว็บไซต์ด้วย Java ได้อย่างไร?
ตรวจสอบสไตล์ชีตภายนอกและแอตทริบิวต์ style แบบอินไลน์เพื่อหาการประกาศ background-image แปลงค่า CSS url() แต่ละรายการเป็น URL แบบสัมบูรณ์โดยใช้ URL ฐานของสไตล์ชีตหรือเอกสาร แล้วส่งคำขอและบันทึกทรัพยากรที่อ้างอิงแยกกัน
3. การดึงรูปภาพจากเว็บไซต์รักษาไฟล์ JPEG, PNG, GIF, WebP หรือ SVG ไว้หรือไม่?
การเขียนข้อมูลไบต์ที่ดาวน์โหลดโดยไม่เข้ารหัสใหม่จะรักษารูปแบบรูปภาพที่เซิร์ฟเวอร์ส่งกลับ หาก URL ของทรัพยากรไม่มีนามสกุลที่เชื่อถือได้ ให้ใช้ชนิดเนื้อหาของการตอบกลับเพื่อกำหนดชื่อไฟล์ภายในเครื่อง
4. Aspose.HTML for Java สามารถดึงไอคอนของเว็บไซต์ได้หรือไม่?
ไอคอนของเว็บไซต์มักอ้างอิงด้วยองค์ประกอบ <link> ซึ่งค่า rel มีคำว่า icon รวบรวมองค์ประกอบเหล่านั้น อ่านแอตทริบิวต์ href แปลง URL สัมพัทธ์เป็น URL แบบสัมบูรณ์ และดาวน์โหลดทรัพยากรผ่านบริการเครือข่ายของเอกสาร
ติดตั้ง Aspose.HTML for Java
เพิ่ม Aspose.HTML for Java จากที่เก็บอย่างเป็นทางการของ Aspose แทนที่ ASPOSE_HTML_VERSION ด้วยหมายเลขเวอร์ชันที่ตรงกันจากหน้า
รุ่นของ Aspose.HTML for Java
จากนั้นโหลดหรือสร้างโครงการใหม่เพื่อให้ระบบแก้ไขการขึ้นต่อกันได้
เพิ่มที่เก็บและการขึ้นต่อกันในโครงการ Maven:
Maven – pom.xml
<repositories>
<repository>
<id>AsposeJavaAPI</id>
<url>https://releases.aspose.com/java/repo/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.aspose</groupId>
<artifactId>aspose-html</artifactId>
<version>ASPOSE_HTML_VERSION</version>
</dependency>
</dependencies>เพิ่มที่เก็บและการขึ้นต่อกันในโครงการ Gradle:
Gradle – build.gradle
repositories {
maven {
url = uri('https://releases.aspose.com/java/repo/')
}
}
dependencies {
implementation 'com.aspose:aspose-html:ASPOSE_HTML_VERSION'
}ใช้ JDK ที่เข้ากันได้กับรุ่นที่เลือก สำหรับการติดตั้ง JAR ด้วยตนเอง Kotlin DSL การอัปเดต และการแก้ไขปัญหาการขึ้นต่อกัน โปรดดู ติดตั้ง Aspose.HTML for Java
งานดึงข้อมูลที่เกี่ยวข้องใน Java
ศึกษาการดาวน์โหลดจาก URL การดึง SVG ศูนย์รวมการดึงข้อมูล หรือภาพรวม Aspose.HTML for Java API ต่อไป