Android爬蟲之Jsoup

最近做了個獲取Kindle特價書的app(https://www.coolapk.com/apk/167660),
使用了jsoup來解析亞馬遜的html代碼,覺得很強大,遂分享一下。

如圖:

效果

1、Jsoup

介紹

jsoup 是一款Java 的HTML解析器,可直接解析某個URL地址、HTML文本內容。它提供了一套非常省力的API,可通過DOM,CSS以及類似於jQuery的操作方法來取出和操作數據。

地址

Jsoup 官網:https://jsoup.org/

Jsoup 中文文檔:http://www.open-open.com/jsoup/

導入

Eclipse 可以下載jar: https://jsoup.org/download

Android studio可以在Gradle中添加:

compile ‘org.jsoup:jsoup:1.11.2’

簡單使用

從一個Url中加載Document:

Document doc = Jsoup.connect("http://baidu.com/").get();

獲取id爲next的a標籤:

Element next = doc.getElementById("next");

獲取該a標籤的href屬性:

String nextUrl = next.attr("href");

具體使用方法可以看使用文檔: http://www.open-open.com/jsoup/

2、上手

我們以亞馬遜Kindle每週特價書爲例,地址: https://www.amazon.cn/s/ref=sr_pg_1?rh=n%3A1852543071&sort=popularity-rank&ie=UTF8&qid=1511322011

在瀏覽器中打開網頁(以chrome爲例),可以看到如圖:

每週特價書頁面

按F12查看源碼,然後按Ctrl+shift+C,然後點擊圖書的區域,通過查找,我們可以看到如下的源碼:

網頁源碼

可以看出來,id爲 “s-results-list-atf” 的ul標籤,便是商品列表,class爲s-result-item的li標籤,便是列表item。

那麼,我們可以寫代碼,用戶獲取所有商品的標籤:

    Connection con = Jsoup.connect(url);
// UserAgent是發送給服務器的當前瀏覽器的信息。
// 這是我的電腦的chrome的userAgent。
con.userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36");
// 獲取所有的class 爲 "s-result-item"的li標籤。
Elements elements = document.getElementsByClass("s-result-item");
for (Element li : elements) {
   ...
}

我們展開每個item的li標籤,繼續查找,可以看到圖片的信息:

商品圖片

則,我們可以寫:

 Element img = li.select("img[alt=產品詳細信息]").first();
 // 圖片地址
 String imgUrl = img.attr("src");

商品標題和鏈接:

商品標題

// 標題、鏈接
                    Element aTtile = li.select("a.s-access-detail-page").first();
                    String title = aTtile.attr("title");
                    String bookUrl = aTtile.attr("href");

以此類推,我們可以將本頁面的圖書圖片、標題、鏈接、作者、評分、評分數量等信息,全部爬出來。同時,不要忘了,我們還要找到下一頁的鏈接:

// 下一頁
            Element aNextPage = document.getElementById("pagnNextLink");
            if (aNextPage == null) {
                mNextPageUrl = null;
            } else {
                mNextPageUrl = "https://www.amazon.cn" + aNextPage.attr("href");
            }

這樣,我們在上拉加載的時候,就可以通過mNextPageUrl是否爲Null,來判斷是否還有下一頁。

3、其他問題

這篇文章裏,我演示的是電腦端網頁,而我在app中用的是手機端網頁,因爲同樣的鏈接,手機端網頁比電腦端網頁少100kb左右流量(不計算圖片)。如果大家要在項目中使用,儘量使用手機端網頁比較好一點。
那麼,怎麼讓獲取的網頁爲手機端的呢?
我們修改UserAgent爲手機瀏覽器:

connection.userAgent(String userAgent);

比如我的小米Max2的Via瀏覽器的UserAgent爲:

User-Agent,Mozilla/5.0 (Linux; Android 7.1.1; MI MAX 2 Build/NMF26F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.83 Mobile Safari/537.36

記住,大多數網站的手機端和電腦端的Jsoup分析規則,是不一樣的,大家要做區別。

4、總結

記得原來在學校學java的時候,寫過一個百度搜索的小軟件,可以獲取百度搜索出來的結果的前十項,那時候還是用正則來一點一點匹配的。

而現在我們可以用Jsoup簡單地實現這些功能,而且Jsoup最大的好處在於 可通過DOM,CSS以及類似於jQuery的操作方法來取出和操作數據,如果你對前端稍微懂點的話,操作起來基本沒有什麼學習成本的。

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