开发者学堂课程【大数据实战项目 - 反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第六阶段:爬虫识别-指标碰撞-准备数据代码实现】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/674/detail/11718
爬虫识别-指标碰撞-准备数据代码实现
内容介绍:
一、提取一个 ip 在八个结果集内对应的数据
二、将取出的数据封装为 Map,将 Map 与流程数据传入碰撞方法
指标碰撞分为两部分,准备数据和指标碰撞。准备数据将数据抽出封装为 Map。为以下过程
一、提取一个 ip 在八个结果集内对应的数据
//1指标碰撞(准备数据)
//1.1提取一个 ip 在八个结果集内对应的数据,
有 message、ip、ipBlockCountsMap、ipCountsMap、criticalPagesCo
untsMap
、userAgentCountsMap、differentJourneysCountsMap、ipCookCountMap、minTimeDiffMap、lessDefaultTimesMap
ipBlockCountsMap
的key 是 ip 段,不是完整的 ip。后面是完整 ip,针对 ip 段单独处理,截取 ip 段,192.168.56.151 ip 段是192.168。获取第一个点的位置=ip.indexOf. 第二个点位置在 ip 找第二个点的位置,第一个点位置+1是第二个点位置
//192.168.56.151 -
》192.168
val one=ip.indexof(".")
val two=ip.indexof(str=".",one+1)
//截取 ip 段
val ipBlock=ip.
字符号截取 substring,从0开始截取到two
val ipBlock=ip.substring(0,two)
//1.1提取一个 ip 在八个结果集内对应的数据,
抽取 ip 段,获取第一个8个结果数据,ipBlock
val ipBlockCounts=ipBlockCountsMap.getOrElse key
是
ipBlock,没有返回0
第二个 ip 的访问总量=ipCountsMap.getOrElse(ip,0)ip
作为 key 取出,有给值,没有给0
第三个关键页面访问次数
=criticalPagesCountsMap.getOrElse(ip,0)
第四个
userAgentCounts=userAgentCountsMap.getOrElse(ip,0)
第五个不同行程访问次数
=differentJourneysCountsMap.getOrElse(i
p,0)
第六个ipCookCount=ipCookCountMap.getOrElse(ip,0
)
第七个最小时间间隔=minTimeDiffMap.getOrElse(ip,0)
第八个小于最小访问间隔=lessDefaultTimesMap.getOrElse(ip,0)
取出 ip 在8个结果集的值
val ipBlockCounts=ipBlockCountsMap.getOrElse(ipBlock,0)
val ipCounts=ipCountsMap.getOrElse(ip,0)
val criticalPagesCounts=criticalagesCountsMap.getOrElse(ip,0)
val userAgentCounts=userAgentCountsMap.getOrElse(ip,0)
val differentJourneysCounts=differentJourneysCountsMap.getOrEls
e(ip,0)
val ipCookCount=ipCookCountMap.getOrElse(ip,0)
val minTimeDiff=minTimeDiffMap.getorElse(ip,0)
val lessDefaultTimes=lessDefaultTimesMap.getorElse(ip,0)
二、将取出的数据封装为 Map,将 Map 与流程数据传入碰撞方法
//1.2将取出的数据封装为 Map,将 Map 与流程数据传入碰撞方法
取出的值封装为 Map,实例 Map,val dataParams=Map,值为8个结果,Map 有 key 和 value,value 是值。指标碰撞要将企业配置的值与算出的8个值对比,对比不能乱顺序,不能将 UA 的数量与不同行程对比,关键页面最小访问间隔次数与 ip 段数据对比。ip 访问量与 ip 访问量阈值对比,UA出现总量阈值与 UA 计算出的数据对比,一一对应不能乱序。
key 设置成与企业配置好的内容有关的,找到关系作为 key,数据直接放。
流程数据
是否选中不能区别,量不能区别,阈值不能区别,规则名字可以区别。名字是唯一的,ip 对应 ip 访问总量,UA 对应 UA 的数量,每个规则对应的名字是唯一的,以名字作为 key,key 对应的值放到后面,碰撞时,Map 拿到后数据计算的值 key 就是数据库中系统配置的八个指标如下
八个指标的名字传入,数据用 key 获取阈值,Map 计算出的结果由 key 获取,关系对应起来。
第一个 ipBlock 作为 key,value 获取ipBlockCounts
第二个 ip 指 ip 的访问总量 ipCounts
第三个关键页面作为 key 获取关键页面的 Counts
第四个 userAgent 作为 key 获取 userAgentCounts
第五个 criticalCookies 作为 key 获取 ipCookCount
第六个不同行程的次数作为 key 获取 differentJourneysCounts
第七个关键页面最小访问时间间隔作为 key 获取 minTimeDiff
第八个criticalPagesLessThanDefault 作为 key 获取 lessDefaultT
Imes
将抽出的8个结果封装为 Map
val dataParams=Map(
"ipBlock"->ipBlockcounts,
"ip"->ipCounts,
"criticalPages"->criticalPagesCounts,
"userAgent"->userAgentCounts,
"criticalcookies"->ipCookcount,
"flightQuery"->differentJourneyscounts,
"criticalPagesAccTime"->minTimeDiff,
"criticalPagesLessThanDefault"->lessDefaultTimes
将 Map 与流程数据传入碰撞方法,用 calculateFlowsScore 碰撞方法,计算规则得分。
粘贴calculateFlowsScore
,获取 Map dataParams,流程数据 flow List。dataParams 是数据计算出的8个结果,flowList 8个结果对应的阈值。
calculateFlowsScore
(dataParams,flowList)
calculateFlowsScore
方法创建,calculateFlowsScore 报红。
AntiCalculateResult
是反爬虫项目最终实现的目标,所有数据都封装到 AntiCalculateResult,有了 ip、processedData、八个结果对应的数值,flowsScore 暂时不知道。复制粘贴修改,processedData 改为 message,ipAccessCounts 改为 ipCounts,criticalPageAccessC
ount 改为criticalPageCounts,criticalCookies
改为 ipCookCount,
differentTripQuerysCounts
改为
differentJourneysCounts,critivalPa
geMinInterval
改为
minTimeDiff,accessPageIntervalLessThanDef
ault
改为 lessDefaultTimes
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:Array 类型FlowScoreResult,FlowSc
oreResult 是封装流程的结果,应用到流程 ip、得分、阈值
最终返回结果缺少 flowsScore 参数
创建方法,放到最后,方法补全。
def calculateFlowsScore(dataParams:Map[string
,Int],flowList:Arr
ayBuffer[Flowcollocation]):Unit ={
flowsScore
报红,缺少 flowsScore 数据。calculateFlowsScore 方法的返回值为 flowsScore,类型为 Array[FlowScoreResult]
val flowsScore:Array[FlowScoreResult]=calculateFlowsScore
(data
Params
,flowList)
所有数据都返回,问题变为在calculateFlowsScore 碰撞,碰撞后返回flowsScore:Array[FlowScoreResult]
类型的数据。
AntiCalculateResult 是最终想要返回的结果,所有数据的封装,数据准备阶段的处理方法写完。