开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第五阶段:爬虫识别-关键页面最小访问间隔-下】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/673/detail/11709
爬虫识别-关键页面最小访问间隔-下
目录:
//6遍历时间的 list,将此字符串类型国际时间转换成普通时间(时间戳)
//7将多个时间戳添加到一个 list
//8对此时间戳的 list 进行排序
//9遍历每两个时间戳,求取两个时间戳的时间差
//10将此时间差添加到一个时间差的 list
//11最时间差的 list 进行排序
//12获取排序后的第一个值就是最小时间差
//13将 IP,和最小时间差返回
if(timeList.size>1){
//6遍历时间的 list,将此字符串类型国际时间转换成普通时间(时间戳)
timeList 是时间的集合,用 for 循环遍历每个数据 time 来源于 tim
eList,拿到某个时间。
将此字符串类型国际时间转换成时间戳,用时间戳计算更方便。
2019-05-14T09:08:50+08:00 是数据类型的时间,前面和后面都是#,是独立的数据。
#2019-05-14T09:08:50+08:00#
拿到开发工具,原始数据之间一个T,+8北京的东八区,不是标准的时间类型,先转换为标准的年月日时分秒,再转换为时间戳。
拿到的 time 是2019-05-14T09:08:50+08:00格式,要想转换为2019-05-14 09:08:50要截取。从0截到+的位置,T用空格替换。
time 调用.substring 从0开始截取,截取到数据中加号的位置,T用空格替换.replace。接收 val timeString
for(time<-timeList){
//2019-05-14T09:08:50+08:00
//2019-05-14 09:08:50
val timeString=time.substring(0,time.indexOf(“+”)).replace(targe
t=“T”,replacement=””)
//将 String 类型的时间转换成时间戳
val simple=new SimpleDateFormat 格式年月日时分秒
val simple=new SimpleDateFormat(pattern=”yyyy-MM-dd HH:mm
:ss”)
用 SimpleDateFormat.parse 字符串类型的日期,调用.getTime 拿到时间戳。定义变量接收,时间戳是 long 类型
val longTime=Simple.parse(timeString).getTime
//7将多个时间戳添加到一个 list
遍历时是一个,循环时是多个。定义接收时间戳类型数据的 List,存储 long 类型。
val longTimeList=new util.ArrayList[Long]()
添加 long 类型数据.add(longTime)
将多个时间戳添加到一个 List,List 实例化。
//8对此时间戳的 list 进行排序
longTimeList 进行排序.toArray 转换为 Array,定义变量 val longTi
meListArray 接收。longTimeList 是 ArrayList,ArrayList 不能直接排序,先转换为 Array。
longTimeListArray 进行排序 util.Arrays.sort 里面是转换为 Array 的数据
val longTimeListArray=longTimeList.toArray
util.Arrays.sort( longTimeListArray)
//9遍历每两个时间戳,求取两个时间戳的时间差
时间戳不用 for 循环遍历,求时间差至少两个数据。直接写 for 循环里默认i,数据来源从1开始,Array 角标从0开始。从1开始到 longTimeListArray.length,假设有字符串 Array 有10个数据,大小为10,角标是从0到9,现在是1到9。
longTimeListArray 的角标,括号拿到i,i从1开始,实际数据是从0到9,0没有。直接-longTimeListArray i-1 ,i=1,1-1=0。用第二个值减第一个值就是时间差,定义时间差 timeDiff
for(i<-1 until(longTimeListArray.length)){
val timeDiff= longTimeListArray(i)-longTimeListArray(i-1)]
-报错,查看 longTimeListArray(i-1)] 数据类型
val value:AnyRef=longTimeListArray(i-1)
val timeDiff=longTimeListArray(i)-value
转换为可以加减乘除,先转换为 toString 再转换为 toLong。timeDiff
为第二个数减第一个数的时间差。
val timeDiff=longTimeListArray(i).toString.toLong-longTimeListArra
y(i-1).toString.toLong
for(i<-2 until(longTimeListArray.length)){
i<-1变为i<-2,角标为2-角标为1,第三个数和第二个数时间差,一直到最后一个。
//10将此时间差添加到一个时间差的 list
定义时间差的 List
//实例一个存储时间差的 List
val timeDiffList=new util.ArrayList[Long]()
timeDiffList.add 时间差,有第一次计算、第二次计算结果,时间差产生。有时间差拿到时间差的集合。
//11最时间差的 list 进行排序
timeDiffList 转换为.toArray,定义方法接收,只有 Array 有排序的用法,定义 timeDiffListArray。
调用 util.Arrays.sort( timeDiffListArray) 对时间差的集合进行排序
val timeDiffListArray=timeDiffList.toArray()
util.Arrays.sort(timeDiffListArray)
//12获取排序后的第一个值就是最小时间差
timeDiffListArray(0)为第一个值最小时间差 val
timeDiffListArray(0)数据类型为
val value:AnyRef=timeDiffListArray(
0)
//13将 IP,和最小时间差返回
timeDiffListArray(0) 转换为 Int
(ip,timeDiffListArray(0).toString.toInt)
}else{
(“”,0)
}
if(timeList.size>1){
当 size 大于1时,有两个时走代码可以计算出最小时间差,两个数据1个时间差,不用比。
大于2个可算出多个,小于2个返回“”和0。