Web 抓取工具 Java

Web Scraping 也稱為數據抓取、網絡收穫或網絡爬行,用於從網頁中提取數據。網絡抓取工具可以使用不同的方法來提取信息。例如,XPath、CSS 選擇器、自定義過濾器、HTML 導航等。根據這些場景,本文介紹瞭如何使用 Java 以編程方式創建網絡抓取工具。

Java Web 抓取庫配置

Aspose.HTML for Java API 支持使用不同的技術提供網絡抓取功能。您可以通過從 下載 頁面下載 JAR 文件或在項目的 pom.xml 文件中使用以下 Maven 配置來訪問 API:

存儲庫:

 <repositories>
     <repository>
         <id>snapshots</id>
         <name>repo</name>
         <url>http://repository.aspose.com/repo/</url>
     </repository>
</repositories>

依賴:

 <dependencies>
    <dependency>
        <groupId>com.aspose</groupId>
        <artifactId>aspose-html</artifactId>
        <version>21.12</version>
        <classifier>jdk17</classifier>
    </dependency>
</dependencies>

在 Java 中使用 HTML 導航進行網頁抓取

您可以使用 Node 類來導航 HTML 頁面。下面的代碼片段演示瞭如何在 Java 中導航 HTML 文檔:

// 準備 HTML 代碼
String html_code = "<span>Hello</span> <span>World!</span>";

// 從準備好的代碼初始化文檔
com.aspose.html.HTMLDocument document = new com.aspose.html.HTMLDocument(html_code, ".");
try {
    // 獲取對 BODY 的第一個孩子(第一個 SPAN)的引用
    com.aspose.html.dom.Element element = document.getBody().getFirstElementChild();
    System.out.println(element.getTextContent()); // output: Hello

    // 獲取對第二個 SPAN 元素的引用
    element = element.getNextElementSibling();
    System.out.println(element.getTextContent()); // output: World!
} finally {
    if (document != null) {
        document.dispose();
    }
}

在 Java 中檢查 HTML 文檔及其元素

您可以使用元素遍歷方法來導航 HTML 頁面。下面的代碼示例詳細說明瞭如何在 Java 中檢查 HTML 文檔。

// 從文件加載文檔
String documentPath = "html_file.html";
var document = new com.aspose.html.HTMLDocument(documentPath);
{
    // 獲取文檔的html元素
    var element = document.getDocumentElement();                
    System.out.println(element.getTagName()); // HTML
    
    // 獲取html元素的最後一個元素
    element = element.getLastElementChild();
    System.out.println(element.getTagName()); // BODY
    
    // 獲取body元素的第一個元素
    element = element.getFirstElementChild();
    System.out.println(element.getTagName()); // H1
    System.out.println(element.getTextContent()); // Header 1     
}

Java 中 Web Scraper 的自定義過濾器用法

您可以設置自定義過濾器以跳過或接受特定過濾器以使用 Java 中的網絡抓取工具。下面的代碼示例詳細說明瞭如何使用 Java 在網絡抓取工具中使用自定義或用戶定義的過濾器:

public class OnlyImageFilter extends com.aspose.html.dom.traversal.filters.NodeFilter {

    @Override
    public short acceptNode(com.aspose.html.dom.Node n) {
        // 當前過濾器跳過所有元素,IMG 元素除外。
        return "img".equals(n.getLocalName()) ? FILTER_ACCEPT : FILTER_SKIP;
    }

}

隨後,在設置自定義過濾器後,您可以使用以下代碼片段輕鬆導航 HTML 頁面:

// 準備 HTML 代碼
String code = "    < p > Hello </p >\n" +
              "    <img src = 'image1.png' >\n" +
              "    <img src = 'image2.png' >\n" +
              "    <p > World ! </p >\n";

