开发者学堂课程【大数据实战项目 - 反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第六阶段:爬虫识别-打分】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/674/detail/11722
爬虫识别-打分
内容介绍:
一.最终打分
二.打分算法代码
一.最终打分
1.目标:根据已有数据计算最终分数,并返回分值
通过遍历规则我们拿到了两个结果,接下来就要进行打分,我们需要打分算法。
2.打分算法:
computeScore(allRuleScoreList.,selectRuleScoreList.)
需要指标碰撞中算好的两个参数即,与选定于无关的结果和必须选定的结果。
会发现报错,需要 ArrayDouble,这里是 ArrayBuffere[Double]
改成:
computeScore(allRuleScoreList.toArray,selectRuleScoreList.toArray)
只需将两个结果集传入算法,算法会自动返回一个分值。
定义一个变量来接受此结果(需要用流程得分flowScore 来声明):
//2
最终的打分
Val flowScore=computeScore(allRuleScoreList.toArray,selectRuleScoreList.toArray)
Case class AntiCalculateResult(processedData:ProcessedData,
Ip:String,
ipBlockCounts: Int,
ipAccessCounts: Int,
criticalPageAccessCounts: Int,
userAgentCounts: Int,
critivalPageMinInterval: Int,
accessPageIntervalLessThanDefault: Int,
differentTripQuerysCounts: Int,
criticalCookies: Int,
flowsScore:Array[FlowScoreResult])
AntiCalculateResult
为最终要返回的结果,而这些数据当中, flowsScore 前面的数据已经得到,只缺少 flowsScore
flowsScore.append()FlowScoreResult(flow.flowId,
flowScore
(最终的分数),
flowLimitedScore,
isUpLimited,
flow.strategycode,
hitRules.toList,
New Date().toString
计算得出的结果即流程得分。
二.打分算法代码:
通过算法计算打分,此算法是从企业得来的,没有做任何的修改,直接使用即可。我们需要用到3个系数。
系数2权重:60%,数据区间:10-60
系数3权重:40,数据区间:0-40
系数2+系数3区间为:10-100
系数1为:平均分/10
所以,factor1*(factor2+factor3)
区间为:平均分--10倍平均分
Def computeScore(scores:Array[Double],xa:Array[Double]): Double={
//打分列表(传入的第一个结果就是与选定于无关的,即8个值,0或其它结果。 xa 是规定的,直接使用即可。 均为 Double 类型)
val sum=scores.sum
//总打分(无论是否选中,计算后,如果结果超过了某一个值就输出分数;如果没有超过,则返回0。也就是说,如果8个值中有3个结果超过了值,那么就取这3个的分数,然后对它们求总和。如果3个都超过了,就取3个值的总和,另外5个均为0;如果8个值都超过了,就计算8个值的总和。sum 即代表分数)
val dim=scores.length
//打分列表长度(总的分数得到后,又要求分数的长度,也就是8。 dim 代表超过了值的结果数量,也就是8)
val factor1=sum/(10*dim)
//系数1:平均分/10 (平均数的十分之一,此为第一个系数)
val maxInXa - if(xa.isEmpty){
0.0
} else {
xa.max
}
//命中数据库开放规则的 score
//命中规则中,规则分数最高的( xa 为第二个值,即必须是选中状态同时超过阈值的,如果是空,假设选中的这些都没有超过,则为空那么返回0:如果不是空,那么取出其中的最大值。比如,我们选中了实时规则中的后4个,假如它们都超过了阈值,那么就取出里面的最大值)
val factor2=if(1<1.0/6.0)*maxInXa)
{ (判断:最大值的六分之一是否大于1对应着不同的路线。比如10、9、8、7的六分之一都大于1,权重就给足60;6的六分之一不大于1,(1.0/6.0)*1*60=60; 5的六分之一也不大于1,(1.0/6.0)*5*60=50。权重最高为60,不能超过60,当数据小于6的时候,计算出的权重就是最高分数)
60
} else {
(1.0/6.0)*maxInXa*60
}
//系数2:系数2的权重是60,指的是最高 score 以6为分界,最高score 大于6,就给满权重60,不足6,就给对应的 maxInXa*10
val factor3 = 40*(xa.sum/sum)
//系数3:打开的规则总分占总规则总分的百分比,并且系数3的权重是40(选定的结果求和后,除以之前得到的与选定与否无关的和。选中的规则的总分数占总权重百分比。)
factor1*(factor2+factor3)
(系数2加上系数3再乘以系数1.)
(系数2权重:60%,数据区间:10-60
系数3权重:40,数据区间:0-40
系数2+系数3区间为:10-100
系数1为:平均分/10)
}
得到最终分数后返回,即我们最终接受到的分数。
其中,数据60,数据40,最终打分的核心算法 factor1*(factor2+factor3) 与业务的关联性十分强,也是为了防止爬虫刻意避开规则,不需要明白原理,能够理解代码即可。
拿到算法后,只需要上传 scores 和 xa 这两个参数,就能够得到分数computeScore
拿到分数后,可以根据分数判断是否是爬虫。