在做競對調(diào)研的時(shí)候溅漾,發(fā)現(xiàn)了一種新的爬取方式吭露,印象深刻。
具體就是通過SDK的方式集成到用戶的手機(jī)APP里面伊滋,然后通過控制webview來打開想要爬取的相關(guān)網(wǎng)站的登錄頁面,在用戶完成登錄頁面之后队秩,獲取登錄完成的cookie,傳給后臺笑旺,進(jìn)行后續(xù)爬取。
這種方式最大的好處就是目前應(yīng)該沒有方式可以防止這種爬取方式馍资,相當(dāng)于是用戶自己在手機(jī)上做了一次登錄筒主,獲取到的設(shè)備指紋與平常的都是一致的,比較適合那種登錄方式校驗(yàn)比較嚴(yán)格且經(jīng)常改版的網(wǎng)站鸟蟹。并且給用戶的感覺會比較安全一點(diǎn)乌妙,雖然通過SDK也是可以攔截到用戶輸入的用戶名和密碼。劣勢在于需要集成SDK建钥。
這種爬取核心的點(diǎn)在于webview跟javascript之間的交互,好在本身android/ios就提供這種能力
首先在頁面上面通過JS操作webview loadUrl 打開相應(yīng)的登錄頁
用戶操作時(shí)藤韵,可以通過監(jiān)聽事件或者判斷URL來進(jìn)行相關(guān)的調(diào)用給原生,用于留存數(shù)據(jù)或者獲取cookie熊经,具體是在頁面加載完成之后執(zhí)行某一段javascript完成的泽艘。
android代碼如下:
setOnWebViewClientListener(new BaseWebViewFragment.OnWebViewClientListener() {
@Override
public void onPageFinish(String str) {
this.fragment.handler.post(new Runnable() {
@Override
public void run() {
WebViewOfficialH5Fragment.loadJs(js);
}
});
}
});
QQ郵箱示例javascript如下:
(function() {
var go = document.getElementById("go");
if(go){
go.addEventListener("click", function() {
var u = document.getElementById("u");
var p = document.getElementById("p");
//調(diào)用原生保存用戶輸入數(shù)據(jù)
alert(u.value + "" + p.value);
});
}
var submitBtn = document.getElementById("submitBtn");
if(submitBtn){
go.addEventListener("click", function() {
var pwd = document.getElementById("pwd");
alert(pwd.value);
});
}
alert(location.href);
var reg = /w\.mail\.qq\.com\/cgi-bin\/today/i;
if(reg.test(location.href)){
//調(diào)用原生保存cookie
}
})()
在客戶端接受到cookie之后,通過異步的方式镐依,把Cookie傳遞給后臺匹涮,后臺進(jìn)行登錄,完成之后進(jìn)行爬取槐壳,客戶端通過輪訓(xùn)接口獲取爬取狀態(tài)焕盟。