使用 jsoup 實現簡單的 java 爬蟲

本人使用過 htmlpaser 和 jsoup 寫過一些爬蟲項目。

個人感覺 jsoup 比 htmlpaser 好用的不止一點,jsoup 能使用類似 css 選擇器的語法去篩選想要的節點,而 htmlpaser 則需要使用選擇器類對象。jsoup 的使用和 jquery 比較像,對於使用 jquery 很熟練的我來說,毫不猶豫的放棄了 htmlpaser 的使用,對 jsoup 愛不釋手。


本文只是簡單的 jsoup maven demo,爬取寫個人需要的網頁數據基本是夠用了。詳細的學習可以參見下面的網址。

JSOUP 教程—— Java爬蟲,簡易入門,秒殺htmlparser

 jsoup Cookbook(中文版)

易百教程——JSoup教程 


 maven依賴 (非maven項目可以去 mvnrepository 下載 jar 包)

<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.10.2</version>
</dependency>

Java 單元測試還需要 junit 包(當然也可以用 main函數啓動,個人建議使用 junit 啓動)

<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.2.0</version>
    <scope>test</scope>
</dependency>

JsoupTest.java

package com.design.maven;

import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.junit.jupiter.api.Test;

import java.io.File;
import java.io.IOException;
import java.net.URL;

/**
 * @author Administrator
 */
class JsoupTest {

    /**
     * 得到 document 對象的幾種方式
     */
    @Test
    void getDocument() {
        // 1. 直接從字符串中輸入 HTML 文檔
        String htmlStr = "<html><head><title>學習使我快樂</title></head><body><p>好好學習,天天向上</p></body></html>";
        Document document1 = Jsoup.parse(htmlStr);

        try {
            // 2. 從文件中加載 HTML 文檔
            File file = new File("src/main/resources/index.html");
            Document document2 = Jsoup.parse(file, "UTF-8", null);

            // 3. 從 URL 使用 GET 方法直接加載 HTML 文檔
            Document document3 = Jsoup.connect("http://www.baidu.com/").get();

            // 4. 從 URL 使用 POST 方法直接加載 HTML 文檔
            Document document4 = Jsoup.connect("http://www.baidu.com/").post();

            // 5. 從 URL 使用 execute 方法獲取響應, 從響應流中解析出 HTML 文檔
            Connection.Response response = Jsoup.connect("http://www.baidu.com/").execute();
            Document document5 = response.parse();

        } catch (IOException e) {
            e.printStackTrace();
        }

        String title = document1.title();
        System.out.println(title);
    }

    @Test
    void parseUrl() {
        try {
            URL url = new URL("https://xingzhengquhua.51240.com/");

            Document document = Jsoup.parse(url, 300);

            // 解析出的 document 的對象, 可以使用像 jquery 的選擇器語法去篩選想要的節點
            // 例如: cssQuery: "table.kuang_biaoge tbody table"
            //      篩選 類名爲 kuang_biaoge的 table 標籤下的 tbody 標籤下的所有 table 標籤節點
            Elements items = document.select("table.kuang_biaoge tbody table");

            // 注意 select() 方法返回的 Elements 類型, 是多個節點
            // document.getElementById() 返回的 是唯一的 Element 對象
            // 其他 document.getElementByXXXXX 返回的基本都是 Elements 類型

            Element element = items.get(0);
            Elements tr = element.select("tr");
            for (Element e : tr) {
                System.out.println(e);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Test
    void parseString() {
        String string = "<table width=\"100%\" border=\"0\" cellpadding=\"8\" cellspacing=\"1\">\n" +
                " <tbody>\n" +
                "  <tr>\n" +
                "   <td colspan=\"3\" bgcolor=\"#FFFFFF\"><a href=\"/\">全國</a></td>\n" +
                "  </tr>\n" +
                "  <tr>\n" +
                "   <td bgcolor=\"#F5F5F5\">所轄行政區</td>\n" +
                "   <td bgcolor=\"#F5F5F5\">行政區劃代碼</td>\n" +
                "   <td bgcolor=\"#F5F5F5\">城鄉分類</td>\n" +
                "  </tr>\n" +
                "  <tr>\n" +
                "   <td bgcolor=\"#FFFFFF\"><a href=\"/110000000000__xingzhengquhua/\">北京市</a></td>\n" +
                "   <td bgcolor=\"#FFFFFF\"><a href=\"/110000000000__xingzhengquhua/\">110000000000</a></td>\n" +
                "   <td bgcolor=\"#FFFFFF\"></td>\n" +
                "  </tr>\n" +
                " </tbody>\n" +
                "</table>\n" +
                "\n" +
                "Process finished with exit code 0\n";

        Document document = Jsoup.parse(string);

        Elements items = document.select("table tbody");
        Element element = items.get(0);
        Elements tr = element.select("tr");
        for (Element e : tr) {
            System.out.println(e);
        }
    }

    @Test
    void Test() {
        try {
            // Document doc = Jsoup.connect("https://search.jd.com/Search?keyword=手機&enc=utf-8&wq=手機&pvid=6e71aa1c0d654157add4cb5f08cd1f28")
            //        .header("Accept", "*/*")
            //        .header("Accept-Encoding", "gzip, deflate")
            //        .header("Accept-Language", "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3")
            //        .header("Referer", "https://www.baidu.com/")
            //        .header("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0")
            //        .timeout(5000)
            //        .get();

            Document document = Jsoup.connect("https://search.jd.com/Search?keyword=手機&enc=utf-8&wq=手機&pvid=6e71aa1c0d654157add4cb5f08cd1f28").get();
            System.out.println(document);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

Github地址:https://github.com/liu1125/jsoupdemo

https://github.com/liu1125/jsoupdemo.git
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章