开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第五阶段:爬虫识别-小于自设值的次数-代码实现及效果】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/673/detail/11713
爬虫识别-小于自设值的次数-代码实现及效果
1设置一个计数器(记录小于自设值数据出现的,次数)
Var_lessDefaultTime=0(计数器会变化,小于值,默认时间、数量)
2抽取出数据中 iP 和数据的访问时间、url(判断是否是关闭页面)
从第二步骤开始,基本上与第七个模块实行的相近.从第二部到第十部。与第七模块非常相近,所以将第七模块代码直接复制使用稍作修改
val ipAndTime=processedData map(message=>{
/获取 ip
val ip =message.remoteAddr
/获取 url
val url=message.request
/获取 time time=message.timeIso8601
判断是否为关键页面,查询关键页面的次数。写下一个关键页面的 flag
//实例一个是否是关键页面的 flag
var flag=false
(默认不是关键页面)
3遍历数据库中的关键页面的规则
for(criticalPages<-criticalPagesList){
4使 urL 与规则进行匹配
若数据 urL 能够与规则的任意一个匹配成功,那么表示这个 urL 就是关键页面,ip 和时间返回
若数据 urL 能够与规则的任意一个没有匹配成功,那么表示这个 urL 不是关键页面,将”"返回
if(url.matches(criticalPages)){
//若数据 urL 能 够与规则的任意一个匹成功,那么表示这个 url 是关键页面
flag=true
}else{
/若数据 urL 能够与规则的任意一个没有匹配成功,那么表示这个 urL 不是关键页面}
if (flag){
//是关键页面,将ip和时间返回
(ip,time)
}else{
//不是关键页面,将””返回
(“,")
}
}).groupByKeyAndwindow(seconds(6),Seconds(2))
5调用 groupByKeyAndwindow,或得到的结果是 key(IP)和 value 的 list(时间 list)
//遍历 ripAndTime
val minTimeDiff=ipAndTime.map(message=>{
6获取到 ip 和时间的 list
/获取 ip
val ip=message.1
/获取时间的 list
val timelist=message.2
/(两个以上的数据才能计算时间差
if(timeList.size>1){
/实例一个接收时间戳类型数据list
val longTimeList=new util.ArrayList[Long]()
7遍历时间的 list,将字符串类型国际时间转换成普通时间(时间戳)
//计算时间差需要用到
val simple =new simpleDateFormat(pattern ="yyyy-MM-dd HH:mm:ss")
for(time<-timeList){
//2019-05-14T09:08:50+08:00
//2019-05-1409:08:50
先得到时间 list 进行遍历。继续转接时间从零变成+,t 变成空格(转换成标准时间)
Val timestring=time.substring
(0,time.indexof("+")).replace(target ="T",replaceme
/将 string 类型的时间转换成时间戳
val longTime=simple.parse(timeString).getTime
8将多个时间戳添加到一个 List
longTimeList.add(longTime)//一个时间戳,时间的list在前面已布置完成
}
//不需要时间差集合,时间差已被计算完成
9对这个时间戳list进行排序
val longTimeListArray=longTimeList.toArray()
util.Arrays.sort(longTimeListArray)
10遍历每两个时间戳,求取两个时间戳的时间差
for(i<-1 until(longTimeListArray.length)){
val timeDiff=longTimeListArray(i).tostring.toLong-longTimeListArray(i-1).tostring}
不需要时间差 list 将其删除,也可以保留再遍历list,排序不需要将其删除,最小时间差返回不需要删除
11用时间若与自设值进行对比
//若时间差小于自设值,那么计数器加1
if(timeDiffkdefaultTime){
lessDefaultTime+=1
}
//若时间差大于自设值,跳过(什么都不做)
时间差已经存在,自设置是前面设置完成 defaulttime,继续做判断。若时间差小于自设值计数器加=1。
若时间差大于自设置,跳过可以不写,也可以写入 else 内容为空。但是还需要进行一个操作,可以看到计算出来的时间是一个时间戳。最小访问时间间隔是1000毫秒。在数据库内设置的是2或者是1,2永远小于1000,2表示2秒。表示出来的 rulevalue 表示2,需要将其转化成时间戳,所以把 rulevalue*1000,转化成1000毫秒。
后面技术出来的时间差也是毫秒以此之间可以进行对比
12将 ip 和计数器的值返回
LessdefaultTimes
}
}
IP 在前方已经获取到,小于默认值数量
小于最小时间集合的大于 LessdefaultTimes,像 进行返回,括号一定要注意之间存在的关系。切记不要填错位置好。返回后,第八个指标已被计算完成。计算完成后,在前方进行接收复制,回到代码预处理程序
Else{
(“ ”,0)}
})
13指标输出
做一个接收,val 一个小于默认的 times,是计算的数据,然后将其转化成转化成 map,var 格式=null,前面加 map,数据类型直接使用是 collection,遍历数据转化成 map,rdd.collectAsMap 转化成 map 类型接收,此时转化完成,做接收讲rdd 注释。此时代码写完成,查看效果。
//将最终数据换为 map,便于后续提取使用
var minTimeDiffMap:collection.Map[string,Int]=null
Database
minTimeDiff.foreachRDD(rdd=>{
minTimeDiffMap=rdd.collectAsMap()
})
/minTimeDiff.foreachRDD(rdd=>rdd.foreach(println))
Bean Validation
按照 IP 地址聚合-某个 iP,5分钟内小于最短访时间间隔(自设)的关键页面查询次数
val lessDefaultTimes=CoreRule.LessDefaultTimes(processedData,broadcastcriticalPagesList.value,broadcastFlowList.value)
//将最终数据转换 Map,便于后续提取、使用。
var lessDefaultTimesMap:collection.Map[string,Int]=null
lessDefaultTimes.foreachRDD(rdd=>{
Ant
lessDefaultTimesMap=rdd.collectAsMap()
})
lessDefaultTimes.foreachRDD(rdd=>rdd.foreach(println))
运行数据预处理程序查看效果。同时将爬虫右键执行,此时爬虫已经开始,预处理有刷新。
执行爬虫识别第八个指标,执行时,前七个指标也在进行。只不过没有做输出。可以查看到 IP 和数量
此时数据库内设置的最小访问实验间隔为2秒。此时,最短爬虫时间间隔为一秒钟跑一次,窗口是6秒钟,6次存在5个时间间隔,5个时间间隔接是1秒钟,是小于2秒钟的时间间隔,IP 是5次。此时第八个指标的代码和效果已经查看完毕。