最近做了個獲取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的操作方法來取出和操作數據,如果你對前端稍微懂點的話,操作起來基本沒有什么學習成本的。