开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第五阶段:爬虫识别-小于自设值的次数-需求及思路】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/673/detail/11711
爬虫识别-小于自设值的次数-需求及思路
内容介绍:
一、按 IP 地址聚合-某个 IP ,5分钟内小于最短访问间隔(自设)的关键页面查询次数的需求
二、实现步骤设计
三、代码
四、总结
一、按 IP 地址聚合-某个 IP ,5分钟内小于最短访问间隔(自设)的关键页面查询次数的需求
查询次数为两个时间差之间的次数,所以仍需求出时间差,要求时间差小于最短访问间隔(自设)。
爬虫具备持续、不间断、高效等特性。它的爬取是非常快的。爬取数据的过程中相邻两此的爬取时间差都非常小。
我们可以自定义一个很小的时间,比如2秒,由于爬虫的效率很高,每两次的时间会很短。时间间隔可能小于2秒,也可能大于2秒。我们统计时间间隔小于2秒中的次数,次数越多,它是爬虫的可能性就越大。
这个指标可以很灵活的区分爬虫和普通用户,普通用户两个页面之间需要思考、筛选、分析的时间,可能会很久,在两秒钟以内做完的可能性不大。爬虫则不然,爬虫的效率很高大部分可以在两秒内甚至更短的时间完成。
企业系统内设置了这个自设的最小时间和小于这个时间次数的阈值。如果根据数据计算出的结果(小于自设时间的次数)大于设置的阈值,那么他很有可能是爬虫。
如上图,如果查询次数大于10,那么就很有可能是爬虫;如果小于10,那么就不能确定是否为爬虫。
一、实现步骤设计
1、拿到 kafka 数据,关键页面的广播变量,系统内自设的最小时间广播变量。窗口时间,滑动时间进行计算。
2、获取出流程中的最小访问时间
3、从 kafka 数据中取到 request ,匹配关键页面。
4、匹配成功,返回 IP 和时间,记录( remoteAddr , timelso8601 ),并做 groupByKeyAndWindow 操作,将相同 remoteAddr 的 timelso8601 统计到 ArrayBuffer 中。因为自设了最小访问时间间隔,要将其进行对比,就要算出数据中相邻的两个数据的时间间隔,所以就需要多个日期数据,算出相邻两个时间差,才能进行数据对比。
5、拿到上面的数据进行 map ,循环出每一个 remoteAddr 和它对于的 timelso8601 List 。
6、对 timelso8601 List 进行循环计算,计算临近的两个时间差,将时间差与最小时间对比。
7、若时间差小于预设值的,那么计数器 count 加1。计数器的作用为记录小于自设值的数据的数量。
8、最终封装成( remoteAddr , count ),也就是某个用户对关键页面访问时间小于预设值的访问次数。
9、最后将( remoteAddr , count )返回,收集到 map 中。
二、代码CoreRule.lessDefaultTimes(processedDate,broadcastCriticalPagesList.value,broadcastFlowList.value)
// processedDate 为数据
// broadcastCriticalPagesList 为关键页面
// broadcastFlowList 为流程中的最小访问间隔
创建后得到
def lessDefaultTimes(processedDate:DStream[ProcessedDate],criticalPagesList:ArrayBuffer[String],flowList:ArrayBuffer[FlowCollocation]):Unit = {
三、总结
1、获取企业系统内的自定义的最小时间间隔。遍历流程,获取流程内的规则,找到规则中 ruleName 等于" criticalPagesLessThanDefault "的规则(有两个参数,第一个是默认的最小时间,第二个是阈值),获取出规则中的第一个参数。
2、设置一个计数器(记录小于自设值数据出现的次数)
3、抽取出数据中的 IP 和数据的访问时间
4、遍历数据库中的关键页面的规则。
5、使用 url 与规则进行匹配。若数据的 url 能够与规则的任意一个匹配成功,那么表示这个 url 就是关键页面,将 ip 和时间返回;若数据的 url 能够与规则的任意一个没有匹配成功,那么表示这个 url 不是关键页面,将””和””返回。
6、调用 groupByKeyAndWindow ,获得到的结果是 key ( IP )和 value 的 list (时间的 list )。
7、获取到 ip 和时间的 list 。
8、遍历时间的 list ,将这个字符串类型国际时间转换成普通时间(时间戳)。
9、将多个时间戳添加到一个 list 。
10、对这个时间截的 list 进行排序。
11、遍历每两个时间戳,求取两个时间戳的时间差。
12、用时间差与自设值进行对比。若时间差小于自设值,那么计数器加1;若时间差大于自设值,跳过(什么都不做)。
13、将 ip 和计数器的值返回。
14、将最终数据转换为 Map ,便于后续提取、使用。
以上就是实现最小访问间隔的关键页面查询次数的思路