开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第五阶段:爬虫识别-关键页面最小访问间隔-需求及思路】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/673/detail/11707
爬虫识别-关键页面最小访问间隔-需求及思路
目录:
一、目标
二、需求
三、设计
四、详细流程
一、目标
//7 按 IP 地址聚合-某个 IP,5分钟内的关键页面最短访问间隔,
代码很长,业务简单。
在关键页面的前提下,拿到 url 与关键页面的正则匹配,匹配上表示是关键页面。统计最短访问间隔,爬虫访问界面时访问10次、20次,10次里有9个间隔,20次里有19次间隔,间隔最小值是需求。
目标:计算出某个IP,5分钟内的关键页面最短访问间隔
二、需求
最小访问时间间隔,是衡量数据是否是爬虫的很好的指标。
一个普通用户,两次访问关键页面的时间间隔应该不是很短,从第一个界面跳到第二个界面,两个界面都是关键页面,看数据时需要思考的过程,需要一段时间,查询完票的信息要看看合不合适,才会进行下一次查询。
爬虫不需要思考,会不断的爬取关键页面的数据信息,甚至攻击关键页面,爬时不思考,关键页面的两次查询间隔时间很短。查询间隔越小是爬虫的可能性越大,正常人需要思考、权衡,花费时间较长。
需要计算每两次查询的时间间隔,做10次查询有9个间隔,第一个和第二次、第二次和第三次、第三次和第四次等等,一段时间,此间隔时间最小是多少。来衡量一个用户是否有可能为爬虫用户。最小间隔越小,是爬虫的可能性就越大。
针对最短访问间隔企业系统内设置此指标的阈值。如果根据数据计算出的结果(关键页面访问量)小于设置的阈值,那么很有可能是爬虫。
如果数据计算出的间隔是1,很可能是爬虫,人不可能马上去下一个操作,没有思考的时间。
5分钟内的关键页面最短访问间隔<2
三、设计
1、拿到 kafka 数据,关键页面的广播变量,窗口时间,滑动时间进行计算
是关键页面的前提下做后续操作
2、从 kafka 数据中取到 request,匹配关键页面
如果匹配成功表示是关键页面 true,不成功 false 不是关键页面
3、匹配成功,记录(remoteaddr,timelso8601),并做 groupByKeyAn
dWindow操作,将相同remoteaddr的timelso8601统计到 ArrayBuf
fer中
匹配成功返回 ip 和时间,拿到关键页面访问时间,又拿到第二个关键页面访问时间。调用 groupByKeyAndWindow 拿到 ip 和关键页面时间的 list 统计到 ArrayBuffer
4、拿到上面的数据进行map,循环出每一个 remoteaddr 及对应的 timelso8601 的 List
前面拿到时间 list 进行去重、求大小,现在求时间的差值不是时间出现的次数,要最小的时间差。
5、对 timelso8601 List 进行循环计算,计算临近的两个时间差,封装到ArrayBuffer中
假设访问10次界面,先拿到时间点,进行排序计算出相邻两个的时间差,计算出9个时间差,第二个时间减第一个时间是时间差以此类推拿到九个时间差,封装到 ArrayBuffer 中,指时间差的 ArrayBuffer
6、在将时间差的 ArrayBuffer进行排序,取出最小的时间差,最后将(remoteaddr,timelso8601最小值)返回,收集到 map 中。
前面步骤一样,拿到 list 后不去重求大小,将几个时间遍历,求两个时间差,封装到 ArrayBuffe 进行排序,求最小值。
方法名字复制粘贴 CoreRule.criticalPagesMinTime 放到开发工具,括号补全,拿数据 processedData,关键页面信息 broadcastCritical
PagesList.value
CoreRule.criticalPagesMinTime(processedData,broadcastCriticalPa
gesList.value
创建方法,问号删除括号补全
//7 按 IP 地址聚合-某个 IP,5分钟内的关键页面最短访问间隔
def criticalPagesMinTime(processedData:DStream[ProcessedData
],value:ArrarBuffer[String]:Unit={
大概流程
拿到关键页面
时间做 groupByKeyAndWindow 拿到 ip 和关键页面时间的 list 时间的 list 遍历,计算时间差,封装到 ArrayBuffer
时间差的 ArrayBuffer 排序,取最小时间差
四、详细流程
1、抽取出数据中的 IP 和数据的访问时间及 url
求最小访问时间间隔,需要多个数据,最少两个时间
2、遍历数据库中的关键页面的规则
3、使用 url 与规则进行匹配
若数据的 url 能与规则的任意一个匹配成功,表示此 url 是关键页面,将 ip 和时间返回
若数据的 url 与规则的任意一个没有匹配成功,表示此 url 不是关键页面,将““和”“返回
拿到是否为关键页面并且有返回值
4、调用 groupByKeyAndWindow,得到的结果是 key(IP)和 value的 list(时间的list)
前面操作将时间的 list 去重、求大小
5、 获取到ip和时间的list I
6、遍历时间的 list,将此字符串类型国际时间转换成普通时间(时间戳)
拿到的时间不是正规的时间模式,时间里包含其它内容,转换成正常时间。先转换为年月日时分秒,再转换为时间戳。用多个时间计算,计算出相邻两个时间差。
7、将多个时间戳添加到一个 list
8、对此时间戳的 list 进行排序
算相邻两个时间的时间差,如果第三个和第八个、第一个和第九个求时间差没有意义,要算第一个和第二个、第三个和第四个以此类推相邻两个数据的时间差。时间戳添加到一个 list 进行排序。
9、遍历每两个时间戳,求取两个时间戳的时间差
后一个减前一个求取时间差
10、将此时间差添加到一个时间差的 list
11、最时间差的list进行排序(从小多大或从大到小)
12、获取排序店的第一个值就是最小时间差 (排完序后是升序)
13、将 IP,和最小时间差返回
14、将最终数据转换为 Map,便于后续提取、使用。
1-5步做过很多次,后面几步先将时间遍历转换为普通时间后封装为时间戳。所有时间戳放到一个 list 排序,排序目的是拿到顺序。计算相邻两个时间差,拿到时间差的 list,再排序为升序,第一个为最小值,返回 ip 和最小值。
粘贴到开发工具
//1抽取出数据中的IP和数据的访问时间及 url
//2遍历数据库中的关键页面的规则
//3使用 url 与规则进行匹配
//若数据的 url 能与规则的任意一个匹配成功,表示此 url 是关键页面,将 ip 和时间返回
//若数据的 url 与规则的任意一个没有匹配成功,表示此 url 不是关键页面,将““和”“返回
拿到是否为关键页面并且有返回值
//4调用 groupByKeyAndWindow,得到的结果是 key(IP)和 value的 list(时间的list)
//5获取到 ip和时间的list
//6遍历时间的 list,将此字符串类型国际时间转换成普通时间(时间戳)
//7将多个时间戳添加到一个 list
//8对此时间戳的 list 进行排序
//9遍历每两个时间戳,求取两个时间戳的时间差
//10将此时间差添加到一个时间差的 list
//11最时间差的list进行排序
//12获取排序后的第一个值就是最小时间差
//13将 IP,和最小时间差返回
//14将最终数据转换为 Map,便于后续提取、使用。