开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第五阶段:爬虫识别-UA 种类统计-代码实现及效果】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/673/detail/11702
爬虫识别-UA 种类统计-代码实现及效果
目录:
一、代码实现
二、执行效果
三、总结
一、代码实现
1、抽取出数据中的 IP 和数据中的 ua
统计 IP 截取 IP 和 ua,调用数据 processedData.map 进行遍历循环,map 拿到一条数据 message,message 进行循环。
拿到数据,截取 IP val ip 接收=message.remoteAdder。
获取 ua val ua=message.httpUserAgent
processedData.map(message=>{
//抽取出数据中的 IP 和数据中的 ua
//获取 ip
val ip =message.remoteAddr
//获取 ua
val ua =message.httpUserAgent
2、使用 ip 作为 key,ua 作为 value,将其输出
(ip,ua)
3、调用 groupByKeyAndWindow,得到的结果是 key(IP)和 value 的 list(ua 的 list)
.groupByKeyAndWindow 传入参数,reduceByKey 时加加,groupby
keyAndWindow 分组不需要加,直接写窗口函数需要的参数,窗口的宽度6秒钟,滑动的步长2秒钟,迭代计算做完。输出(ip,ua)调用 groupbykeyAndWindow 得到 IP 和 ua 的 list,返回结果为 IP 以及 list 里面是 ua
做接收 val ipAndUA, ipAndUA 是拿到的结果。
val ipAndUA=ProcessedData.map(message)=>{
}).groupByKeyAndWindowSeconds(6)seconds(2))
//调用 group By
KeyAndWindow,得到的结果是 key(IP)和 value的 list(ua的list)
Key 是 ip
4、获取出 ip,和 value 的 list(ua 的 list),将 value 的 list去重再求大小。
获取 ipAndUA,调用 groupByKeyAndWindow,得到的结果是 key(IP)和 value的 list(ua的list)。获取出ip,和value的list(ua的list),将 value的 list去重再求大小。
拿到 key 和 value的 list,调用.map,处理完的一条条数据 messag
e,获取 ip,val message.
ipAndUA 返回 ip 和 ua,经过 groupByKeyAndWindow 返回 ip 和 value的list 两个值。_1是IP,第一个值。
获取 ua 的 list,val ualist=message.2
ualist 去重,没有.distinct,ualist 数据类型为 Iterable[String]=ualist 不提供 distinct。
转换为 tolist,调用.distinct 可进行去重,去重后调用.size 求大小。拿到 val uaCounts,此批次中一个 ip 有多少 ua
// 获取出 ip,和 value 的 list(ua的list),将 value 的 list 去重再求大小。
ipAndUA.map(message=>{
//获取 ip
val ip=message._1
//获取 ua 的 list
val uaList=message._2
//将 value 的 list去重再求大小。
val uaCounts= uaList.toList.distinct.size
5、将 ip 和值大小返回
(ip,uaCounts),前面做接受 userAgent 并返回
val userAgent=ipAndUA.map(message=>{
(ip,uaCounts)
})
userAgent
ip 和 ua 返回调用 groupByKeyAndWindow 拿到 key 和 value 的 list(ua的list)。单独拿到 ip、ualist,ualist 转换为 tolist 进行.disti
nct.size。返回接收
//4 按 IP 地址聚合-某个IP,5分钟内的 UA 种类数统计
val userAgentcounts=CoreRule.userAgent(processedData)
6、将最终数据转换为 Map,便于后续提取、使用。
var=userAgentCountsMap=null
将数据转换为 map,Counts.foreachRDD(rdd=>{ 拿到 rdd,将 rdd 转换为 collectAsMap,数据类型为 [String,Int],复制粘贴到 var=use
rAgentCountsMap=null,用 userAgentCountsMap 接收。使用直接调用。
//将最终数据转换为 Map,便于后续提取、使用。
var userAgentCountsMap: collection.Map[string,Int]=nul]
userAgentCounts.foreachrDD(rdd=>{
userAgentCountsMap=rdd.collectAsMap()
})
二、执行效果
输出,关闭上个输出
//criticalPageCounts.foreachRDD(rdd=>rdd.foreach(println)
userAgentCounts 是 ip 和 userAgent size
输出效果,预处理、爬虫、爬虫识别跑起来。返回1,userAgent 去重,6秒钟,1秒钟刷一次有6条数据。6条数据虽然调用 groupByKey
AndWindow,但做了去重。爬虫只有一个,userAgent 只写一个,一个经过去重求大小只有一个。
19/05/17 19:03:56 INFO VerifiableProperties: Property zookeeper.
connect is overridden to
19/05/17 19:03:56 INFO VerifiableProperties: Property zookeeper.
connect is overridden to
(192.168.100.2,1)
停止爬虫、程序
三、总结
1、抽取出数据中的 IP 和数据中的 ua
//获取 ip
val ip =message.remoteAddr
//获取 ua
val ua =message.httpUserAgent
2、使用 ip 作为 key,ua 作为 value,将其输出
(ip,ua)
3、调用 groupbykeyAndWindow,得到的结果是 key(IP)和 value的 list(ua的list)
.groupByKeyAndWindowSeconds(6)seconds(2))
4、单独获取出 ip,和 value 的 list(ua的list),将 value 的 list 去重再求大小就是 ua 的种类
//获取 ip
val ip=message._1
//获取 ua 的 list
val uaList=message._2
//将 value 的 list去重再求大小。
val uaCounts= uaList.toList.distinct.size
5、将 ip和值大小返回
(ip,uaCounts)
6、将最终数据转换为 Map,便于后续提取、使用。
var userAgentCountsMap: collection.Map[string,Int]=nul]
userAgentCounts.foreachrDD(rdd=>{
userAgentCountsMap=rdd.collectAsMap()
})
进入 groupbykeyAndWindow,以下是独立操作
val ipAndUA=ProcessedData.map(message)=>{
//抽取出数据中的 IP 和数据中的 ua
//获取 ip
val ip =message.remoteAddr
//获取 ua
val ua =message.httpUserAgent
//使用 ip 作为 key,ua 作为 value,将其输出
(ip,ua)
}).groupByKeyAndWindowSeconds(6)seconds(2))
拿到 ip 和 ua 的 list,然后单独将 ip ua 抽出,抽出后转换去重求大小。
分两步先求取出 ip 和 ua 的 list,然后对 ua 的 list 去重、求大小。