开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第五阶段:爬虫识别-小于自设值的次数-总结】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/673/detail/11714
爬虫识别-小于自设值的次数-总结
内容介绍:
一.总结思路
二.关键代码
已经将代码写完并查看效果,接下来对小于自设值的次数做总结
//8按 iP 地址架合·某个 IP,5分钟内小于最短访间问隔(自设)的关键页面查询次数
val lessDefaultTimes=CoreRule.LessDefaultTimes(processedData,broadcastcriticalPagesList.value,broadcastFlowList.valu
//14指最终数据转换为 Map,便于后续提取、使用。
value lessDefaultTimesMap:collection.Map[string,Int]=null
lessDefaultTimes.foreachRDD(rdd=>{
lessDefaultTimesMap=rdd.collectAsMap()
lessDefaultTimes.foreachRDD(rdd=>rdd.foreach(println))
效果:
一.总结思路
某个 iP,5分钟内小于最短访问间隔(自设)的关键页面查询次数
目标:计算出某个 iP,5分钟内小于最短访问间隔(自设)的关键页面查询次数
思路:
1、获取企业系统内的自定义的最小时间间隔
遍历流程,获取流程内的规则(规则内数据)规则内有8个只需要
找到规则中 ruleNames 等于"criticalPagesLessThanDefault"的规则(有两个参数,第一个是默认的最小时间,第二个是域值)
获取出规则种的第一个参数
2、设置一个计数器(记录小于自设值数据出现的次数)
3、抽取出数据中的 iP 和数据的访问时间 url
4、遍历数据库中的关键页面的规则。
5、使用 url 与规则进行匹配
若数据的 url 能够与规则的任意一个匹配成功,那么表示这个 url 就是关键页面,将 ip 和时间返回
若数据的 url 能够与规则的任意一个没有匹配成功,那么表示这个 url 不是关键页面,将“和"返回
6、调用 groupByKeyAndWindow,或得到的结果是 key(iP)和 valuef 的 Iist(时间的 list)
7、获取到 ip 和时间的 list
8、追历时间的 list,将这个字符串类型国际时间转换成普通时间(时间戳)
9、将多个时间戳添加到一个 list
10、对这个时间影的 st 进行排序
11、遍历每两个时间影,求取两个时间戳的时间差
12、用时间差与自设值进行对比,
若时间差小于自设值,那么计数器加1
若时间差大于自设值,跳过(什么都不做)
13、将别 p 和计教器的值返回
14、将最终数据转换为 Mp,便于后续提取、使用。
二.关键代码
1、获取企业系统内的自定义的最小时间间隔
遍历流程,获取流程内的规则(规则内数据)规则内有8个只需要
找到规则中 ruleNames 等于"criticalPagesLessThanDefault"的规则(有两个参数,第一个是默认的最小时间,第二个是域值)
获取出规则种的第一个参数
for (flow<-flowList){
//遍历流程,获取流程内的规则(id)
val rules=flow.rules
//找到规则中 ruleName 等于"criticalPagesLessThanDefault"的规则(有两个参数,第一个是默认的最小时
间,第二个是词值)
for(rule<-rules){
if (rule.ruleName.equals("criticalpagesLessThanDefault")){
//获取出规则种的第一个参数
defaultTime=rule.rulevalue0*1000
/数据库配置的数据单位是秒
这里需要将其装换成毫秒
}
}
}
2、设置一个计数器(记录小于自设值数据出现的次数)
Var lessDefaultTime=0
3、抽取出数据中的 iP 和数据的访问时间 url
//获取 ip
val ip =message.remoteAddr
//获取 url
val ur1=message.request
//获取 time
val time=message.timeIso8601
4、遍历数据库中的关键页面的规则。
for(criticalPages<-criticalPagesList){
//使用url与规则进行匹配,
if(ur1.matches(criticalPages)){
//若数据的 url 能够与规则的任意一个匹配成功,那么表示这个 url 是关键页面
flag=true
}eIse{
//若数据的 ur1能够规则的任意一个没有匹配成功,那么表示这个 ur1不是关键页面
}
}
5、使用 url 与规则进行匹配
若数据的 url 能够与规则的任意一个匹配成功,那么表示这个 url 就是关键页面,将 ip 和时间返回
若数据的 url 能够与规则的任意一个没有匹配成功,那么表示这个 url 不是关键页面,将“和"返回
if(fIag){//是关键页面,将 ip 和时间返回
(ip,time)
}else{
//不是关键页面,将“”和“”返回
(",")
}
6、调用 groupByKeyAndWindow,或得到的结果是 key(iP)和 valuef 的 Iist(时间的 list)
groupByKeyAndwindow(Seconds(6),Seconds(2))
7、获取到 ip和时间的 list
//获取 ip
val ip=message.-1
//获取时间的1ist
val timelist=message._2
8、追历时间的 list,将这个字符串类型国际时间转换成普通时间(时间戳)
9、将多个时间戳添加到一个 list
for (time<-timeList){
//2019-05-14T09:08:50+08:00
/2019-05-1409:08:50
Val timestring=time.substring(0,time.indexof("+")).replace("T","")
/将 String 类型的时间转换成时间戳
val longTime=simple.parse(timeString).getTime
//9将多个时间戳添加到一个1ist
longTimeList.add(longTime)
}
10、对这个时间影的 st 进行排序
差小 val longTimeListArray= longTimeList.toArray()
Util.Arrays.sort(longTimeListArray)
11、遍历每两个时间影,求取两个时间戳的时间差
12、用时间差与自设值进行对比,
若时间差小于自设值,那么计数器加1
若时间差大于自设值,跳过(什么都不做)
for (i<-1 until(longTimelistArnay.lengthy
val timeDiff=longTimelistArnay(i)tosthing.tolong-longTimeListArray(i-
1).tostring.toLong
//12用时间差与自设铺进行对财
//若时间差小于自设重用B么计数器1
if(timeDiff
lessDefaultTime=1
}
//若时间差大于自设值,跳过什都不做)
}
13、将别 p 和计教器的值返回
(ip,lessDefaultTime)
14、将最终数据转换为 Mp,便于后续提取、使用。
var lessDefaultTimesMap:collection.Map[String,Int]=null
lessDefaultTimes.foreachRpD(rdd=>{
lessDefaultTimesMap=rdd.collectAsMap()
})