当前位置:   article > 正文

用户行为数据采集_用户行为怎么爬取

用户行为怎么爬取

实验目的

掌握flume的使用,将模拟生成的数据通过日志拦截器的选择,上传到kafka,再由kafka上传到hdfs中存储

实验背景

在产品的开发和设计,尤其针对互联网的产品,对用户行为的数据进行筛选、统计、分析,从而发现用户的一些使用习惯,操作规律,并将这些规律反馈到产品的设计、开发、运维、市场以及营销上,进而对一些预先的方案进行调整和修正从而达到更好的效果。所以进行用户行为数据分析是非常必要的,而用户行为数据分析的前置要求就是,需要一个用户行为数据采集的平台。

实验原理

1.目标数据:我们要收集和分析的数据主要包括页面数据、事件数据、曝光数据、启动数据和错误数据。

①页面数据

页面数据主要记录一个页面的用户访问情况,包括访问时间、停留书简、页面路径等信息。

 1)所有页面id如下

  1. home("首页"),
  2. category("分类页"),
  3. discovery("发现页"),
  4. top_n("热门排行"),
  5. favor("收藏页"),
  6. search("搜索页"),
  7. good_list("商品列表页"),
  8. good_detail("商品详情"),
  9. good_spec("商品规格"),
  10. comment("评价"),
  11. comment_done("评价完成"),
  12. comment_list("评价列表"),
  13. cart("购物车"),
  14. trade("下单结算"),
  15. payment("支付页面"),
  16. payment_done("支付完成"),
  17. orders_all("全部订单"),
  18. orders_unpaid("订单待支付"),
  19. orders_undelivered("订单待发货"),
  20. orders_unreceipted("订单待收货"),
  21. orders_wait_comment("订单待评价"),
  22. mine("我的"),
  23. activity("活动"),
  24. login("登录"),
  25. register("注册");

 2)所有页面对象类型如下:

  1. sku_id("商品skuId"),
  2. keyword("搜索关键词"),
  3. sku_ids("多个商品skuId"),
  4. activity_id("活动id"),
  5. coupon_id("购物券id");

3)所有来源类型如下:

  1. promotion("商品推广"),
  2. recommend("算法推荐商品"),
  3. query("查询结果商品"),
  4. activity("促销活动");

 

②事件数据

事件数据主要记录应用内一个具体操作行为,包括操作类型、操作对象、操作对象描述等信息。

 

1)所有动作类型如下:

  1. favor_add("添加收藏"),
  2. favor_canel("取消收藏"),
  3. cart_add("添加购物车"),
  4. cart_remove("删除购物车"),
  5. cart_add_num("增加购物车商品数量"),
  6. cart_minus_num("减少购物车商品数量"),
  7. trade_add_address("增加收货地址"),
  8. get_coupon("领取优惠券");

注:对于下单、支付等业务数据,可从业务数据库获取。

2)所有动作目标类型如下:

  1. sku_id("商品"),
  2. coupon_id("购物券");

 

③曝光数据

曝光数据主要记录页面所曝光的内容,包括曝光对象,曝光类型等信息。

1)所有曝光类型如下:

  1. promotion("商品推广"),
  2. recommend("算法推荐商品"),
  3. query("查询结果商品"),
  4. activity("促销活动");

 2)所有曝光对象类型如下:

  1. sku_id("商品skuId"),
  2. activity_id("活动id");

 ④启动数据:启动数据记录应用的启动信息。

1)所有启动入口类型如下:

  1. icon("图标"),
  2. notification("通知"),
  3. install("安装后启动");

⑤错误数据:错误数据记录应用使用过程中的错误信息,包括错误编号及错误信息。

6.数据埋点

①主流埋点方式

目前主流的埋点方式,有代码埋点(前端/后端)可视化埋点全埋点三种。

代码埋点是通过调用埋点SDK函数,在需要埋点的业务逻辑功能位置调用接口,上报埋点数据。例如,我们对页面中的某个按钮埋点后,当这个按钮被点击时,可以在这个按钮对应的 OnClick 函数里面调用SDK提供的数据发送接口,来发送数据。

可视化埋点只需要研发人员集成采集 SDK,不需要写埋点代码,业务人员就可以通过访问分析平台的“圈选”功能,来“圈”出需要对用户行为进行捕捉的控件,并对该事件进行命名。圈选完毕后,这些配置会同步到各个用户的终端上,由采集 SDK 按照圈选的配置自动进行用户行为数据的采集和发送。

