本人使用過 htmlpaser 和 jsoup 寫過一些爬蟲項目。
個人感覺 jsoup 比 htmlpaser 好用的不止一點,jsoup 能使用類似 css 選擇器的語法去篩選想要的節點,而 htmlpaser 則需要使用選擇器類對象。jsoup 的使用和 jquery 比較像,對於使用 jquery 很熟練的我來說,毫不猶豫的放棄了 htmlpaser 的使用,對 jsoup 愛不釋手。
本文只是簡單的 jsoup maven demo,爬取寫個人需要的網頁數據基本是夠用了。詳細的學習可以參見下面的網址。
JSOUP 教程—— Java爬蟲,簡易入門,秒殺htmlparser
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