开发者学堂课程【大数据实战项目 - 反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第六阶段:爬虫识别-指标碰撞-代码实现】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/674/detail/11720
爬虫识别-指标碰撞-代码实现
内容介绍:
一、根据算法需求实例两个 ArrayBuffer
二、遍历流程数据,获取流程内的规则
三、获取规则内的阈值
四、获取数据计算出的结果
五、数据对比
一、根据算法需求实例两个 ArrayBuffer
def calculateFlowsScore(dataParams:Map[string
,Int],flowList:Arr
ayBuffer[Flowcollocation]):ArrayBuffer[FlowScoreResult]={
val flowsScore=new ArrayBuffer[FlowscoreResult]()
//1根据算法需求实例两个 ArrayBuffer
//一个选定与否无关的数据分数,若数据的值大于设置的阈值返回数据的分数,反之返回0
//结果集的大小一直是8
规则可取消或选中,要求与选中与否无关的数据分数,分数是图片中后面的值,每一个指标有一个阈值,一个分数。如果数据中的值超过设置的值拿分数,没超过返回0。每个数据判断时都有值返回,如果数据大于值返回后面的分数,小于值返回0,八个指标经过八次判断,不管选中与否都判断。
结果集的大小一直是8,定义变量,所有数据 all,规则 Rule,分数Score List=new ArrayBuffer
数据类型定义为 Double
最终算法复制粘贴
/**
*
通过算法计算打分
*
系数2权重:60%,数据区间:10-60
*
系数3权重:40,数据区间:0-40
*
系数2+系数3区间为:10-100
*
系数1为:平均分/10
*
所以,factor1*(factor2+factor3)区间为:平均分--10 倍平均分
*@return
*/
defcomputeScore(scores:Array[Double],xa:Array[Double]):Double={
//
打分列表
//
总打分
valsum=scores.sum
//
打分列表长度
val dim = scores.length
//
系数 1:平均分/10
val factor1=sum/ (10 * dim)
//
命中数据库开放规则的 score
//
命中规则中,规则分数最高的
val maxlnXa=if (xa.isEmpty) {
0.0
}else{
xa.max
}
//
系数2:系数2的权重是 60,指的是最高 score 以6为分界,最高score 大于 6,就给
满权重60,不足6,就给对应的 maxlnXa*10
val factor2=if(1<(1.0/6.0)* maxlnXa){
60
}else{
(1.0/6.0) * maxlnXa * 60
//
系数 3:打开的规则总分占总规则总分的百分比,系数3的权重是 40
val factor3=40*(xa.sum/sum)
/**
*
系数2权重:60%,数据区间:10-60
*
系数3权重:40,数据区间:0-40
*
系数 2+系数3区间为:10-100
*
系数1为:平均分/10
*
所以,factor1*(factor2+factor3)区间为:平均分--10 倍平均分
*/
factor1: (factor2+factor3)
}
打分算法给两个结果给分,要求传入 Double 类型,定义为 Double 类型
val allRuleScoreList=new ArrayBuffer[Double]()
//一个必须是选定状态的并且数据的结果大于配置的阈值返回分数,反之不做返回
//结果大小不定
必须是选中的,选定的数据值必须大于配置的值,大于要后面的分数,小于什么都不写。
定义必须是选择的 RuleScoreList
val selectRuleScoreList=new ArrayBuffer[Double]()
二、遍历流程数据,获取流程内的规则
//2遍历流程数据,获取流程内的规则
流程 flowList,遍历 for 循环拿到 flow 来源于flowList,正常情况下只有一个 flowList,流程正常只有一个运行,其它是停止状态。
for(flow<-flowList){
//获取流程内的规则(8个)
流程数据结构图如下
横看,5分钟内 ip 访问量阈值为5分数是1此为一个流程。
flow.rules,rules 是流程里8个规则,做接收。
val rules=flow.rules
rules 是多个规则获得规则内的阈值需要做遍历
//遍历规则
for(rule<-rules){
三、获取规则内的阈值
//3获取规则内的阈值
数据库如下为存储的结果,正常情况下数据只有一个值,arg1大部分没有值,arg0大部分有值。
除了5分钟内小于最短访问间隔的关键页面查询次数都是一个值
真正存储数据在 arg0,只有 5分钟内小于最短访问间隔的关键页面查询次数是两个值。只有 rule_name=4有两个值,1-3、5-8 arg0没有数据。
每个流程通过rule.ruleValue0
,大部分数据在ruleValue0,rule_nam
e=4
、rule_real_name=criticalPagesLessThanDefault
第一个参数是时间间隔,第二个是阈值。普通的阈值拿 arg0,rule_name=4、rule_re
al_name=criticalPagesLessThanDefault
拿 arg1。数据中普通的拿arg0,rule_name=4
拿 arg0。
加判断只有rule_real_name=criticalPa
gesLessThanDefault
时拿第二个值,其它拿第一个。
if(rule.ruleName),
传过来是ruleName
,将rule_real_name
查出放入 ruleName,调用.equals=criticalPagesLessThanDefault
时表示有两个参数的数据。两个数据时返回.ruleValue1是数据库中1,此情况下返回1否则返回ruleValue0
。
如果名字=criticalPagesLessThanDefault
返回.ruleValue1否则返回 ruleValue0。定义变量 databasevalue 获取数据库里配置的阈值
//3
获取规则内的阈值(企业内配置的规则的阈值)
val databaseValue=if(rule.ruleName.equals("criticalPagesLessTha
nDefault") rule.ruleValue1 else rule.ruleValue0
四、获取数据计算出的结果
//4获取数据计算出的结果
数据中的结果是dataParams
,当流程遍历到此规则时拿规则在 dat
aParams 对应的值。通过.get 获取 key,key 恰好是8个规则的名字。
8个规则的名字作为 key 将关系对应,获取 ruleName 数据库中配置的阈值,将ruleName
数据库中计算的值取出做对比可做参考。定义变量 val dataValue。通过ruleName
拿,拿不到给0
val dataValue=dataParams.getOrElse(rule.ruleName)
五、数据对比
//5数据对比
//数据计算的结果大于阈值,根据需求将分数写入相应的 ArrayBuffer 内
//数据计算的结果小于阈值,根据需求填入 ArrayBuffer (是否需要填写)
综合判断,如果数据结果 dataValue 大于数据库中的值 databaseV
alue ,不管选中与否如果数据中的值大于设置的阈值返回分数,反之返回0,AllRuleScoreList 结果肯定有值,数据值大于阈值满足此要求返回分数,添加一个值.append,分数在规则里。每一条规则都有数值,获取分数.releScore。反之添加0
if(dataValue>databaseValue){
allRuleScoreList.append(rule.ruleScore)
}else{//
反之数据计算的结果小于阈值
allRuleScoreList.append(0)
满足选定的数据值必须大于配置的值,但没有做是否选定的判定。
//判断规则是否选中
如果选中将获取分数添加到选中的 List 里。如果规则状态.ruleStatu
s,ruleStatus
的选中状态在 itcast_rule 设计表状态,0代表启用,1代表不启用,选中是启用,不选中是不启用。
ruleStatus=0是选中状态,数据分数大于数据库分数是 selectRuleSc
oreList,添加数据结果.append 分数
if(rule.rulestatus==0){
selectRuleScoreList.append(ruleruleScore
)
}
添加了allRuleScoreList、selectRuleScoreList
数据,
allRuleScoreList 不管选中与否大于值放入,小于给0。allRuleScoreList指标加0,selectRuleScoreList
指标没规定。
流程中与选定与否无关得分结果集、选定的得分结果集算完。