在做競對調研的時候,發現了一種新的爬取方式,印象深刻。
具體就是通過SDK的方式集成到用戶的手機APP里面,然后通過控制webview來打開想要爬取的相關網站的登錄頁面,在用戶完成登錄頁面之后,獲取登錄完成的cookie,傳給后臺,進行后續爬取。
這種方式最大的好處就是目前應該沒有方式可以防止這種爬取方式,相當于是用戶自己在手機上做了一次登錄,獲取到的設備指紋與平常的都是一致的,比較適合那種登錄方式校驗比較嚴格且經常改版的網站。并且給用戶的感覺會比較安全一點,雖然通過SDK也是可以攔截到用戶輸入的用戶名和密碼。劣勢在于需要集成SDK。
這種爬取核心的點在于webview跟javascript之間的交互,好在本身android/ios就提供這種能力
首先在頁面上面通過JS操作webview loadUrl 打開相應的登錄頁
用戶操作時,可以通過監聽事件或者判斷URL來進行相關的調用給原生,用于留存數據或者獲取cookie,具體是在頁面加載完成之后執行某一段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");
//調用原生保存用戶輸入數據
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)){
//調用原生保存cookie
}
})()
在客戶端接受到cookie之后,通過異步的方式,把Cookie傳遞給后臺,后臺進行登錄,完成之后進行爬取,客戶端通過輪訓接口獲取爬取狀態。