ดึงรูปภาพจากเว็บไซต์ด้วย 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

  1. โหลดหน้าเป้าหมายด้วย HTMLDocument
  2. เรียก getElementsByTagName("img") เพื่อรวบรวมองค์ประกอบรูปภาพ
  3. อ่านค่า src ที่ไม่ว่าง และเก็บเฉพาะแหล่งที่มาไม่ซ้ำกัน
  4. แปลงแหล่งที่มาแบบสัมพัทธ์แต่ละรายการเป็น URL แบบสัมบูรณ์ด้วย Url และ document.getBaseURI()
  5. ส่ง RequestMessage สำหรับแต่ละรูปภาพ และตรวจสอบ ResponseMessage
  6. สร้างชื่อไฟล์ภายในเครื่องที่ไม่ซ้ำกัน และเขียนข้อมูลไบต์ของการตอบกลับด้วย 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 ต่อไป