jsoup是一款Java的HTML解析器,可直接解析某個URL地址、HTML文本內容。它提供了一套非常省力的API,可通過DOM,CSS以及類似於jQuery的操作方法來取出和操作數據。
在爬蟲的時候,當我們用HttpClient之類的框架,獲取到網頁源碼之後,需要從網頁源碼中取出我們想要的內容,
就可以使用jsoup這類HTML解析器了。可以非常輕鬆的實現。
雖然jsoup也支持從某個地址直接去爬取網頁源碼,但是隻支持HTTP,HTTPS協議,支持不夠豐富。
1、代碼部分
package com.jincou.pachong;
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
/*
* 這個案例你只需要看結果,具體的jsoup介紹下一篇博客會詳細介紹
*/
public class Pachong {
public static void main(String args[]){
//這個就是博客中的java反射的url
final String url= "https://www.cnblogs.com/qdhxhz/p/9230805.html";
try {
//先獲得的是整個頁面的html標籤頁面
Document doc = Jsoup.connect(url).get();
//獲取正文標題,因爲整片文章只有標題是用h1標籤
Elements btEl = doc.select("H1");
String bt=btEl.text();
System.out.println("========正文標題======:");
System.out.println(bt);
//獲取二級標題
Elements ejbtEls = doc.select("H2");
//因爲整片文章有多個二級標題所以進行拼接
StringBuilder ejbts=new StringBuilder();
for(Element el :ejbtEls) {
ejbts.append(el.text());
ejbts.append("\n");
}
String ejbt=ejbts.toString();
System.out.println("=======二級標題=========:");
System.out.println(ejbt);
//獲取時間
Elements timeEl = doc.select("#post-date");
String time=timeEl.text();
System.out.println("========發佈時間=========:");
System.out.println("發佈時間:" + time);
//獲取閱讀數量
Elements readEl = doc.select("#post_view_count");
String read=readEl.text();
System.out.println("========閱讀數量=========:");
System.out.println("閱讀數量:" + read);
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.middletrans;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;
import java.text.SimpleDateFormat;
public class Pachong implements Runnable {
public static void main(String[] args) {
Pachong pachong = new Pachong();
pachong.run();
}
public void run() {
String Rpt_date = null;
double price = 0;
// 網頁地址
String url = "http://www.sse.net.cn/index/singleIndex?indexType=cbcfi";
// 本地html
File in = new File("F:/index.html");
try {
// Document doc = Jsoup.connect(url).get();
Document doc = Jsoup.parse(in, "UTF-8", "");
// 獲取第一個表格
Element element = doc.select("table").first();
System.out.println(element);
Elements els = element.select("tr");
for (Element el : els) {
Elements ele = el.select("td");
for (Element elem : ele) {
System.out.println("elem.text().toString()" + elem.text().toString());
if (elem.text().toString().indexOf("本期") != -1) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Rpt_date = elem.text().toString().substring(3);
}
if (elem.text().toString().equals("秦皇島-廣州(6-7萬DWT)")) {
price = Double.parseDouble(el.select("td").get(3).text().toString());
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
// 以下是將爬取到的數據保存到MySQL數據庫
// InputStream in = GetOCFIAll.class.getClassLoader().getResourceAsStream("config.property");
// String dbURL = "";
// String userName = "";
// String userPwd = "";
// Properties properties = new Properties();
// try {
// properties.load(in);
// dbURL = (String) properties.get("dburl");
// userName = (String) properties.get("dbuser");
// userPwd = (String) properties.get("dbpwd");
// } catch (Exception e) {
// e.printStackTrace();
// }
//
// try {
// Connection dbConn = DriverManager.getConnection(dbURL, userName, userPwd);
// Statement statement = dbConn.createStatement();
// String query = "SQL語句";
// statement.addBatch(query);
// statement.executeBatch();
// statement.close();
// dbConn.close();
// } catch (Exception e) {
// // TODO: handle exception
// e.printStackTrace();
// }
}
}
2.運行結果
注意:我們發現該篇文章的信息都已經爬到了,但是爲什麼閱讀數量是...
案例講解
首先我們要知道:jsoup 是一款Java 的HTML解析器,可直接解析某個URL地址、HTML文本內容。它提供了一套非常省力的API,可通過DOM,CSS以及類似於jQuery的操作方法來取出和操
作數據。上面這兩點很關鍵,具體細說。
1、如何爬到正文標籤
我們看到正文標題的html標籤是h1標籤,所以我們只要獲得H1標籤元素,就可以爬到文本。那麼同樣的二級標籤也是通過H2標籤爬到就可以。
2、如何獲得發佈時間
因爲時間的標籤id是post-date,所以可以通過id獲得該標籤元素。
3、爲什麼閱讀數量是...
我們看到頁面閱讀是有的,但爬蟲爬到確實...?
這是爲什麼呢,這點很重要。那是因爲該靜態頁面初始加載的時候是沒有閱讀數量的,閱讀數量是後來接口重新調取的。什麼意思呢?其實很好理解所以你寫一篇文章的時候像標題,內容,時間
等等是不太會變動的,但是你的閱讀數量每訪問一次都會改變,所以不可能把閱讀數量和文章放在一張表裏,而是分開放然後id關聯就可以。這樣就避免每次update文章表。所以靜態頁面初始是沒有
閱讀數量的。
那如何驗證是不是這樣。請看。
我們發現初始的html頁面的閱讀量和評論都是沒有的,而是默認...,所以上面爬到的就是...
那如何能爬到真實的閱讀量呢,這個就需要知道它真實的接口是什麼,然後通過其它工具來爬,我們看下獲取閱讀量的真實接口。
既然知道閱讀量的真實接口,那麼爬到它也就簡單了。
注意:通過這裏我們要明白,只有html元素有的情況下,才能通過jsoup來爬蟲,如果是這接口獲得的數據,那麼通過jsoup是無法獲取到的。
有關jsoup也是自己的理解,如有不正確請留言指點。
參考案例網址:
百度百科 https://baike.baidu.com/item/jsoup
jsoup教程 https://www.jianshu.com/p/fd5caaaa950d
jsoup案例 https://www.cnblogs.com/qdhxhz/p/9338834.html