开发者学堂课程【大数据实战项目 - 反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第六阶段:爬虫识别-爬虫数据去重】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/674/detail/11727
爬虫识别-爬虫数据去重
内容介绍:
一.黑名单数据去重
二.思路与关键代码
三.效果
一.黑名单数据去重
1.目标:
经过计算后的黑名单数据含有重复数据,在写入 redis 前,需要对这批数进行去重
2.需求
拿到黑名单数据 antiBlackResults 会发现,之前是每隔5分钟(这里是每6秒钟)进行的指标计算,此时出现的结果就会有重复的 ip 黑名单数据,在保存 Redis 之前,要将重复的数据进行过滤。(比如说,一批数据总共50条,20条非爬虫数据过滤掉之后,剩下30条爬虫数据,而这30条数据里面,很有可能是一个爬虫打过来的数据,因此要对爬虫数据去重。)
如图所示为数据处理流程,采集脚本数据后,向 Kafka 集群发送数据,每访问一次就发送一条数据,所以,30条爬虫数据来源于一只爬虫是极有可能的。所以在这一批数据里面,只是一个爬虫,但是它有30条数据,这30条数据针对它进行判断是否是爬虫,那么全都是爬虫,实际上,它返回的这30个结果一模一样,所以要进行去重。
3.设计
1.拿到黑名单数据进行 map, 获取出数据的 ip 和打分数据 (flowsScore) (包含了是否是爬虫)
flowsScore
就是数据中的flowsScore:Array[FlowScoreResult]
的值,
case class FlowScoreResult( flowId: string,
flowScore: Double,
flowLimitedScore: Double,
isUpLimited: Boolean,
flowStrategyCode: String,
hitRules: List[String],
hitRules: List[String],
hitTime: String)
flowsScore
包含了流程 ID ,分数,阈值,最终是不是爬虫,以及后面的 code 码,规则时间。
2.调用 reduceByKey 算子将相同 ip 的数据过滤,只保留最后一个(任意一个,这是因为相同 IP 的数据的结果都是一样的,只保留任何一个就可以,其余的全部去掉。)
二.思路与关键代码:
1. 遍历每一个黑名单数据,将数据的 ip 作为 key , flowsScore 作为 value 获取出来
2. 将两个数据返回
3. 调用 reducebykey((k,v)=>v) 取出相同的数据中的最后一个
(最后一个或第一个都是可以的)
//2
对爬虫数据进行去重操作
//2.1
遍历每一个黑名单数据,将数据的 ip 作为 key , flowsScore 作为 value 获取出来
val blackDatas= allBlackDatas.map(message=>{
//
拿到数据后,获取数据的 IP,因为 allBlackData 也是 Data 这种数据类型
val ip=message.ip
//
获取数据的 flowsScore
val flowsScore=message.flowsScore
//2.2
将两个数据返回
(ip,flowsScore)
}).reduceByKey((k,v)=>v) //2.3.
调用 reducebykey((k,v)=>v) 取出相同的数据中的最后一个或者最后一个(这里 k,v 是两个值,我们返回的是 k, 返回 v 也可以。)
blackDatas.foreachRDD(rdd=>rdd.foreach(println)) //
输出
关掉前面的输出之后,现在只有这一个是可以输出的。
先运行数据预处理,再运行爬虫,然后运行爬虫识别。
三.效果
先运行数据预处理,再运行爬虫,然后运行爬虫识别。
如图所示,虽然有两个爬虫数据,但是因为两个爬虫数据一样,进行了去重,所以只输出了一个 flowsScore 。