全埋点是通过在产品中嵌入SDK,前端自动采集页面上的全部用户行为事件,上报埋点数据,相当于做了一个统一的埋点。然后再通过界面配置哪些数据需要在系统里面进行分析。

②埋点数据日志结构

我们的日志结构大致可分为两类,一是普通页面埋点日志,二是启动日志。

普通页面日志结构如下,每条日志包含了,当前页面的页面信息,所有事件(动作)、所有曝光信息以及错误信息。除此之外,还包含了一系列公共信息,包括设备信息,地理位置,应用信息等,即下边的common字段。

1)普通页面埋点日志格式

 

  1. {
  2. "common": { -- 公共信息
  3. "ar": "230000", -- 地区编码
  4. "ba": "iPhone", -- 手机品牌
  5. "ch": "Appstore", -- 渠道
  6. "md": "iPhone 8", -- 手机型号
  7. "mid": "YXfhjAYH6As2z9Iq", -- 设备id
  8. "os": "iOS 13.2.9", -- 操作系统
  9. "uid": "485", -- 会员id
  10. "vc": "v2.1.134" -- app版本号
  11. },
  12. "actions": [ --动作(事件)
  13. {
  14. "action_id": "favor_add", --动作id
  15. "item": "3", --目标id
  16. "item_type": "sku_id", --目标类型
  17. "ts": 1585744376605 --动作时间戳
  18. }
  19. ],
  20. "displays": [
  21. {
  22. "displayType": "query", -- 曝光类型
  23. "item": "3", -- 曝光对象id
  24. "item_type": "sku_id", -- 曝光对象类型
  25. "order": 1 --出现顺序
  26. },
  27. {
  28. "displayType": "promotion",
  29. "item": "6",
  30. "item_type": "sku_id",
  31. "order": 2
  32. },
  33. {
  34. "displayType": "promotion",
  35. "item": "9",
  36. "item_type": "sku_id",
  37. "order": 3
  38. },
  39. {
  40. "displayType": "recommend",
  41. "item": "6",
  42. "item_type": "sku_id",
  43. "order": 4
  44. },
  45. {
  46. "displayType": "query ",
  47. "item": "6",
  48. "item_type": "sku_id",
  49. "order": 5
  50. }
  51. ],
  52. "page": { --页面信息
  53. "during_time": 7648, -- 持续时间毫秒
  54. "item": "3", -- 目标id
  55. "item_type": "sku_id", -- 目标类型
  56. "last_page_id": "login", -- 上页类型
  57. "page_id": "good_detail", -- 页面ID
  58. "sourceType": "promotion" -- 来源类型
  59. },
  60. "err":{ --错误
  61. "error_code": "1234", --错误码
  62. "msg": "***********" --错误信息
  63. },
  64. "ts": 1585744374423 --跳入时间戳
  65. }

2)启动日志格式

启动日志结构相对简单,主要包含公共信息,启动信息和错误信息。

  1. {
  2. "common": {
  3. "ar": "370000",
  4. "ba": "Honor",
  5. "ch": "wandoujia",
  6. "md": "Honor 20s",
  7. "mid": "eQF5boERMJFOujcp",
  8. "os": "Android 11.0",
  9. "uid": "76",
  10. "vc": "v2.1.134"
  11. },
  12. "start": {
  13. "entry": "icon", --icon手机图标 notice 通知 install 安装后启动
  14. "loading_time": 18803, --启动加载时间
  15. "open_ad_id": 7, --广告页ID
  16. "open_ad_ms": 3449, -- 广告总共播放时间
  17. "open_ad_skip_ms": 1989 -- 用户跳过广告时点
  18. },
  19. "err":{ --错误
  20. "error_code": "1234", --错误码
  21. "msg": "***********" --错误信息
  22. },
  23. "ts": 1585744304000
  24. }

③埋点数据上报时机

埋点数据上报时机包括两种方式。

方式一,在离开该页面时,上传在这个页面产生的所有数据(页面、事件、曝光、错误等)。优点,批处理,减少了服务器接收数据压力。缺点,不是特别及时。

方式二,每个事件、动作、错误等,产生后,立即发送。优点,响应及时。缺点,对服务器接收数据压力比较大。

