开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第五阶段:爬虫识别-关键页面访问量-实现代码及效果】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/673/detail/11700
爬虫识别-关键页面访问量-实现代码及效果
目录:
一、代码实现
二、执行效果
三、总结
一、代码实现
1、抽取出数据中的 IP 和数据中的 url
拿两个数据,IP 作为最终的 key,url 确定是否为关键页面。调用数据 processedData.map 拿到每一条数据 message,截取 ip=message 是 processedData 类型,调用.remoteAddr 服务器的 ip。
获取 url,val url=message.request,request 为访问的 url
def criticalPagesCounts(processedData:[ProcessedData],criticalPa
gesList:ArrarBuffer[String]:DStream[Unit]={
processedData.map(message=>{
//抽取出数据中的 IP 和数据中的 url
//获取 ip
val ip =message.remoteAddr
//获取url
val url=message.request
2、遍历数据库中的关键页面的规则。
规则 criticalPagesList 关键页面的 List,用 for 循环遍历,来源于关键页面 List。遍历每个关键页面使用 url 进行匹配 url.matches 匹配关键页面
//遍历数据库中的关键页面的规则。
for(criticalPages<-criticalPagesList){
//使用 url 与规则进行匹配,
url.matches(crititalPages)
}
3、使用 url 与规则进行匹配
若数据的 url 能够与规则的任意一个匹配成功,那么表示此 url 是关键页面,将ip和1返回
若数据的 url 能够与规则的任意一个没有匹配成功,那么表示此 url不是关键页面,将ip和0返回
做判断 if 如果 url 匹配上关键页面表示匹配成功,数据是关键页面,否则表示匹配不成功,数据不是关键页面。
定义是否是关键页面的标记,实例一个是否是关键页面的 flag,flag 表示是否是关键页面,默认 false 都不是关键页面,如果匹配成功改为 true,不成功什么都不做。for 循环完成,假设有十个关键页面,匹配到任意一个都变为 true,一个都匹配不上是 false。
for 循环外面如果 flag 是 true 匹配成功是关键页面,返回 ip 和1,否则返回 ip 和0
//实例一个是否是关键页面的 flag
var flag=false
//使用 url 与规则进行匹配
if(url.matches(criticalPages)){
//匹配成功 表示数据是关键页面 flag=true
}else{/
/匹配不成功 表示数据不是关键页面
}
}
if(flag){
//若数据的 url 能够与规则的任意一个匹配成功,表示此 url 是关键页面,将 ip和1返回
(ip,1)
}else{
//若数据的 url 能够与规则的任意一个没有匹配成功,表示此url 不是关键页面,将 ip 和0返回
(ip,0)
}
4、调用 reduceByKeyAndWindow 计算最终每个 ip 段的总量
复制粘贴
reduceByKeyAndWindow((a:Int,b:Int)=>a+b,Seconds(6),Seconds(
2) )//调用 reduceByKeyAndWindow 计算最终每个 ip 段的总量
reduceByKey 做++操作,如果不是关键页面 ip 和0,0+1=1,窗口宽度6秒钟,执行步长2秒钟。
关键页面访问量计算完毕,前面做接收
//3 按 IP 地址聚合-某个 IP,5分钟内的关键页面访问总量
val criticalPagesCounts=CoreRule.criticalPagesCounts(processedD
Ata,broadcastCriticalPagesList,value)
5、将最终数据转换为 Map.便于后续提取、使用。
调用 val 关键页面 map =null,遍历转换结果 .foreachRDD rdd.coll
ectAsMap()
数据类型 collection.Map 里面是 String 类型的 IP,Int 类型的值。数据类型定义到 criticalPagesCountsMap,用此数据类型进行接收
报红,将 val 改为 var
//将最终数据转换为 Map,便于后续提取、使用。
var criticalPagesCountsMap:collection.Map[String,Int]=null
criticalPagesCounts.foreachDD(rdd=>{
criticalPagescountsMap=rdd.collectAsMap()
})
二、执行效果
实现 foreachRDD 执行效果,关键页面访问多少次。
criticalPagesCounts.foreachRDD(rdd=>rdd.foreach(println))
上面第二个是一共访问多少次,没有关键页面要求,关闭上面输出
//2按 IP 地址聚合-某个 IP,5分钟内总访问量
//ipcounts.foreachRDD(rdd=>rdd.foreach(println))
程序停止,预处理执行,爬虫跑起来,爬虫识别右键执行此为关键页面的访问量,前面是访问总量。
19/05/17 18:01:08 INFO VerifiableProperties: Property zookeeper.
connect is overridden to
19/05/17 18:01:08 INFO VerifiableProperties: Property zookeeper.
connect is overridden to
(192.168.100.2,6)
数值6与没加关键页面一样,爬虫数据单一,最终过滤是数据的访问量,与真实数据有区别,数据正确。
第三个做完,爬虫停止。
三、总结
1、抽取出数据中的 IP 和数据中的 url
url 目的是否为关键页面,url 匹配关键页面
//获取 ip
val ip =message.remoteAddr
//获取url
val url=message.request
2、遍历数据库中的关键页面的规则。
for(criticalPages<-criticalPagesList){
//使用 url 与规则进行匹配,
url.matches(crititalPages)//匹配成功 表示数据是关键页面 flag=true
}else{
//匹配不成功 表示数据不是关键页面
}
}
3、使用 url 与规则进行匹配
若数据的 url 能够与规则的任意一个匹配成功,表示此 url 是关键页面,将 ip 和1返回
若数据的 url 能够与规则的任意一个没有匹配成功,表示此 url 不是关键页面,将 ip 和0返回,通过循环返回,判断,flag 表示是否是关键页面
if(flag){
(ip,1)
}else{
(ip,0)
}
4、调用 reduceByKeyAndWindow 计算最终每个 ip 段的总量
reduceByKeyAndWindow((a:Int,b:Int)=>a+b,Seconds(6),Seconds(
2))
5、将最终数据转换为 Map.便于后续提取、使用。
var criticalPagesCountsMap:collection.Map[String,Int]=null
criticalPagesCounts.foreachDD(rdd=>{
criticalPagescountsMap=rdd.collectAsMap()
})
第三个已实现,遍历规则时不是匹配上后立刻返回(ip,1)(ip,0),先判断拿到的结论是否为关键页面,根据是与不是返回,如果在 flag=true 返回1报错,reduceByKey 调用不起来。