- 使用Jsoup我們的目的就是要獲取網(wǎng)頁的數(shù)據(jù)
根據(jù)中文文檔學(xué)習(xí)
主要是數(shù)據(jù)的抽瘸簟:
1.使用dom方法來遍歷一個Document對象
- api
1)遍歷DOM查找元素
- getElementById(String id):通過id來獲取
- getElementsByTag(String tagName):通過標(biāo)簽名字來獲取
- getElementsByClass(String className):通過類名來獲取
- getElementsByAttribute(String key):通過屬性名字來獲取
- getElementsByAttributeValue(String key, String value):通過指定的屬性名字,屬性值來獲取
- getAllElements():獲取所有元素
2)選擇器查找
######## public Elements select(String cssQuery)
選擇器的更多語法(可以在org.jsoup.select.Selector中查看到更多關(guān)于選擇器的語法):
- tagname: 通過標(biāo)簽查找元素,比如:a
- ns|tag: 通過標(biāo)簽在命名空間查找元素抡蛙,比如:可以用 fb|name 語法來查找 <fb:name> 元素
- 井id: 通過ID查找元素以蕴,比如:#logo
- class: 通過class名稱查找元素抬闷,比如:.masthead.
其他不常用的就在文首的連接中去查詢魔市。
使用案例
感謝 jsoup案例
我們來爬取下蟬游記
爬取效果圖:
觀察網(wǎng)頁解構(gòu)
在圖中我們可以看到每個article標(biāo)志就是每篇文章的信息督禽。每篇article外層是被 class名為" trip-list-v2 clearfix "的div包裹颠黎。每個article下還有一層div,該div下有多個child(div.h1.p.a這些標(biāo)簽都是屬于文章的兒子)另锋。分析之后。我們就可以根據(jù)他們的id名狭归,或者class名夭坪,屬性來抽取我們想要的值。
代碼
你可以在Activity中爬取过椎,也可以創(chuàng)建一個類室梅,創(chuàng)建main(String[] args)入口來進(jìn)行測試爬取。
public class JsoupData {
public static void main(String[] args) throws IOException {
String neutrl = "http://chanyouji.com/";
String userAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3423.2 Safari/537.36";
Connection connect = Jsoup.connect(neutrl);
connect.header("User-Agent", userAgent);
Document doc = connect.timeout(5 * 1000).get();
Element elementDiv = doc.getElementsByClass("trip-list-v2 clearfix").first();
Elements elementsArticle = elementDiv.getElementsByTag("article");
for (int i = 0; i < elementsArticle.size(); i++) {
Element eles = elementsArticle.get(i).child(0);//在article下有多個child
Elements children = eles.children();
String title = children.get(1).text();
String conment = eles.getElementsByTag("p").text();
String img = children.get(0).select("img").attr("src");
System.out.print(title + "\n" + conment + "\n" + img + "\n");
}
}
}
代碼講解
1.創(chuàng)建類,并創(chuàng)建main方法入口亡鼠。
2.設(shè)置自己想爬取的網(wǎng)址
3.設(shè)置userAgent赏殃,設(shè)置偽裝成瀏覽器。
userAgent的地址间涵。打開自己的瀏覽器仁热。按f12。
勾哩。復(fù)制下就可以了抗蠢。
4.開始抽取,前面我們都分析過了思劳。
Element elementDiv = doc.getElementsByClass("trip-list-v2 clearfix").first();
根據(jù)“trip-list-v2 clearfix”這個類名迅矛,獲取到Elements列表。我們?nèi)∷谝粋€潜叛,這樣子我們就拿到了trip-list-v2 clearfix名的div容器诬乞。里面包含很多aricle。
Elements elementsArticle = elementDiv.getElementsByTag("article");
這樣我們就拿到了文章列表钠导。循環(huán)遍歷每篇文章震嫉,獲取文章中的信息。
開始遍歷
for (int i = 0; i < elementsArticle.size(); i++) {
Element eles = elementsArticle.get(i).child(0);//在article下的第一個div class=inner的
Elements children = eles.children();//獲取class=inner的兒子們
String title = children.get(1).text();//標(biāo)題在class=inner的第二個兒子牡属,下標(biāo)為1票堵。
String conment = eles.getElementsByTag("p").text();//也可以不用class=inner的兒子的位置來索引。直接用p這個標(biāo)簽來索引是一樣的逮栅。
String img = children.get(0).select("img").attr("src");//圖片的地址在class=inner的第一個兒子div下悴势。用 children.get(0)獲取到這個div.用select("img"),這個選擇器來選擇img.并獲取到src屬性下的地址措伐。
System.out.print(title + "\n" + conment + "\n" + img + "\n");
}
遍歷的分析在上面的代碼中特纤。
5.運(yùn)行該類。就能得到我們想要的數(shù)據(jù)了侥加。
實例2
爬取美食天下地址
網(wǎng)頁分析
爬取效果圖
代碼
public class JsoupData {
public static void main(String[] args) throws IOException {
String userAgent="Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36";
Connection connection= Jsoup.connect("https://home.meishichina.com/show-top-type-recipe-page-1.html");
connection.header("User-Agent",userAgent);
Document document=connection.timeout(5*1000).get();
Element div_ul = document.getElementById("J_list");
Element ul = div_ul.getElementsByTag("ul").first();
Elements li = ul.getElementsByTag("li");
for (int i = 0; i < li.size(); i++) {
Element childpic = li.get(i).child(0);//第一個div
String pic= childpic.getElementsByTag("img").attr("data-src");//獲取圖片地址捧存,雖然有多層級,但是img的標(biāo)簽只有一個担败,可以直接來獲取
Element childdetails = li.get(i).child(1);//這是細(xì)節(jié)div
String title = childdetails.getElementsByTag("h2").text();//在細(xì)節(jié)div下找到h2標(biāo)簽
String who=childdetails.getElementsByClass("subline").first().getElementsByTag("a").text();
String yuanliao = childdetails.getElementsByClass("subcontent").text();
System.out.print(title+"\n原料:"+yuanliao+"\n圖片地址:"+pic+"\n"+"發(fā)布者:"+who+"\n");
}
}
}
注意:
上面獲取圖片寫src昔穴,是獲取不到完整的,斷點調(diào)試發(fā)現(xiàn)用data-src能獲取到提前。