开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第五阶段:爬虫识别-小于自设值的次数-代码实现读取默认时间】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/673/detail/11712
爬虫识别-小于自设值的次数-代码实现读取默认时间
前面将指标思路讲解完成,本次主要学习代码实现。
/按 IP 地址聚合-
某个 iP,5分钟内小于最短访问间隔(自设)的关键页而查询次数
DeflessDefaultTimes
(processedData:DStream[ProcessedData],criticalPagesList:ArrayBuffer[string],flowList:ArrayBuffer[Flowcollocation]):Unit =
1. 获取企业系统内的自定义的最小时间间隔
图内:小于最短访问时间间隔1或2,将其中数据拿出
最短间隔在图中红色框即规则内。规则包含在蓝色框流程内部。存在多个流程,流程内部可配置多个流程。先遍历流程,其次获取规则,查找。
2.遍历:流程,获取流程内的规则
for(flow<-flowList){(遍历流程中的一个流程)
不是多个流程的原因:确实存在很多个流程,一个流程内有多个数据,但是当数据放入程序中只存在一个。多个流程是为了应对不同的节假日而设置的不同流程,存在专门针对各种节假日,正常情况下。只有一个在正常运行,其他并未运行。可以配置多个,但只有一个是运行状态。
在查询流程即读取流程数据时,存在状态说明,此时状态说明 status=0,读取流程状态是0的状态数据,
在流程表可看到状态 status=0,Process_info 右键设计表打开可观察到0表示正在运行,1表示暂停,所以 status=0(表示正在运行)。多个流程正常情况下只有一个流程是正在运行。
真正读取到的数据只有一条。
For(flow<-flowList){
}
真正只有一条数据,所以在此遍历处一条内容。
//遍历流程,获取流程内的规则
调用 flow.rules(rules 为数据库8个规则中的一个)此时得到规则。
找到规则中 ruleName 等于"criticalPagesLessThanDefault"的规则,先进行遍历,(存在8个规则,在八个规则内,只有小于最短访问间隔有两个参数。需要在八个规则中依次遍历,找到 rule name)
此时拿到某一个规则将其进行判断,如果
ruleName="criticalPagesLessThanDefault,表示有两个参数,第一个是默认的最小时间,第二个是阈值.
rule.value0表示第一个参数(最小时间间隔),Rulevalue1表示阈值
//获取出规则的第一个参数(最小时间间隔)
Var defaultTime=0(默认),利用 default 接收;Double=0(Double 类型)
如何知道名称为 criticalPagesLessThanDefault,在八个规则中,已知有一个规则存在两个属性:最小访问间隔和页面查询次数,可以在数据库中进行查询,含有两个规则的数据名称,如下图,寻找 arg 0arg1都存在数据的id,此时可以观察到 rulename=4,依次往下寻找还可以观察到同时存在 arg0,1的 rule name=4,此时进入表内寻找rule name=4的 rulename 名称,可发现名称为 criticalPagesLessThanDefault。
val ruleType=rs.getstring(columnLabel="rule_type")
val rulestatus =rs.getInt(columnLabel="status")
val rulecrawlerType =rs.getInt(columnLabel="crawler_type")
val rulevalue0=rs.getDouble(columnLabel="arg")
val rulevalue1=rs.getDouble(columnLabel="arg1")
val rulescore =rs.getInt(columnLabel ="score")
val rulecollocation new RuleCollocation(ruleId,flowId,rule_real_name,ruleType,rulestatus,rule
list += rulecollocation
数据关联,关联后读取完毕,使用两个表的 rule_name 进行关联,将读取出的第一个第二个数据封装进入下面代码内:
case class RuleCollocation(ruleId:String,//规则 id
flowId:string,//流程 id
ruleName:String,//规则名
ruleType:string,//规则类型
rulestatus:Int,//规则状态
ruleCrawlerType:Int,//规则爬虫类型
rulevalue0:Double,//参数
rulevalue1:Doub1e,//参数
ruleScore:Int/∥打分
){
}
此数据内的第三个数据是规则名 rule_name。也就是数据库内的 rule_name,数据库内配置的是4。但是在封装时传进去的不是 rule_name,而是 real_name 真正的名字而不是4。所以在读取时虽然是 rule_name 但实际是真正的名字。
此时第一个参数已读取完毕.
//实例最小时间间隔
var defaultTime:Double=0
//
获取企业系统内的自定义的最小时间间隔
for(flow<-flowlist){
//追历流程,获取流程内的规则
val rules=flow.rules
/找到规则 ruleName 等于"criticalPagesLessThanDefault“的规则(有两个参数,第一个是默以的最小时间,第二个是阈值)
for(rule<-rules){
if (rule.ruleName.equals("criticalPagesLessThanDefault")){
//获取出规则种的第一个参数
defaultTime=rule.rulevalue0}
}
}