开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第五阶段:爬虫识别-不同行程统计-代码实现及效果】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/673/detail/11704
爬虫识别-不同行程统计-代码实现及效果
目录:
一、代码实现
二、执行效果
三、总结
一、代码实现
1、抽取出数据中的 IP 和数据中的出发地和目的地
获取数据中的 IP、出发地和目的地调用数据 processedData.map 方法,map 拿到一条数据 message。
拿到数据,获取 IP val ip=message.remoteAdder。
获取出发地 dep=message. 没有 depcity,不能直接调用,找到核心参数,封装时将出发地目的地时间封装到 requestParams。调用 req
uestParams.depcity。
获取目的地 val arrcity=message.requestParams.arrcity
processedData.map(message=>{
//获取 ip
val ip =message.remoteAddr
//抽取出数据中的 IP 和数据中的出发地和目的地
//获取出发地
val depcity=message.requestParamsdepcity
//获取目的地
val arrcity=message.requestParams.arrcity
2、使用 ip 作为 key,将出发地拼接目的地,以拼接的结果作为 value 将其输出
//拼接出发地和目的地
不同的城市 deparrCity=depCity+arrcity
val deparrCity=depCity+arrcity
//使用 ip 作为 key,将出发地拼接目的地,以拼接的结果作为 value 将其输出
(ip,deparrCity)
3. 调用 groupByKeyAndWindow,得到的结果是 key(IP)和 value 的 list(出发地拼接目的地的 list
}).groupByKeyAndWindowSeconds(6)seconds(2))//调用 group By
KeyAndWindow,得到的结果是 key(IP)和 value的 list(ua的list)
Key 是 ip
4、获取出 ip,和 value 的 list(出发地拼接目的地的 list),将 value 的 list 去重再求大小
定义变量接收
val ipAndDepArr=message.requestParams.arrcity
IpAndDepArr 是 ip 不同城市出发地和目的地结合
结合.map 拿到数据 message 进行遍历。message._1,1是 IP,第一个值。
获取 ip,IpAndDepArr 返回结果是 ip 和不同城市,groupByKeyAnd
Window 拿到不同城市的 list
获取不同行程的 list
val deparrCity=message 的第二个数据
将 value 的 list 去重再求大小
deparrCity 转换为 list,去重.distinct,求大小.size,val 不同城市的大小
ipAndDepArr.map(message=>{
//获取 ip
val ip=message._1
//获取不同行程的 List
//获取出 ip,和 value 的 list(出发地拼接目的地的 list)
val deparrcity=message._2
//将 value 的 list 去重再求大小。
val deparrsize=deparrcity.toList.distinct.size
5、将 ip 和值大小返回
(ip,deparrsize)
做接收返回
val differentJourneySize=ipAndDepArr.map(message=>{
differentJourneySize
}
前面做接收
//5 按 IP 地址聚合-某个IP,5分钟内查询不同行程的次数
val differentJourneycounts=CoreRule.differentJourney(processedD
ata)
6、将最终数据转换为 Map,便于后续提取,使用。
定义
var=differentJourneyCountsMap=null
遍历 map,将数据转换为
map,differentJourneyCounts.foreachRDD
(rdd=>{ 拿到 rdd,将 rdd 转换为 collectAsMap,数据类型为 [Strin
g,Int],复制粘贴到 var=differentJourneyCountsMap=null,用 differ
entJourneyCountsMap 接收。
//将最终数据转换为 Map,便于后续提取、使用。
var differentJourneysCountsMap:collectionMapstring,
Int]=null
differentJourneysCounts.foreachRDD(rdd=>{
differentJourneysCountsMap=rdd.collectAsMap()
})
二、执行效果
输出,关闭上个输出
//userAgentCounts.foreachRDD(rdd=>rdd.foreach(println)
输出
differentJourneysCounts.foreachRDD(rdd=>rdd.foreach(println)
输出效果,预处理、爬虫、爬虫识别跑起来。理想状态下是 ip 和1
19/05/17 19:31:30 INFO VerifiableProperties: Property zookeeper.
connect is overridden to
19/05/17 19:31:30 INFO VerifiableProperties: Property zookeeper.
connect is overridden to
(192.168.100.2,1)
爬虫出发目的地是固定的只有一种情况,做去重和求大小,求完后只有1个。与 userAgent 结果相同,如果有真实数据是不同的。
停止程序、爬虫
三、总结
1、抽取出数据中的 IP 和数据中的出发地和目的地
val ip =message.remoteAddr
//抽取出数据中的IP 和数据中的出发地和目的地
//获取出发地
val depcity=message.requestParamsdepcity
//获取目的地
val arrcity=message.requestParams.arrcity
2、使用 ip 作为 key,将出发地拼接目的地,以拼接的结果作为 value 将其输出
(ip,deparrCity)
3、调用 groupByKeyAndWindow,得到的结果是 key(IP)和 value 的 list(出发地拼接目的地的list
.groupByKeyAndWindowSeconds(6)seconds(2))
4、获取出 ip,和 value 的 list(出发地拼接目的地的 list),将 value 的 list 去重再求大小
val deparrcity=message._2
//将 value 的 list 去重再求大小。
val deparrsize=deparrcitytoListdistinct.size
5、将 ip 和值大小返回
(ip,deparrsize)
6、将最终数据转换为 Map,便于后续提取,使用。
vardifferentJourneysCountsMap:collectionMapstring,Int]=null
differentJourneysCounts.foreachRDD(rdd=>{
differentJourneysCountsMap=rdd.collectAsMap()
})