开发者学堂课程【大数据实战项目 - 反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第六阶段:爬虫识别-爬虫判断及封装 FlowScoreResult】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/674/detail/11723
爬虫识别-爬虫判断及封装 FlowScoreResult
内容介绍
一.爬虫判断(结论:是/不是)
二.封装流程计算结果(如何写爬虫识别的关键代码)
三.爬虫识别
一.爬虫判断(结论:是/不是)
接下来要进行第3步-爬虫判断。
如图所示,将得分与企业的阈值进行对比,如果得分大于企业阈值则返回 True ; 如果得分小于企业阈值,则返回 False 。这是爬虫判断的流程。
目标:得出是否是爬虫的结论。 “True” 或 “False”
思路与关键代码:
1.将获取流程中最终的阈值(爬虫与非爬虫的分界点)
2.用数据得分与最终阈值对比
若数据得分大于最终阈值,那么次数据是爬虫,返回 True
若数据得分小于最终阈值,那么次数据不是爬虫,返回False
如图所示,这里的阈值就类似于配置策略中的100。
上面是规则,上传数据大于或小于这个值的关系。
// 爬虫判断
//1 将获取流程中最终的阈值(爬虫与非爬虫的分界点)
val flowLimitScore=flow.flowLimitScore
(flowLimitScor
e 即为最终的阈值,这个阈值就是配置策略中的100,或者流程1中的20,接下来进行判断)
//2 用数据得分与最终阈值对比
//若数据得分大于最终阈值,那么次数据是爬虫,返回 True
//若数据得分小于最终阈值,那么次数据不是爬虫,返回 False
val isUpLimited=if(flowScore>flowLimitScore)true else false (如果数据得分大于最终阈值,则返回 True ;否则,返回False 。得到结论后,需要一个变量来接收这个结论,即是否是爬虫。
isUpLimited 就是是否大于阈值,即接收结论的变量。但是需要返回的是 flowsScore ,而不是判断的结论。)
如图所示,阈值在流程中,因此,我们要在流程中得到阈值
我们需要返回的是下方的数据,而这些数据中只缺 flowsScore。
AntiCalculateResult(
Message: ProcessedData,
ip:String,
ipBlockCounts: Int,
ipCounts: Int,
criticalPagesCounts: Int,
userAgentCounts: Int,
minTimeDiff: Int
lessDefaultTimes: Int,
differentJourneysCounts: Int,
ipCookCount: Int,
flowsScore: Array[FlowScoreResult]
)
指针碰撞的结果我们传给了 flowsScore ,类型也相同。现在如果我
们要返回,则必须要封装满整。将命中的规则和命中的时间得到后就
可以封装了。
flowsScore.append()FlowScoreResult(flow.flowId,
(有流程
就可以获取 ID)
flowScore
(最终的分数),
flowLimitedScore,
(流程的阈值)
isUpLimited,
(返回是布尔类型的)
flow.strategycode,
(流程策略代码)
hitRules.toList,
(将 Buffer 转化为List)
New Date().toString
(命中时间 而且是字符串格式)
}
flowsScore.toArray
//命中的规则(我们的最终分数有了,也得到了是否是爬虫,最终结果中只缺 flowsScore 类型为 FlowScoreResult, 这种类型里面,恰好计算出来的分数以及是否是爬虫都是所需要的,用上了它们之后,这个 FlowScoreResult 就有了。但是还差一步,虽然有了一个,但是这里所需要的是Array 类型的。直接来定义 flowsScore ,调用 ArrayBuffer 进行补全,补全以后,目标: Array 类型的 FlowScoreResult 就已经有了。至此所需要的 AntiCalculateResult 封装已经全部完成,所有的数据都有了。爬虫识别的关键代码就写完了。)
val hitRules=new ArrayBuffer[String]()
(算法中需要的是 Double 需要的是 String, 而且还是 List ,需要将其转化)
//数据对比
//数据计算的结果大于阈值,根据需求将分数写入相应的 ArrayBuffer 内
//数据计算的结果小于阈值,根据需求填入 ArrayBuffer (是否需要填写)
If (dataValue>databaseValue){
allRuleScoreList.append(rule.ruleScore)
hitRules.append(rule.ruleName)
(无论是否选中,只要命中了就可以。在这里选择命中的规则名称进行返回)
二.封装流程计算结果(如何写爬虫识别的关键代码)
@param flowId
流程 Id (有流程即可)
@param flowScore
流程得分
@param flowLimitedScore
流程阈值
@param isUpLimited
流程得分是否大于阈值
@param flowStrategyCode
流程策略代码
@param hitRules
命中的规则(8个数值中有多少超过了阈值)
@param hitTime
命中的时间
/
case class FlowScoreResult( flowId: string,
flowScore: Double,
flowLimitedScore: Double,
isUpLimited: Boolean,
flowStrategyCode: String,
hitRules: List[String],
hitRules: List[String],
hitTime: String)
三.爬虫识别
//1 指标碰撞
//2 最终的打分
//3 爬虫判断(结论:是/不是)
processedData.map(message=>{
(添加 “val
anticalculateResults=
”
即可接收回来,其中的
anticalculateResults
代表可能有多个值)
//获取数据中 ip
Val ip =message.remoteAddr
//返回结果是最终的返回结果 AnticalculateResult
RuleUtil.calculateAntiResult
(调用数据)
(message,ip,ipBlockCountsMap,ipCountsMap,criticalPagesCountsMap,userAgentCountsMap,
differentJourneysCountsmap,ipcookcountMap,minTimeDiffMap,lessDefaultTimesMap,broadcastFlowList.value)/
/执行(在调用前面添加 “val anticalculateResult=”
即可接收)
anticalculateResult //
返回 Map 中
}
)
anticalculateResults.foreachRDD(rdd=>rdd.foreach(println))
//
输出
至此代码全部完成。