开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第五阶段:爬虫识别-不同行程统计-需求及实现思路】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/673/detail/11703
爬虫识别-不同行程统计-需求及实现思路
目录:
一、目标
二、详细需求
三、设计
四、详细思路
一、目标
//5 按 IP 地址聚合-某个 IP,5分钟内查询不同行程的次数
目标:计算出某个 IP,5分钟内查询不同行程的次数。
二、详细需求
正常用户的行程基本都是确定的,普通用户买票时从哪出发,发哪里去都是确定的,变化的可能性不大。例如从北京去上海,可能查询很多车次和时间,但是行程永远是北京到上海,可能出现特殊的情况,但肯定是少数。
爬虫行程是不固定的,一个买完给另一个买,循环迭代,查询不同行程次数非常多。在短时间内大量的爬取不同行程、不同车次、不同时间,与普通用户是有区别的,通过此维度的指标能计算出爬虫的特征。正常用户不同行程数量较少,基本都是确定的,但爬虫非常多,通过数量可判断爬虫。如果处理数据后发现不同行程种类很多,很可能是爬虫。
统计一段时间内 ip 查询不同行程的次数(北京到上海查了 10 次,作为一次)次数越多,是爬虫的可能性就越大,越小是爬虫可能性越小。
访问不同行程的次数企业系统内设置此指标的阈值。如果根据数据计算出的结果(关键页面访问量)超过设置的阈值,很有可能是爬虫。
正常用户查询次数在10个以内,超过10个认为很可能是爬虫。
5分钟内查询不同行程的次数<10
从北京到上海,上海到南京,南京到苏州,苏州到广州,广州回来。北京到上海是一个行程,上海到南京是一个行程,如果从北京到上海访问20次,相通行程算1个。从北京到上海,上海到南京是不同行程,出发地不同。
三、设计
1、拿到 kafka 数据,窗口时间,滑动时间进行计算
2、取出 remoteaddr,出发城市、到达城市,进行封装 (remoteAddr(re
questParams.depcity,requestParams.arrcity)),并进行 groupByKey操作,将当前 remoteaddr 的所有查询行程封装到buffer中
remoteaddr(ip),行程有出发城市和目的地,requestParams 调用出发地和目的地,封装 出发地和目的地
3、将出发城市和到达城市转换成字符串“depcityarrcity”,然后进行去重操作、count 操作,得到5分钟内 remoteaddr 查询了多少个不同城市
出发地和目的地拼接为字符串,拼接后的数据作为 value 输出,key为 remoteaddr,拿到结果去重、求大小。北京到上海10次,去重是1种
4、将(remoteaddr,count)封装,记得到最终结果,并收集到 map中
搭架子,复制粘贴 CoreRule.differentJourneys,括号补全,拿数据 processedData,不涉及关键页面。创建方法,问号删掉,括号补全,剪切到最后。
//5 按IP 地址聚合 -某个 IP,5分钟内查询不同行程的次数
def differentJourneys(processedData:DStream[ProcessedData]):u
nit={
四、详细思路
1、抽取出数据中的 IP 和数据中的出发地和目的地
2、使用 ip 作为 key,将出发地拼接目的地,以拼接的结果作为 value将其输出
3、调用 groupByKevAndWindow,得到的结果是 key(IP)和 value 的list(出发地拼接目的地的 list
4、单独获取出 ip,和 value 的 list(出发地拼接目的地的list),将value 的 list 去重再求大小
5将 ip 和值大小返回
6. 将最终数据转换为 Map,便于后续提取,使用。
与 UA 种类统计很像,第二步多了出发地与目的地的拼接
//抽取出数据中的 IP 和数据中的出发地和目的地
//使用 ip 作为 key,将出发地拼接目的地,以拼接的结果作为 value将其输出
//调用 groupByKevAndWindow,得到的结果是 key(IP)和 value 的list(出发地拼接目的地的 list
//单独获取出 ip,和 value 的 list(出发地拼接目的地的list),将value 的 list 去重再求大小
//将 ip 和值大小返回
//将最终数据转换为 Map,便于后续提取,使用。