在做竞对调研的时候,发现了一种新的爬取方式,印象深刻。
具体就是通过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传递给后台,后台进行登录,完成之后进行爬取,客户端通过轮训接口获取爬取状态。