实验环境

ubuntu 16.04

openssh 8.4

hadoop 3.1.3

flume 1.9.0

kafka 2.41

zookeeper 3.5.7

实验步骤

1.启动服务

想要进行数据仓库的搭建,首先要做的就是把搭建在本地的一个hadoop集群给启动起来,这里准备好了启动集群所需的命令文件,执行即可

首先是Hadoop服务

初始化namenode并启动Hadoop服务

  1. hadoop namenode -format
  2. start-all.sh

然后是zookeeper服务

zkServer.sh start

最后是kafka服务

  1. /opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/server.properties

复制到实验机

可使用jps命令查看是否服务全部启动

2.模拟数据

在下载application.properties、gmall-mock-log.jar、path.json、logback.xml,四个文件,这个是生成数据的java文件,其中application.properties可以配置我们需要生成日志文件的内容

  1. mkdir /opt/module
  2. cd /opt/module
  3. wget http://10.90.3.2/LMS/Project/shucang/applog.zip
  4. unzip applog.zip
  5. cd applog
  6. vim application.properties

复制到实验机

  1. #外部配置打开
  2. logging.config=./logback.xml
  3. #业务日期
  4. mock.date=2021-01-25
  5. #模拟数据发送模式
  6. mock.type=log
  7. #mock.type=http
  8. #http 模式下,发送的地址
  9. mock.url=http://localhost:8080/applog
  10. #启动次数
  11. mock.startup.count=100
  12. #设备最大值
  13. mock.max.mid=50
  14. #会员最大值
  15. mock.max.uid=500
  16. #商品最大值
  17. mock.max.sku-id=10
  18. #页面平均访问时间
  19. mock.page.during-time-ms=20000
  20. #错误概率 百分比
  21. mock.error.rate=3
  22. #每条日志发送延迟 ms
  23. mock.log.sleep=10
  24. #商品详情来源 用户查询,商品推广,智能推荐, 促销活动
  25. mock.detail.source-type-rate=40:25:15:20

复制到实验机

业务日期处可以更改为自选日期

其余文件不需更改,其中path.json用来配置访问路径,也可以根据需求灵活配置用户点击路径

logback配置文件可以修改日志生成路径,修改内容在第三行处的property name

返回/opt/module/applog路径执行命令

java -jar gmall-mock-log.jar

复制到实验机

运行完成后日志生成在/opt/module/applog/log中,日志上的日期是你执行文件的日期,但是内容中的日期是你设置的日期,这一点要分开

  

2.日志采集flume配置

下载日志拦截器到flume下的lib

wget -P /opt/apache-flume-1.9.0-bin/lib http://10.90.3.2/LMS/Project/shucang/flume-interceptor-1.0-SNAPSHOT-jar-with-dependencies.jar

打开到对应目录

cd /opt/apache-flume-1.9.0-bin/conf

复制到实验机

创建编辑配置文件

vim file-flume-kafka.conf

复制到实验机

  1. #为各组件命名
  2. a1.sources = r1
  3. a1.channels = c1
  4. #描述source
  5. a1.sources.r1.type = TAILDIR
  6. a1.sources.r1.filegroups = f1
  7. a1.sources.r1.filegroups.f1 = /opt/module/applog/log/app.*
  8. a1.sources.r1.positionFile = /opt/apache-flume-1.9.0-bin/taildir_position.json
  9. a1.sources.r1.interceptors = i1
  10. #这里用到了一个日志拦截器,放在了flume的lib中,用途是把集群运行日志,和用户行为日志分开
  11. a1.sources.r1.interceptors.i1.type = com.sugonedu.flume.interceptor.LogInterceptor$Builder
  12. #描述channel
  13. a1.channels.c1.type = org.apache.flume.channel.kafka.KafkaChannel
  14. a1.channels.c1.kafka.bootstrap.servers = localhost:9092
  15. a1.channels.c1.kafka.topic = topic_log
  16. a1.channels.c1.parseAsFlumeEvent = false
  17. #绑定source和channel以及sink和channel的关系
  18. a1.sources.r1.channels = c1

 

该配置文件就是扫描/opt/module/applog/log下的log文件,通过日志拦截器的选择,将有用的用户行为部分,传入kafka的topic_log中

我们可以写一个运行这个配置的flume

