开发者学堂课程【大数据实战项目 - 反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第六阶段:爬虫识别-过滤非爬虫数据】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/674/detail/11725
爬虫识别-过滤非爬虫数据
内容介绍:
一.踢除非黑名单数据
二.数据入库代码
三.效果演示
一.踢除非黑名单数据
如图所示,爬虫识别完成后,下一步为数据入库。数据入库分为非爬虫过滤,爬虫去重以及写入 Redis 这3步。经过这三步我们才能将数据入库。
1.目标:
经过计算后的数据含有非黑名单数据,需要将其踢除掉
2.需求
之前,我们已经计算出了整个流程的打分,也已经进行了是否为黑名单数据的标记(是否是爬虫),现在,我们需要踢除黑名单数据,只保留黑名单数据,将黑名单数据进行 Redis 推送。
3.非黑名单数据的产生
//爬虫识别
//1 指标碰撞
//2 最终的打分
//3 爬虫判断(结论:是/不是)
Val antiCalculateResults=processedData.map(message=>{
在遍历数据时,使用的是 processedData ,在进行1-8个数据的计算的时候,使用的是同一批封装成 processedDate 的数据,返回的也是这一批针对每一行数据的结果。比如,一批数据共有50条数据,30条是爬虫数据,20条不是爬虫数据即正常的用户数据,需要拿50次数据,再进行50次判断,得到50批最终结果,返回也是50条数据,其中,30条爬虫数据有结果,这30条爬虫当中 flowScore 里面的 isUpLimited 决定是否为爬虫,30个是爬虫,20个不是爬虫,这20个是需要过滤掉的,也就是说只用在意爬虫数据即可,非爬虫的需要踢除掉。
case class FlowScoreResult( flowId: string,
flowScore: Double,
flowLimitedScore: Double,
isUpLimited: Boolean,
flowStrategyCode: String,
hitRules: List[String],
hitRules: List[String],
hitTime: String)
已经算出流程 ID ,最终得分,流程阈值,是否是爬虫( True/False),以及后面这几个参数。得到 FlowScoreResult 后,最终的全部结果就得到了,然后就返回到 antiCalculateResult 中。
4.设计
(1)获取计算结果 antiCalculateResults 进行 filter
(2)添加表示数据是否是爬虫的标记
(3)使用 flowScore 的 isUpLimited 属性进行判断
a) isUpLimited 为 true, 标记为 true
b) isUpLimited 为 false, 标记为 false
是爬虫标记就是 true,不是爬虫标记就是 false。
5.思路与关键代码:
(1)打分后的数据的 rdd 调用 filter 对数据进行过滤
(2)添加此数据是否是爬虫的标记
(3)遍历经过打分后的数据(已经得出结论:这个数据是爬虫/不是爬虫)(它很可能是多个值,因为 flowsScore 是 Array 类型的)
(4)遍历每一个经过计算的数据,获取出每个数据的 flowsScore,遍历 flowsScore 内的isUpLimited(true/flase)
(5)若数据内的 isUpLimited 是 true ,那么表述这个数据是爬虫
将标记改为 true
(6)若数据内的 isUpLimited 是 false ,那么表述这个数据不是爬虫
标记不做任何改动(默认标记就是 false)
二.数据入库代码
//
数据入库
//1
过滤非爬虫数据(只保留爬虫数据)
//1.1.
打分后的数据的 rdd 调用 filter 对数据进行过滤(返回的都是爬虫数据)
Val allBlackDatas= antiCalculateResults.filter(message=>{
(filter 需要返回一个 true/false)(这里返回的所有都是爬虫数据)
//1.2.
添加此数据是否是爬虫的标记
Var isspider=false
(var 代表可变的,默认是 false)
//1.3.
遍历经过打分后的数据(已经得出结论:这个数据是爬虫/不是爬虫)
//1.4.
遍历每一个经过计算的数据,获取出每个数据的 flowsScore,遍历 flowsScore 内的 isUpLimited(true/flase)
Val flowsScores= message.flowsScore
For(flowsScore<-flowsScores){
(因为它是 Array 所以在这里需要遍历一下)
//1.5.
若数据内的 isUpLimited 是 true ,那么表述这个数据是爬虫,将标记改为 true (isUpLimited 本身是布尔类型)
If (flowsScore.isUpLimited){
Isspider=true
}
//1.6.
若数据内的 isUpLimited 是 false ,那么表述这个数据不是爬虫,标记不做任何改动(默认标记就是 false)
}
Isspider
})
allBlackDatas.foreachRDD(rdd=>rdd.foreach(println)) //
输出
如果有爬虫,则有爬虫数组的返回和输出;如果没有爬虫,则没有返回和输出。前面的爬虫识别也有一个输出,关闭后,爬虫识别代码里面只有这一个输出,即纯爬虫数据作为输出。至此,所有的数据都已处理完毕。
三.效果演示
如图所示,执行后,当第一组数据17.5<20(阈值)时,不是爬虫,没有输出。虽然这组数据没有输出,但是它也完整地运行了一遍程序。
当第二组数据22.5>20,是爬虫时,就有数据,就能够将数据输出。