开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第五阶段:爬虫识别-UA 种类统计-需求及实现思路】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/673/detail/11701
爬虫识别-UA 种类统计-需求及实现思路
目录:
一、需求
二、设计
三、实践
四、详细思路
一、需求
//4 按 IP 地址聚合-某个 IP,5分钟内的 UA 种类数统计
5分钟内的 UA 种类数统计,种类出现了多少次。
User-Agent
User-Agent 中文名为用户代理,简称UA,它是一个特殊字符串头的字符串,使用字符串使得服务器能够识别客户端使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等都包含在字符串里的 User-Agent,User-Agent 是用户的标识。
正常用户(ip)在短时间内不会切换操作系统和浏览器的,有但不多。爬虫可能通过伪装 User-Agent 来逃过反爬虫系统的检测,聪明的爬虫会做反爬虫的动作,来回切换 User-Agent。
如果查看某一个 ip 在5分钟内频繁切换 User-Agent,明显是躲避检查,切换次数越多,种类越多,数量越多,是爬虫的可能性越大。普通用户切换 User-Age
nt 最多两三次,爬虫来回切换很多次。
企业系统内针对 User-Agent 设置阈值。如果数据计算出的结果(关键页面访问量)超过设置的阈值,切换10次超过5,那么很可能是爬虫。
5分钟内的UA出现次数统计<5
统计 User-Agent 出现的种类数,一条数据发送有 IP User-Agent,同一用户使用浏览器访问10次,统计 User-Agent 种类10次,次数10但只要1,做去重操作。
二、设计
1、拿到 kafka 数据、窗口时间、滑动时间进行统计
2、以 remoteaddr 为 key,抽取 User-Agent 作为 value 输出,调用 groupByKeyAndWindow汇总,ip 作为 key,key 做聚合拿到 User-Agent 例子,聚合后得到格式 ip,ArrayBuffer 里有 ua1,ua2
可能1有10个,2有15个。
总后格式为(192.168.56.1,ArrayBuffer(ua1,ua2,……))
3、将上面的结果集进行 map,获得 User-Agent 聚合,将 ua 进行去重统计个数,remoteaddr 作为 key,User-Agent 出现数量作为 value 返回。ArrayBuffer 有 ua1,ua2,ua3,3不是具体哪三个,去重求 ArrayBuffer 大小,大小是 User-Agent 种类数。去重,求大小,remoteaddr 作为 key 统计 key 统计 ua 个数,返回uaCount
4、将统计结果返回,转换为 map
三、实践
复制粘贴代码 CoreRule.User-Agent 到开发工具,User-Agent 统计次数功能放在 CoreRule 代码号里,拿数据 processedData,不需要关键页面,没有关键页面需求。创建
大括号补全,实现第四个放到最后
//4 按IP 地址聚合 -某个 IP,5分钟内的 UA 种类数统计
def userAgent(processedData:DStream[ProcessedData]):Unit={
搭建了架子、梳理了思路
四、详细思路
1、抽取出数据中的 IP 和数据中的ua
拿到 DStream,map 拿到数据,统计 IP 和 userAgent
2、使用 ip 作为 key,ua 作为 value,将其输出
有 ip、userAgent 直接返回
3、调用 groupbykeyAndWindow,得到的结果是 key(IP) 和 value 的 list(ua 的 list)
求得大小拿到 ip 和 value list,没办法拿到大小。
4、获取出 ip,和value 的 list(ua 的 list),将 value 的 list 去重再求大小。
5、将 ip 和值大小返回
6、将最终数据转换为 Map,便于后续提取、使用。放到前面
//抽取出数据中的 IP 和数据中的 ua
//使用 ip 作为 key,ua 作为 value,将其输出
//调用 groupbykeyAndWindow,得到的结果是 key(IP)和 value 的list(ua的list)
//获取出 ip,和 value 的 list(ua的list),将 value 的 list 去重再求大小。
//将 ip 和此值大小返回
//将最终数据转换为 Map,便于后续提取、使用。
拿到 ip 和 ua,ip 作为 key,userAgent 作为value 返回。返回时调用 groupbykeyAndWindow 进行分组,将相通 key 的 value 汇总在一起得到 key 和 value 的 list,拿到 key、value list、ip,将value 的 list 去重求大小,返回 ip 和数值。