nohup /opt/apache-flume-1.9.0-bin/bin/flume-ng agent --conf-file /opt/apache-flume-1.9.0-bin/conf/file-flume-kafka.conf --name a1 -Dflume.root.logger=INFO,LOGFILE >/opt/apache-flume-1.9.0-bin/log1.txt 2>&1 &

 

在这里我们用了nohub,该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup就是不挂起的意思,不挂断地运行命令。

flume-ng是运行flume的可执行文件,使用--conf-file指定通过哪儿个配置文件启动,--name中指定的a1就是我们在配置文件中书写的a1

3.然后是日志消费flume的配置

vim /opt/apache-flume-1.9.0-bin/conf/kafka-flume-hdfs.conf

复制到实验机

  1. ## 组件
  2. a2.sources=r1
  3. a2.channels=c1
  4. a2.sinks=k1
  5. ## source1
  6. a2.sources.r1.type = org.apache.flume.source.kafka.KafkaSource
  7. a2.sources.r1.batchSize = 5000
  8. a2.sources.r1.batchDurationMillis = 2000
  9. a2.sources.r1.kafka.bootstrap.servers = localhost:9092
  10. a2.sources.r1.kafka.topics=topic_log
  11. a2.sources.r1.interceptors = i1
  12. a2.sources.r1.interceptors.i1.type = com.sugonedu.flume.interceptor.TimeStampInterceptor$Builder
  13. ## channel1
  14. a2.channels.c1.type = file
  15. a2.channels.c1.checkpointDir = /opt/apache-flume-1.9.0-bin/checkpoint/behavior1
  16. a2.channels.c1.dataDirs = /opt/apache-flume-1.9.0-bin/data/behavior1/
  17. a2.channels.c1.maxFileSize = 2146435071
  18. a2.channels.c1.capacity = 1000000
  19. a2.channels.c1.keep-alive = 6
  20. ## sink1
  21. a2.sinks.k1.type = hdfs
  22. a2.sinks.k1.hdfs.path = /origin_data/gmall/log/topic_log/%Y-%m-%d
  23. a2.sinks.k1.hdfs.filePrefix = log-
  24. a2.sinks.k1.hdfs.round = false
  25. a2.sinks.k1.hdfs.rollInterval = 10
  26. a2.sinks.k1.hdfs.rollSize = 134217728
  27. a2.sinks.k1.hdfs.rollCount = 0
  28. ## 控制输出文件是原生文件。
  29. a2.sinks.k1.hdfs.fileType = DataStream
  30. ## 拼装
  31. a2.sources.r1.channels = c1
  32. a2.sinks.k1.channel= c1

复制到实验机

这个配置文件就是通过flume将topic_log中的信息生成文件传入hdfs中的/origin_data/gmall/log/topic_log/目录下

同样可以来启动这一flume

nohup /opt/apache-flume-1.9.0-bin/bin/flume-ng agent --conf-file /opt/apache-flume-1.9.0-bin/conf/kafka-flume-hdfs.conf --name a2 -Dflume.root.logger=INFO,LOGFILE >/opt/apache-flume-1.9.0-bin/log2.txt   2>&1 &

复制到实验机

这样我们就启动成功两个flume,现在我们的flume就在扫描/opt/module/applog/log下的新生成的文件,和文件中新增的数据,并把它传入kafka的topic中,然后再传到hdfs中

我们再生成一次数据

  1. cd /opt/module/applog
  2. java -jar gmall-mock-log.jar

 

  查看创建的topic

/opt/kafka/bin/kafka-topics.sh --zookeeper localhost:2181 --list

 

 

查看topic中的信息 

/opt/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning --topic topic_log

 

 

就会输出topic中的内容,而且会一直监听这个topic如果我们再生成一次数据,会看到这里的内容开始刷新

最后我们看一下输出在hdfs中的文件,打开桌面上的浏览器

http://localhost:50070

复制到实验机

输入网址可看到

这个界面,然后我们

 

选择浏览文件系统,就可以看到生成的文件夹

 

 

 

同样,也能看到生成的数据

实验总结

通过这次实验,我们学了flume的使用,了解了在数仓项目中,是如何将日志文件中的用户行为的数据提取出来,以kafka为中间节点,传入hdfs中进行存储。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/945783
推荐阅读
相关标签
  

闽ICP备14008679号