爬蟲架構Jsoup入門及應用
第一個例子
- 第一個例子,我們來做一個爬取百度首頁的标題。如圖
爬蟲Jsoup入門及應用-看這一篇就夠了爬蟲架構Jsoup入門及應用擷取Document對象資料提取相關導航
- 建立一個Maven項目。
- 導入Jsoup依賴
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.3</version>
</dependency>
- 詳細代碼
public class Test {
public static void main(String[] args) throws IOException {
Document document = Jsoup.connect("http://www.baidu.com").get();
System.out.println(document.title());
}
}
- 程式輸出
百度一下,你就知道
是不是超級簡單?沒錯,就是這麼簡單
做個總結:通過Jsoup.connect(“http://www.baidu.com”).get()我們擷取到了百度首頁的HTML文檔并傳回一個Document對象(它就代表了HTML文檔),使用Document對象的title()方法擷取到了HTML文檔的标題。
擷取Document對象
擷取Document對象有如下幾種方法
1. 字元串擷取
第一種:
- 代碼
Document document = Jsoup.parse("<style>p {font-size:10px}</style>");
System.out.println(document);
- 程式輸出
<html>
<head>
<style>p {font-size:10px}</style>
</head>
<body></body>
</html>
- 可以看到Document對象是一個完整的HTML結構,對于缺失的标簽,jsoup庫幫我們補全。但是是補全在标簽裡面的。
第二種:
- 代碼
Document document = Jsoup.parseBodyFragment("<style>p {font-size:10px}</style>");
System.out.println(document);
- 程式輸出
<html>
<head></head>
<body>
<style>p {font-size:10px}</style>
</body>
</html>
- 對應缺失的标簽,Jsoup幫我們補齊在标簽裡面。
2.URL擷取
- 這個可以說是最常用的了,如我們的“第一個例子”,
Document document = Jsoup.connect("http://www.baidu.com").get();
System.out.println(document);
- 這裡就不寫輸出了,這裡輸出的就是百度首頁的html的靜态檔案了
3.檔案擷取
- 該方法從檔案中解析出一個
對象,我們将百度首頁的html文檔儲存到本地,然後用此方法得到一個Document
對象:Document
- 代碼如下
File file = new File("./index.html");
Document document = Jsoup.parse(file, "UTF-8");
System.out.println(document);
資料提取
- 當我們擷取到網頁的html内容之後,要做的當然是提取其中的資料為我們自己所用。
1.Document方法提取
- 擷取到了
對象之後,我們可以通過它的很友善的方法提取資料。Document
- 在Document對象上我們可以使用一些類DOM方法,比如
Document doc = Jsoup.connect("http://www.baidu.com").get();
// 方法
doc.getElementById(String id); // 通過标簽的id 來提取标簽
doc.getElementsByTag(String tag); // 通過标簽名來提取标簽,如"a","button"
doc.getElementsByClass(String className); // 通過标簽的class屬性來提取标簽,
doc.getElementsByAttribute(String key); // 根據标簽是否擁有某個屬性來提取标簽,比如"href","src"
示例
- 擷取百度首頁中所有的 <a> 标簽
Document document = Jsoup.connect("http://www.baidu.com").get();
// 1、擷取百度首頁中所有的<a>标簽
Elements a = document.getElementsByTag("a");
for (Element element : a) {
System.out.println(a);
}
- 程式輸出,(這裡隻列出部分,太多了)
<a class="toindex" href="/">百度首頁</a>
<a href="javascript:;" name="tj_settingicon" class="pf">設定<i class="c-icon c-icon-triangle-down"></i></a>
<a href="https://passport.baidu.com/v2/?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F&sms=5" name="tj_login" class="lb" onclick="return false;">登入</a>
<a href="http://news.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">新聞</a>
<a href="https://www.hao123.com" target="_blank" class="mnav c-font-normal c-color-t">hao123</a>
<a href="http://map.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">地圖</a>
<a href="https://live.baidu.com/" target="_blank" class="mnav c-font-normal c-color-t">直播</a>
1.1Element提取
- 在上面的例子中,我們擷取了
對象,Elements
對象就是一個個Elements
的标簽集合,通過對<html>
對象的周遊,可以得到Elements
對象,Element
就是一個一個的标簽具體,我們可以對Element
标簽進行進一步的提取,常用方法如下:Element
Elements elements = document.getElementsByTag("a");
for (Element element : elements) {
element.attr(String key) // 擷取元素key屬性的值,如:“href”,"src"
element.attributes() // 擷取元素所有屬性
element.id() // 擷取元素id屬性的值
element.className() // 擷取元素class屬性的值
element.classNames()
element.text() // 擷取元素内容
}
- 舉個栗子
Document document = Jsoup.connect("http://www.baidu.com").get();
Elements elements = document.getElementsByTag("a");
for (Element element : elements) {
System.out.println(element.text() + " : " + element.attr("href"));
}
- 程式輸出(隻列出部分)
登入 : https://passport.baidu.com/v2/?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F&sms=5
新聞 : http://news.baidu.com
hao123 : https://www.hao123.com
地圖 : http://map.baidu.com
直播 : https://live.baidu.com/
視訊 : https://haokan.baidu.com/?sfrom=baidu-top
貼吧 : http://tieba.baidu.com
學術 : http://xueshu.baidu.com
2.選擇器提取
- 除了類Document方法外,還可以使用CSS選擇器文法對元素進行篩選,主要是用
方法。Element.select(String selector)
- 舉個栗子
- 通過
方法找到了所有帶有select()
屬性的href
标簽。值得注意的是,a
方法可以在select()
,Document
或Element
對象上使用。Elements
Document document = Jsoup.connect("http://www.baidu.com").get();
Elements elements = document.select("a[href]");
for (Element element : elements) {
System.out.println(element.text() + " : " + element.attr("href"));
}
- 程式輸出(隻列出部分)
資訊 : https://www.baidu.com/s?rtt=1&bsst=1&cl=2&tn=news
視訊 : http://v.baidu.com/v?ct=301989888&rn=20&pn=0&db=0&s=25&ie=utf-8
圖檔 : http://image.baidu.com/i?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8
知道 : http://zhidao.baidu.com/q?ct=17&pn=0&tn=ikaslist&rn=10&fr=wwwt
文庫 : http://wenku.baidu.com/search?lm=0&od=0&ie=utf-8
貼吧 : http://tieba.baidu.com/f?fr=wwwt
地圖 : https://map.baidu.com/?newmap=1&ie=utf-8&s=s
采購 : https://b2b.baidu.com/s?fr=wwwt
更多 : http://www.baidu.com/more/
2.1常見用法
Document document = Jsoup.connect(url).get();
// 擷取所有<div>标簽中有class="item"的标簽,如
// <div class="item"></div>
Elements elements = document.select("div.item");
Document document = Jsoup.connect(url).get();
// 擷取所有存在href屬性的<a>标簽,如:
// <a href="http://baidu.com/" target="_blank" rel="external nofollow" >首頁</a>
Elements elements = document.select("a[href]");
2.2select更多用法
官方文檔:官方文檔
CSDN:CSDN
相關導航
通俗易懂的正規表達式入門及應用
javaScript中操作數組的高階方法filter、map、reduce及for循環三種周遊形式