八爪鱼,百万用户信赖的网络爬虫工具

APP数据采集怎么实现的?(附带大仙分享爬坑技巧)

作者:keven 发布时间:3/12/2018 10:14:14 AM 42598 人已阅读

摘要:最近半年,我们八爪鱼陆续接到好几个APP数据采集的项目需求,我在群里面,偶尔也看到有些用户在问,有没有APP数据采集的工具。

最近半年,我们八爪鱼陆续接到好几个APP数据采集的项目需求,我在群里面,偶尔也看到有些用户在问,有没有APP数据采集的工具。鉴于我们做过的几个APP数据采集项目的经验,我可以告诉大家,现在APP数据采集,市面上还没有通用的工具。我们八爪鱼内部是有一套工具,但由于使用的难度较高,需要编写脚本,所以不对普通用户公开,我们仅接受项目定制。

 

虽然不对外公开,但并不妨碍我们将技术分享出来,APP数据采集,一般走以下两种方式:

 

1.两种思路

1. 抓包

2. HOOK

 

2.抓包

有代码经验或APP开发的同学都很容易理解,其实很多APP,走的都是webservice通讯协议的方式,并且由于是公开数据,而且大部分是无加密的。所以只要对网络端口进行监测,对APP进行模拟操作,即可知道APP里面的数据是如何获取的。

我们只需要写代码模拟其请求,无论POST还是GET,即可得到该请求所返回的信息。再通过对返回的信息结构化解析,即可得到我们想要的数据。

 

public static void main(String[] args) {

   Spider.create(new GithubRepoPageProcessor())

           //从https://github.com/****开始抓

           .addUrl("https://github.com/****")

           //设置Scheduler,使用Redis来管理URL队列

           .setScheduler(new RedisScheduler("localhost"))

           //设置Pipeline,将结果以json方式保存到文件

           .addPipeline(new JsonFilePipeline("D:\\data\\webmagic"))

           //开启5个线程同时执行

           .thread(5)

           //启动爬虫

           .run();

}

 

以模拟采集“meizu”应用市场为例


应用市场产品

应用市场产品

 

抓包返回参数

抓包返回参数

 

整个抓包过程

整个抓包过程


3.HOOK技术

HOOK技术是一种走操作系统内核的技术,由于安卓系统是开源的,所以可以借助一些框架修改内核,从而实现你要的功能。HOOK的形式,我们走的是Xposed框架。Xposed是一款可以在不修改任何其他开发者开发的应用(包括系统服务)的情况下,改变程序运行的一个开源框架服务。基于它可以制作出许多功能强大的模块,以此来达到应用程序按照你的意愿运行的目的。

如果把安卓手机看做一座城堡,那Xposed可以让你拥有一个上帝视角,城里的运作细节尽收你眼底,还能让你插一手改变城堡的运作规律。

什么意思呢?简单的说就是你可以通过他,自动化的控制你的APP。如果将我们的APP开在模拟器上,我们可以通过编码,通过他告诉APP这一步干什么,下一步干什么。你把它理解成类似按健精灵或游戏打怪外挂就可以了。

而他每走一步,APP与服务端交互的数据,均可获取下来。这种方式广泛用于一些成熟的APP。比如某信采集。

 

public class HookActivity implements IXposedHookLoadPackage {

   @Override

   public void handleLoadPackage(LoadPackageParam lpparam) throws Throwable {

       final String packageName = lpparam.packageName;

       XposedBridge.log("--------------------: " + packageName);

       try {

           XposedBridge.hookAllMethods

           (Activity.class, "onCreate", new XC_MethodHook() {

               @Override

               protected void afterHookedMethod(MethodHookParam param)

               throws Throwable {

                   XposedBridge.log("=== Activity onCreate: " + param.thisObject);

               }

           });

       } catch (Throwable error) {

           XposedBridge.log("xxxxxxxxxxxx: " + error);

       }

   }

}

 

其实我们八爪鱼曾经也想开发一款通用的APP数据采集工具,并且两年前在这块投入研究了小半年,我们做出了一款APP采集脚本编辑工具,可以让一款APP的数据采集项目缩减到3-5天即可开发完成。但我们认为,这个工具需要编写脚本一般用户是比较难上手的,所以仅作为内部项目使用。

 

以HOOK某APP为例

 

 

HOOK指令打开某APP

 

HOOK指令打开某APP


HOOK指令获取数据


HOOK指令获取数据


4.这些年走过的坑

聊完APP采集的思路,我们跟大家分享一些遇过的坑吧,让大家乐一乐


坑一:签名算法

以某信的文章列表页及某信息页为例,对其http访问进行抓包,会发现其url的一个核心参数是我们无法知道如何生成的,这就导致,我们不可能直接用该url进行信息爬取;签名算法如果无法破解,HTTP这条路就是死路了。


坑二:http爬取回来的信息和页面显示不一致

以某信的某信息页为例,对比直接访问某信页面及http爬取的信息,可明显发现http爬取到的信息较少。造成得两种方式都用,才能既照顾速度又照顾完整性。


坑三:模拟器中的坑

APP自动识别你的运行环境进行屏蔽,最厉害的还是某信,连你是用模拟器打开还是真机打开,是什么内核的,全部进行限制。曾经见过牛人,找某手机厂商专门定做真机来配合。


坑四:帐号的坑

这个坑就有点大了,要找号、养号,都不是件容易的事情,更惨的是封号,真真让你一夜回到解放前。

 

最后,2018新年已开始工作,全年无休,欢迎随时找我聊工作。

 


欢迎咨询在线客服
加微信群,与更多用户一起交流