开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第五阶段:爬虫识别-关键页面最小访问间隔-效果及总结】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/673/detail/11710
爬虫识别-关键页面最小访问间隔-效果及总结
内容介绍:
一、求最小关键页面的访问数
二、求最小访问间隔步骤总结
一、求最小关键页面的访问数
ipCookCount 是前面拷过来的,因此我们把它删去,改为 val minTimeDiff ,这样就求出了最小时间。在最后的框复制,即为最小时间间隔。返回后进行接收,val minTimeDiff=CoureRule ,并转化为 Map 。
var minTimeDiffMap:collection.Map[String,Int]=null ,
minTimeDiff.foreachRDD(rdd=>{
minTimeDiffMap=rdd.collectAsMap()
})
然后我们验证其效果,关机前六个代码,验证第七个。首先执行数据域处理的代码,显示 DateProcessLauncher 并运用爬虫,数据域接收到数据后,运行第七个模块代码(如下)
minTimeDiff.foreachRDD(rdd=>rdd.foreach(println))
这里显示的是 ip 和范围,“1000”为1000毫秒。此时爬虫为一秒钟跑一次,两秒跑两次,而窗口为六秒,这样应有五个或六个时间,可以计算出四个或五个时间差,这些时间差应全在范围内,所以显示均为1000毫秒。
二、求最小访问间隔步骤总结
1、第一步
拿到数据后,抽取出数据中的 ip 和数据的访问时间及 url , ip 即是为了断定数据 ip , url 用于判断是否是关键页面,访问时间用于计算时间的差,要计算时间间隔就需要先抽取时间。
val ip =message.remoteAddr
//获取 url
val url=message.request
//获取 time
val time=message.timeIso8601
2、第二步
遍历数据库中的关键页面的规则。
3、第三步
使用 url 进行匹配。若数据的 url 能够与规则的任意一个匹配成功,那么表示这个 url 就是关键页面;若数据的 url 能够与规则的任意一个没有匹配成功,那么表示这个 url 不是关键页面。通过 flag 来显示是否为关键页面,若没有匹配成功为 false ,匹配成功为 true 。for(criticalPages<-criticalPagesList){
if(url.matches(criticalPages)){
flag=true
}else{
}
}
若是关键页面,将 ip 和时间返回;
if(flag){
(ip,time)
若不是关键页面,将“”和“”返回。
}else{
(“”,””)
}
4、第四步
调用 groupByKeyAndWindow ,获得到的结果是 key(IP) 和 value 的 list (时间的地址)。
.groupByKeyAndWindow(Seconds(6),Seconds(2))
5、第五步
获取到 ip 和其对应的时间的 list ,有以上两个数据才能计算时间差。如果拿到的数据只有一个日期,就无法计算时间间隔,就只能返回“”“”和0。当 size >1,即日期至少有两个才能计算时间差。从0截取至+,将 T 进行替换。通过 simple=new SimpleDateFormat 进行转换得到 get.Time 。实例(接受时间数据戳类型数据的 list ):
val longTimeList=new util.ArrayList[Long]()
//获取 ip
val ip=message._1
//获取时间的 list
val timeList=message._2
6、第六步
遍历时间的 list ,将这个字符串类型国际时间转换成普通时间(时间戳)。
7、第七步
将多个时间戳添加到一个 list 。
val simple = new SimpleDateFormat (“ yyyy - MM - dd HH : mm : ss” )
for ( time <- timeList ){
//2019-05-14T09:08:50+08:00
//2019-05-14 09:08:50
val timeString = time . substring ( 0 , time . indexOf ("+”)). replace (" T",””)
//将 String 类型的时间转换成时间戳
val longTime=simple.parse (timeString).getTime
//将多个时间戳添加到一个 list
longTimeList.add(longTime)
}
8、第八步
对时间戳的 list 进行排序。在这个 list 里时间戳十个或二十个为列,将他们进行排序,因为若不是相邻的两个数据那么计算没有意义,需要计算的一定是相邻两个数据的时间差。
val longTimeListArray=longTimeList.toArray()
util.Arrays.sort(longTimeListArray)
9、第九步
遍历两个时间戳,求取两个时间戳的时间差。拿到角标为1的时间戳和第0个时间戳,用第二个减去第一个拿到一个时间差。以此循环。
10、第十步
将该时间差添加到一个时间差的 list 。
for ( i <-1 until (longTimeListArray . length )){
val timeDiff= longTimeListArray(i).toString.toLong -longTimeListArray(i-1). toString . toLong
timeDiffList.add(timeDiff)
}
11、第十一步
将时间差的 list 进行排序。
val timeDiffListArray= timeDiffList.toArray()
util.Arrays.sort(timeDiffListArray)
12、第十二步
获取排序后的第一个值就是最小时间差。
13、第十三步
将 IP 和最小时间差返回。
(ip,timeDiffListArray(0).toString.toInt)
14、第十四步
将最终数据转换为 Map ,便于后续提取、使用。
var minTimeDiffMap:collection.Map[String,Int]=null minTimeDiff.foreachRDD(rdd=>{
minTimeDiffMap= rdd.collectAsMap()
})