开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第三阶段):数据预处理-数据清洗-效果与总结】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/671/detail/11646
数据预处理-数据清洗-效果与总结
内容介绍:
一、数据过滤的过滤方法-filterURL
二、关键代码补充
一、数据过滤的过滤方法-filterURL
实际的效果:
先把过滤规则,如果最关键的代码匹配上了,就把它改成 false,就过滤掉了,先把这个代码给注释掉,也也就是说如果匹配上了也没有任何操作,这个 save 永远都是 true,那就是所有的数据都会被打出来,没有做过滤,现在把它注释掉,看到的效果应该是没有过滤,什么数据都能打出来。然后打开做一个过滤的操作,右键执行数据的数据预处理,这里面会走到脱敏的过程来。
程序跑起来了,也没有报错,接下来把爬虫跑起来,右键执行爬虫。
好多数据都刷过来了,然后把爬虫停掉,这个是现在还没过滤的效果。数据是传过来了,由于把关键的 save 改成false 操作把它注释掉了,所以它就没过滤,所有的都是 true,就没有做任何过滤,而现在把它打开,只要匹配上了,就把它转改成 false,false 返回就要用 filter,调用 filter 直接就把它过滤掉了。
就是说把它打开以后,html,js,css,png, jpg,这些都会被过滤掉,也就这里面肯定没有 ao,规则当中是没有ao,没有 ao 就应该能把其保留下来。保存一下,然后来重新执行一下程序,没有报错再把爬虫跑起来。
看一下数据,只有 query.ao 有两条数据,因为爬虫当中,规则是爬虫周期是一秒钟跑一次,而迭代的周期是两秒钟,两秒钟迭代一次,而后面的爬虫是一秒钟一个数据,每个批次就两条数据。也能够看到数据的过滤已经生效了。
这个就是数据清洗的过程,没有用的数据就把它过滤掉了。
在数据过滤的时候加了一个标记,最初里面是 true,而第一次读取过来的时候是 true,更新完了以后,把它改成false,现在它应该是变成 false 了,因为跑过两遍了。
刷新一下这个数据 Reload Value。刚刚是 true,然后现在变成了 false,规则更新也生效了。这个就是反发生项目的数据清洗的实现的详细过程。
二、关键代码补充
1、读取 kafka 中的数据到预处理程序中。
2、读取 mysql 数据库当中的规则
var filterRuleList: ArrayBuffer [str
ing]=AnalyzeRu1eDB . queryFilterRule()
读取数据库规则的代码:
3、加载到广播变量
读取数据:
Gvolatile var broadcastFilterRuleList=sc.broadcast
(filterRuleList)
4、在 redis 里面添加规则
判断是否需要更新数据过滤规则:
val NeedUpDateFilterRule=redis . get
("NeedUpDateFilterRule")
5.1、若不需要更新,那么直接过滤数据
5.2、若需要更新,重新读取数据库规则:
filterRuleList=AnalyzeRuleDB. queryFilterRule()
5.2.1、将广播变量清空:
broadcastFilterRuleList.unpersist()
5.2.2将新规则加载到广播变量:
broadcastFilterRuleList= sc .broadcast (filterRuleList)
5.2.3、将 reais 数据改为 false:
redis. set ("NeedUpDateFilterRule", "false")
6、进行数据过滤
6.1、定义方法,参数为一条数据和广播变量
URLFilter. filterURL ()
6.2、截取出 URL
6.3、遍历数据过滤规则,与 url 进行匹配
val request= if(message. sp1it("#CS#"). length>1)
message.split("ICS#")(1) else ""
6.4、若匹配成功,需要删除,返回 false
6.5、若匹配不成功,不需要删除,返回 true
var save=true
for (rule<-FilterRuleList){
//若匹配成功表示,需要删除,返回false
if (request .matches(ru1e)){
//将标记改为false
Save=false
}
}
6.6、调用rdd的filter进行数据过滤
val
filteredData=rdd. filter (message=>URLFilter.filterURL
(message , broadcastFilterRulelist.value))
这个就是反爬虫项目的一个具体的实现的思路,目标、实现的思路以及关键代码,关键代码如上。反爬虫的数据的清洗工作就做完了。