开发者学堂课程【大数据实战项目 - 反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第六阶段:爬虫识别-总结及效果】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/674/detail/11724
爬虫识别-总结及效果
内容介绍:
一.前期准备
二.指标碰撞
三.最终打分
四.爬虫判断
五.测试
一.前期准备
之前已经将代码全部写完,但是最后做的是爬虫判断,并不是完整的过程。
爬虫识别需要进行三个部分:指标碰撞,最终打分,爬虫判断。
指标碰撞分为准备数据和最终碰撞。
指标碰撞之前拿到的是8个结果集(如图所示),即 IP 段访问量,某 IP 5分钟内访问总量,某 IP 5分钟内关键页访问总量,某 IP 5分钟内的 UA 种类数统计,5,6,7,8。
准备数据
1.提取一个 ip 在八个结果集内对应的数据。
关键代码:
Val ipBlockCounts=ipBlockCountsMap.getOrElse(ipBlock,0)
Val ipCounts=ipCountsMap.getOrElse(ip,0)
Val criticalPagesCounts=criticalPagesCountsMap.getOrElse(ip,0)
Val userAgentCounts=userAgentCountsMap.getOrElse(ip,0)
Val differentJourneysCounts=differentJourneysCountsMap.getOrElse(ip.0)
Val ipCookCount=ipCookCountMap.getOrElse(ip,0)
Val minTimeDiff=minTimeDiffMap.getOrElse(ip,0)
Val lessDefaultTimes=lessDefaultTimesMap.getOrElse(ip,0)
先在数据中找出 IP ,然后将 IP 和8个数据结果放在一个方法中,
在方法中用 IP 提取出8个结果对应的值。
2.将取出的数据封装为 Map ,将次 Map 与流程数据传入碰撞方法
关键代码:
Val dataParams=Map(
“ipBlock”->ipBlockCounts,
“ip”->ipCounts,
“criticalPages”->criticalPagesCounts,
“userAgent”->userAgentCounts,
“criticalCookies”->ipCookCounts,
“flightQuery”->differentJourneysCounts,
“criticalPagesAccTime”->minTimeDiff,
“criticalPagesLessThanDefault”->lessDefaultTimes
)
即拿到图中所示的,一条数据在8个结果集内对应的指标值和企业端配置的8个指标阈值。
注意:放在这里面以后, 需要知道 Map 的 K, 而 K 取决于后面如何进行计算,要将企业端配置的8个指标阈值和一条数据在8个结果内对应的指标值进行对比,而要对比就要有对等关系,要进行比较的两组数据必须是一一对等的关系,将数据库中每个规则的名字作为 K ,而和它进行对比的值则是通过 K 计算得到的值。依次类推,将数据一组一组的输入 Map 中,方便后续计算。准备数据就是准备出一个 Map,然后再进行后续的碰撞。
二.指标碰撞
1.根据算法需求实例两个 ArrayBuffer
(这两个碰撞的结果是为后续打分算法做准备的,指标数据就是为打分算法准备数据的。既然需要这两个数据:与选定与否无关得分结果集和选定的得分结果集,我们就去准备这两个数据。)
//一个选定与否无关的数据分数,若数据的值大于设置的阈值那么返回数据的分数,反之返回0
//结果集的大小一直是8
Val allRuleScoreList=new ArrayBuffer[Double]()
//一个必须是选定状态的并且数据的结果大于配置的阈值返回分数,反之不做返回
//结果集的大小不定
Val selectRuleScoreList=new ArrayBuffer[Double]()
2.遍历流程数据,获取流程内的规则
for(flow<-flowList){
//获取流程内的规则(8个)(拿到这8个规则后再遍历规则,遍历出每一个规则,找到每一个规则里面对应的数据里面配置好的阈值。)
Val rules=flow.rules
}
3.获取规则内的阈值
Val databaseValue=if(rule.ruleName.equals(
“criticalPagesLessThanDefault”))
rule.ruleValuel else rule.ruleValue0
其中 ruleName 十分特殊,它有两个参数,第一个是最小时间差,第二个才是阈值。所以,如果需要 ruleName ,就取第二个作为阈值,否则就取第一个,因为其它的7个就只有一个即 Value0。根据情况返回了阈值。数据库的阈值有了,然后再从 Map 中拿出数据计算出来的结果。
4.获取数据计算出的结果
Val dataValue= dataParams.getOrElse(ruleName,0)
5.数据对比
如果数据中的值大于系统里配备的值,那么就将相应的结果塞入Map 中。然后根据这两种情况://一个选定与否无关的数据分数,若数据的值大于设置的阈值那么返回数据的分数,反之返回0 //一个必须是选定状态的并且数据的结果大于配置的阈值返回分数,反之不做返回,进行塞数据。
//结果集的大小一直是8
数据计算的结果大于阈值,根据需求将分数写入对应的 ArrayBuffer 内
数据计算的结果小于阈值,根据需求填入ArrayBuffer (是否需要填写)
If(dataValue>databaseValue){
allRuleScoreList.append(rule.ruleScore)
//判断规则是否选中
If(rule.ruleStatus==0){
selectRuleScoreList.append(rule.ruleScore)
}
}else{//
反之 数据计算的结果小于阈值
allRuleScoreList.append(0)
}
至此,数据准备阶段完成,打分算法所需的数据已准备完毕。
三.最终打分
目标:根据已有数据计算最终分数,并返回分值
思路与关键代码:
1. 将两个结果集传入算法,算法自动返回一个分值
Val flowScore=computeScore(allRuleScoreList.toArray,selectRuleScoreList.toArray)
有了分数就可以去判断,是否是爬虫了。
四.爬虫判断
目标:得出是否是爬虫的结论。 “True” 或 “False”
在我们的流程当中,最后一步配置策略中有“黑名单阈值”,它表示的是:是否是爬虫,如果大于这个值就是爬虫,小于这个值就不是爬虫。获取出这个黑名单阈值后,将计算数据出的分数与黑名单阈值进行对比,大于它就返回 True, 小于就返回 False.
即如图所示的流程。
思路与关键代码:
1.将获取流程中最终的阈值(爬虫与非爬虫的分界点)
val flowLimitScore=flow.flowLimitScore
2.用数据得分与最终阈值对比
若数据得分大于最终阈值,那么次数据是爬虫,返回 True
若数据得分小于最终阈值,那么次数据不是爬虫,返回False
Val isUpLimited=if(flowScore>flowLimitScore)true else false
在流程的最后一步中,如果大于黑名单阈值,则是爬虫;如果不大于黑名单阈值,则不是爬虫。
五.测试
// 最终的打分
Val flowScore= computeScore(allRuleScoreList.toArray)
If (flowScore>0){
Println(
“>>>>>----->
数据得分:”+flowScore) //做判断,看一下分数,分数要大于0才能输出。
//3.2用数据得分与最终阈值对比
//若数据得分大于最终阈值,那么次数据是爬虫,返回 True
//若数据得分小于最终阈值,那么次数据不是爬虫,返回 False
Val isUpLimited=if(flowScore>flowLimitScore)true else false
If(isUpLimited){
println(
“>>>>>=====> True”)
//做判断
这里面,它有可能是爬虫也有可能不是爬虫,在这里做一个判断。如果是,就输出 True。
执行时应先执行数据预处理,再执行爬虫。
执行后,如图所示即可看到最终得分
将黑名单阈值改为20后再次运行,由于22.5>20,所以运行结果为 “True” 是爬虫,至此,爬虫识别完成。