藏经阁-小红书移动端自动化数据采集实践
本文将从小红书移动端自动化数据采集实践的角度,探讨数据采集的重要性和挑战,并介绍小红书是如何使用自动化数据采集解决方案来解决数据采集问题的。
数据采集的重要性
数据采集是数据平台建设中最重要的环节之一。如果在采集与上报上花费了过多的精力,那么我们花费在得出结论的精力就会变少。在数据采集和清洗上我们也许花费了80%的精力,但是只产出20%的价值。真正有价值的是这些数据告诉我的一些结论,可以帮助我们产品做决策。
数据采集的挑战
小红书以前是如何管理这些点的?维护一个打点Key的表,每个点需要手动写Code,分析师通过Key的表来找到对应事件。391个打点事件需要手工通过excel维护。我们碰到了那些问题:埋点代码遍地都是、复用性基本为零、需求改动太快、埋点也要跟着一起改、无法预知到分析师需要哪些数据、维护一套打点事件的表成本很高、错打漏打经常发生、花费了大量时间进行数据清洗。
解决方案
小红书决定做一个产品来解决这个问题,即自动化数据采集。我们做了一些思考,当时有2种解决方案,一种是可视化埋点,一种是无埋点。由于需求改动太快、无法预知打点需求那就自动采集无埋点是最适合我们的解决方案。
移动端有哪些有价值的数据页面?整个页面出现和消失行为、交互式事件打点用户、赞笔记、评论笔记、收藏笔记曝光等。
核心技术
1. 面向切面编程(AOP)
面向切面编程(AOP)是一种技术,通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。在数据采集这件事上其实就是当用户发生行为,我是谁我从哪里来我要到哪里去。
2. View树结构
View树结构无论是 Web 上的 DOM 结点结构,还是 App 上的 UI 控件结构,都是构建好的一颗完整的树形结构渲染在页面或者屏幕上。所以我们给View 和 Page增加了一些附加属性,来和业务产生数据绑定。Referrer & Parent简单的说就是你从哪来,和你是谁生的问题。
自动采集页面数据
页面数据如何自动采集?页面数据其实就是记录每个页面的生命周期。在iOS中就是ViewController的生命周期,在Android中就是Activity/Fragment 的生命周期。这样其实非常简单了,我们只要根据我们的需求去hook一些生命周期的方法就行了。在iOS 中我们可以使用runtime的method swizzle 去hook的viewController的viewWillAppear和viewWillDisappear方法。Android通过继承在Activity的onResume和onPause方法中处理。
行为数据如何采集
行为数据如何采集?不管是web还是iOS Android 所有点击行为一定会有回调,那么我们只要找出所有的回调方法,那么就可以采集所有的点击行为。在iOS中UIControliOS大多数可点击UI控件都是基于UIControl,而所有的事件也都要通过- (void)sendAction:(SEL)action to:(nullable id)target forEvent:(nullable UIEvent*)event转发,通过该方法,我们可以监听到继承自UIControl等控件的Action事件。Delegate在+ (void)load方法里 swizzling tableview或者collectionview 的select事件好像不太可行。所以我们在setDelegate的时候,去swizzling select事件。Android 中行为数据如何采集通过hook Activity#getSystemService(),Fragment#getLayoutInflater(),获取页面视图树。遍历视图树中View,设置OnClickListener 监听点击事件。