开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第五阶段:爬虫识别-IP 统计需求及代码及效果】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/673/detail/11698
爬虫识别-IP 统计需求及代码及效果
内容介绍:
一、需求
二、设计
三、实践
四、思路
五、执行效果
六、总结
一、需求
IP 段访问总量计算完毕
//2 按 IP 地址聚合-某个 IP,5分钟范围内访问量
某个 IP,5分钟内总访问量
计算某个IP在5分钟的访问量,是否为爬虫。八个指标都是爬虫具备的特性,5分钟范围内 IP 数量越多,是爬虫的可能性越大。
普通人查询5分钟内查10-20次,如果是爬虫次数非常多。根据访问总量,企业系统内设置针对5分钟范围内 IP 访问总量指标的阈值。如果数据计算出的结果超过设置的阈值,那么很可能是爬虫。
5分钟内的 IP 访问量设置为100,正常用户访问总量超过100可能性不大,爬虫很容易超过。
二、设计
获取数据,IP 段统计数量,截取 IP 段,做 wordcount。计算 IP 出现多少次,直接拿 IP 做 wordcount
1、拿到 kafka 数据,获取数据
2、统计 remoteaddress 的 wordcount
三、实践
拿代码 CoreRule.ipCounts() 方法为空,传入数据 processedData
CoreRule.ipCounts(processedData)
流程如下:
第一个算完,第二个还在此批数据读出,数据要用很多次。
创建方法
代码补全
def ipBlockCounts(processedData:DStream[ProcessedData]):Unit=
此代码做第二个功能,按 IP聚合,统计某个 IP,5分钟内访问总量
复制粘贴放到最后
四、思路
1、抽取出数据中的 IP
2、将 ip 作为 key,1作为 value,输出
3、调用 reduceByKeyAndWindow 计算最终每个ip的总量
4、将最终数据转换为Map,便于后续提取、使用。
1、抽取出数据中的 IP
ProcessedData.map(message)=>{
//抽取出数据中的 IP
val ip=message.remoteAddr
拿到数据抽取出 IP .map 一条数据,此数据做遍历。val ip=message 直接调用.remoteAdder 为 IP
2、将 ip 作为 key,1作为 value,输出
(ip,1)返回结束
3、调用 reduceByKeyAndWindow 计算最终每个ip的总量
reduceByKeyAndWindow 求总量,两个数据a和b,a和b设置类型为 Int,做a+b操作。第一个参数窗口的长度 Seconds 6秒钟,第二个参数 Seconds 2秒钟滑动周期
}).reduceByKeyAndWindow((a:Int,b:Int)=>a+b,Seconds(6)seconds(2))
//调用 reduceByKeyAndwindow计算最终每个ip的总量
前面定义变量接收,返回,变量为 ipblockCounts,ipblockCounts 返回
val ipCounts=ProcessedData.map(message)=>{
ipCounts
}
代码写完前面做接收,某个 IP 总数计算完毕。
val ipCounts=CoreRule.ipCounts(processedData)
4、将最终数据转换为Map,便于后续提取、使用。
定义 ipCountsMap=null 遍历 map
ipblockCounts.foreachRDD(rdd=>{
rdd 转换为 map
rdd.collectAsMap()
数据类型[String,Int],String 为 IP,Int是值。数据类型给 ipCountsMap
复制粘贴到 rdd.collectAsMap() 报红,将 val 改为 var
var ipBlockCountsMap :collection.Map[string,Int] =null
ipBlockCountsMap=rdd.collectAsMap()
五、执行效果
ipBlockCounts.foreachRDD(rdd=>rdd.foreach(println)
跑起来应该是一个 IP 和数量,没有做截取。执行,数据预处理程序跑起来、爬虫识别跑起来,会输出 IP 和总数。
19/05/17 17:20:50 INFO VerifiableProperties: Property zookeeper.
connect is overridden to
19/05/17 17:20:50 INFO VerifiableProperties: Property zookeeper.
connect is overridden to
(192.168.100.2,5)
192.168.100.2 为 IP,5为访问总数。一秒钟跑一次,窗口宽度6秒钟,出现5可能6秒钟恰好跨在两个1秒钟中间。
爬虫停止,5分钟范围内 IP 访问总量,执行6秒钟改为5分钟即可。
六、总结
1、抽取出数据中的 IP
val ip=message.remoteAddr
2、将 ip 作为 key,1作为 value,输出
(ip,1)
3、调用 reduceByKeyAndWindow 计算最终每个 ip 的总量
.reduceByKeyAndwindow((a:Int,b:Int)=>a+b,Seconds(6)seconds(2))
4、将最终数据转换为Map,便于后续提取、使用。
var ipBlockCountsMap :collection.Map[string,Int] =null
ipblockCounts.foreachRDD(rdd=>{
ipBlockCountsMap=rdd.collectAsMap()
})
截取 IP,将 ip 作为 key,1作为 value,输出,调用 reduceByKeyAnd
Window 为 IP 出现的次数。与 wordcount 一样
reduceByKeyAndWindow 适用场景,计算频繁短时间内计算大时间范围数据,30s计算5分钟