簡(jiǎn)介
公司最近在做淘寶商城類的APP,需要獲取到用戶的淘寶訂單信息并用自己的列表展示出來(lái),用過(guò)阿里百川的朋友都知道SDK是直接提供了打開(kāi)用戶訂單的方法,但是它是用H5或淘寶app進(jìn)入用戶訂單,并沒(méi)有返回json這樣的數(shù)據(jù)供我們使用,所以就想到了利用webview獲取到用戶訂單的html代碼,然后jsoup爬取用戶訂單信息再展示出來(lái)。這里只介紹如何獲取淘寶訂單號(hào),商品名稱、價(jià)格等數(shù)據(jù)可以舉一反三獲取到。
準(zhǔn)備工作
依賴最新的jsoup包
implementation 'org.jsoup:jsoup:1.11.3'
步驟如下
1.先定義一個(gè)類用于獲取當(dāng)前webview顯示的html代碼,這里我在activity用類部類的方式來(lái)寫(xiě)
class HTMLJavaScriptInterface {
@JavascriptInterface
@SuppressWarnings("unused")
public void processHTML(String html) {
//html 為當(dāng)前webview顯示的html代碼,這里就是最終要處理的操作
}
}
2.定義WebViewClient
/*WebViewClient主要幫助WebView處理各種通知、請(qǐng)求事件*/
private WebViewClient webViewClient = new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
//頁(yè)面加載完成,處理html代碼,復(fù)制黏貼不用改動(dòng)
mWebView.loadUrl("javascript:HTMLOUT.processHTML(document.documentElement.outerHTML);");
}
};
3.初始化用于顯示網(wǎng)頁(yè)的webview屬性
//添加剛才我們定義的js接口
mWebView.addJavascriptInterface(new HTMLJavaScriptInterface(), "HTMLOUT");
//設(shè)置WebViewClient
mWebView.setWebViewClient(webViewClient);
4.訪問(wèn)淘寶訂單網(wǎng)址
淘寶訂單的h5頁(yè)面地址為:https://h5.m.taobao.com/mlapp/olist.html
mWebView.loadUrl("https://h5.m.taobao.com/mlapp/olist.html");
Jsoup處理獲取到的html代碼
當(dāng)我們?cè)L問(wèn)到我的訂單頁(yè)面時(shí),可以再HTMLJavaScriptInterface中打印出html代碼先看看代碼結(jié)構(gòu),這里我直接貼圖我自己的淘寶訂單。
然后我們展開(kāi)一個(gè)li標(biāo)簽,查看詳情
眾所周知,淘寶訂單號(hào)是18位的數(shù)字,而我們可以觀察看,class中的屬性,是19位的數(shù)字,這是為什么呢?我們繼續(xù)查看第2個(gè)li標(biāo)簽
好了,知道訂單號(hào)后,我們接下來(lái)就是重點(diǎn)了。
回到我們定義的HTMLJavaScriptInterface中,編寫(xiě)如下代碼:
class HTMLJavaScriptInterface {
@JavascriptInterface
@SuppressWarnings("unused")
public void processHTML(String html) {
//創(chuàng)建一個(gè)集合用來(lái)最后存訂單號(hào)
List<String> idList = new ArrayList<>();
//需要拋異常來(lái)查看問(wèn)題
try {
//通過(guò)parse方法拿到Document對(duì)象
Document doc = Jsoup.parse(html);
//通過(guò)getElementById定位到訂單的div位置
Element div = doc.getElementById("order1");
//拿到該div下面所有的li標(biāo)簽
Elements lis = div.getElementsByTag("li");
//遍歷li標(biāo)簽,用來(lái)得到里面div的class屬性
for (Element li : lis) {
//保存不為空的class屬性
if (!TextUtils.isEmpty(li.select("div").attr("class"))) {
//從上面的class屬性我們可以看到是module 1754124142728272452 storage這樣的,我們就從第7位取到25位,這樣就保留了中間18位的訂單號(hào)
idList.add(li.select("div").attr("class").substring(7, 25));
}
}
//結(jié)束idList就是我們最終獲取到的淘寶訂單號(hào)集合
} catch (Exception e) {
//查看Jsoup操作的異常
}
}
}
想要了解更多Jsoup的操作,可以訪問(wèn)Jsoup的中文網(wǎng)學(xué)習(xí)
官網(wǎng)地址
好了,下課,其他問(wèn)題可以在評(píng)論區(qū)咨詢。