开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第五阶段:爬虫识别-IP 段统计-需求及思路】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/673/detail/11695
爬虫识别-IP 段统计-需求及思路
目录:
一、目标
二、需求
三、设计
四、详细思路
一、目标
上节课将爬虫识别的八个指标列出,梳理出爬虫识别三件事情以及数据入库三件事情。
实现代码
//1按 IP 段聚合- 5 分钟内的 IP 段(IP 前两位)访问量
目标:计算出5分钟内某个 IP 段(IP 前两位)访问量
二、需求
计算 5分钟内 IP 段的访问量,IP 段是指
192.16856.151->192.168,
192.16856.151 IP 段是192.168计算192.168在此批次里出现多少次、一段时间内出现多少次,计算IP段可以帮助监控爬虫的攻击范围,如果爬虫伪造 ip,但是出口 ip 是公司内部的网络,打出的 IP 段一样,可能 IP 一样,IP 段不一样。
根据 ip 段判断源于哪个区域,大概确定范围,可以判断某个区域访问量是多少。统计 IP 访问量传递来一条一条数据,每一条数据都有 IP 统计 IP 的量。
IP 段 count 传递来一条条数据,每一条都有 IP,将 IP 段截取作为 key,一一作为 value 输出,调用 reduceByKeyAndWindow
三、设计
1、拿到 kafka 读取的 message 数据,封装为 processedData,调用窗口函数,窗口长度5分钟,需求明确表示计算5分钟范围内 IP 段量,滑动长度30s计算指标
2、先判断 remoteAddress 是否有数据,remoteAddress 用户的 IP,判断用户是否为爬虫,如果用户不存在返回(null,1)用户存在获得用户 IP,截取出 IP 前两位,假设为 192.16856.151 IP要192.168,截取 IP 段
3、用户存在获得用户 IP,截取出 IP 前两位,假设为 192.16856.151 IP要192.168,截取 IP 段,IP 作为 key,1作为 value 输出
4、调用 reduceByKeyAndWindow 窗口5分钟,运行周期30秒计算指标,可计算出5分钟范围内 IP 段计算多少次
实现过程与word count 非常像,wordcount 是单词的数量,IP 段 count 是 IP 段的数量.
开发工具实现第一个功能,单独写 updata,判断 IP 段访问量逻辑放到 updata 里,返回结果。
CoreRule.ipBlockCounts()
CoreRule 报红,现在没有 updata,创建 updata。项目中找到 rulecompute businessprocess 右键进行 Scala Object,
创建 CoreRule
//用于八个指标数据的计算
Object CoreRule{
创建后引入,实现 ipBlockCounts 方法,方法要有参数。
//将kafka内的数据使用“#CS#”拆分,拆分后封装成processedData
val processedData=QueryDataPackage.queryDataLoadAndPacka
ckage(kafkaValues)
//processedData.foreachRDD(rdd=>rdd.foreach(println))
数据经过 CS#拆分,返回到 processedData 可以拿到 IP,拿到 IP 可结出 IP 段,数据出入。
有了计算 IP 段访问量,创建
将问号删掉,括号补全,代码块实现5分钟内 IP 段的访问总量
object coreRule {
//1按IP 段聚合 -5分钟内的IP段(IP前两位)访问量
def ipBlockCounts(processedData:DStream[ProcessedData]):Unit=
按照什么先后顺序实现,有数据调用窗口函数,先截取出 IP 段看有没有数据,有返回截取 IP 段,没有返回 (null,1),调用 reduceByKeyA
ndWindow。详细流程在随堂笔记 IP 段访问量。
流程规则数据格式流程是怎样来的,多个流程,一个流程里的数据。
四、详细思路
1、抽取出数据中的 IP
2、截取出 ip 的前两位
3、将前两位作为 key,1作为 value 输出
4、调用 reduceByKeyAndWindow 计算最终每个 ip 段的总量
5、将最终数据转换为 Map,便于后续提取、使用。
有了数据,拿到遍历数据抽取 IP。模拟 count,调动的 IP 段 count,将前两位作为 key,1作为value输出。输出后调用 reduceByKeyAnd
Window,调用5分钟范围内,5分钟设置为窗口宽度,周期设置短一点,需要在很短时间内计算很长时间内的数据所以调用 reduceByKe
yAndWindow。封装成 Map,IP 段、IP 总量、IP段5分钟内总量、5分钟内关键页面总量、5分钟内 UA 种类,实际要一个 IP 和数值。
数值与其它数据进行计算,将IP 里每一个抽出,先将数据封装为 Map,Map 的 key 是 IP,value 为值。IP 为 key,值为总量。有了 IP 直接调用 Map get IP 拿到值,后续要抽数据,为了方便抽取转换为 Map.
粘贴到开发工具
//抽取数据中的 IP
//截取出 ip 的前两位
//将前两位作为 key,1作为 value 输出
//调用 reduceByKeyAndWindow 计算最终每个ip段的总量
//将最终数据转换为 Map,便于后续提取、使用。