// 根據準備好的代碼初始化文檔
com.aspose.html.HTMLDocument document = new com.aspose.html.HTMLDocument(code, ".");
try {
    // 要啟動 HTML 導航,我們需要創建一個 TreeWalker 實例。
    // 指定的參數意味著它從文檔的根部開始遍歷所有節點並使用我們自定義的過濾器實現
    com.aspose.html.dom.traversal.ITreeWalker iterator = document.createTreeWalker(document, com.aspose.html.dom.traversal.filters.NodeFilter.SHOW_ALL, new OnlyImageFilter());
    // 利用
    while (iterator.nextNode() != null) {
        // 由於我們使用自己的過濾器,因此當前節點將始終是 HTMLImageElement 的一個實例。
        // 所以,我們在這裡不需要額外的驗證。
        com.aspose.html.HTMLImageElement image = (com.aspose.html.HTMLImageElement) iterator.getCurrentNode();

        System.out.println(image.getSrc());
        // 輸出:image1.png
        // 輸出:image2.png
    }
} finally {
    if (document != null) {
        document.dispose();
    }
}

在 Java 中使用 XPath 查詢進行 Web 抓取

您可以使用 XPath 根據不同的標準選擇 HTML 文檔的不同節點。下面的代碼演示瞭如何在 Java 中使用 XPath 查詢執行網頁抓取:

// 準備 HTML 代碼
String code = "< div class='happy' >\n" +
              "        <div >\n" +
              "            <span > Hello ! </span >\n" +
              "        </div >\n" +
              "    </div >\n" +
              "    <p class='happy' >\n" +
              "        <span > World </span >\n" +
              "    </p >\n";

// 根據準備好的代碼初始化文檔
com.aspose.html.HTMLDocument document = new com.aspose.html.HTMLDocument(code, ".");
try {
    // 在這裡,我們評估 XPath 表達式,其中我們從“class”屬性等於“happy”的元素中選擇所有子 SPAN 元素:
    com.aspose.html.dom.xpath.IXPathResult result = document.evaluate("//*[@class='happy']//span",
            document,
            null,
            com.aspose.html.dom.xpath.XPathResultType.Any,
            null
    );

    // 遍歷結果節點
   for (com.aspose.html.dom.Node node; (node = result.iterateNext()) != null; ) {
        System.out.println(node.getTextContent());
        // 輸出:你好
        // 輸出:世界!
    }
} finally {
    if (document != null) {
        document.dispose();
    }
}

在 Java 中使用 CSS 選擇器進行 Web 抓取

您可以使用 CSS 選擇器在網絡抓取工具中搜索所需的項目。您可以指定一個參數作為查詢選擇器,然後將匹配該選擇器的列表返回給網絡抓取器。以下代碼示例展示瞭如何在使用 Java 的網絡抓取工具中使用 CSS 選擇器:

// 準備 HTML 代碼
String code = "< div class='happy' >\n" +
              "        <div >\n" +
              "            <span > Hello </span >\n" +
              "        </div >\n" +
              "    </div >\n" +
              "    <p class='happy' >\n" +
              "        <span > World ! </span >\n" +
              "    </p >\n";

// 根據準備好的代碼初始化文檔
com.aspose.html.HTMLDocument document = new com.aspose.html.HTMLDocument(code, ".");
try {
    // 在這裡,我們創建了一個 CSS 選擇器,用於提取“class”屬性等於“happy”的所有元素及其子 SPAN 元素
    com.aspose.html.collections.NodeList elements = document.querySelectorAll(".happy span");

    // 迭代結果元素列表
    elements.forEach(element -> {
        System.out.println(((com.aspose.html.HTMLElement) element).getInnerHTML());
        // 輸出:你好
        // 輸出:世界!
    });
} finally {
    if (document != null) {
        document.dispose();
    }
}

結論

在本文中,您探索了可用於在 Java 中創建網絡抓取工具的不同方法。您只需使用 Aspose.HTML for Java 庫進行一些 API 調用,即可在 Java 中創建網絡抓取工具。您可以在本文中探索 HTML 導航、CSS 選擇器、自定義過濾器和 XPath 查詢技術。此外,如果您需要任何進一步的信息或任何幫助,請隨時通過 論壇 與我們聯繫。

也可以看看

在 Java 中將 EPUB 轉換為 XPS