开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第五阶段:爬虫识别-关键页面的 cook 统计-代码实现及效果】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/673/detail/11706
爬虫识别-关键页面的 cook 统计-代码实现及效果
目录:
一、代码实现
二、回顾
三、执行效果
四、总结
一、代码实现
写代码,前面写过的代码几乎覆盖,直接粘贴写过的代码。
//1抽取出数据中的 IP,数据中的 url 和数据中的 Cookie
拿到 ip 和 cookie 后做关键页面,找关键页面判断,复制粘贴
添加
数据中的 cook,获取 cook,val cook=message.cookie 里的 JSE
SSIONID
processedData.map(message=>{
//1抽取出数据中的 IP 和数据中的 url 和数据中的 Cookie
//获取 ip
val ip =message.remoteAddr
//获取 url
val url=message.request
//获取 cook
val cook=message.cookie_JSESSIONID
//实例一个是否是关键页面的 flag
var flag=false
//2 遍历数据库中的关键页面的规则。
criticalPagesList 报错,value 改为 criticalPagesList
def criticalPagesCounts(processedData:DStream[ProcessedData],
criticalPagesList:ArrarBuffer[String]:DStream[Unit]={
拿到某个关键页面 url 匹配,flag 表示是否是关键页面,匹配上是 true,匹配不成默认是 false
for(criticalPages<-criticalPagesList){
//3 使用 url 与规则进行匹配,
匹配成功返回(ip,cook),匹配不成功返回(“”,””)
if(url.matches(criticalPages)){//匹配成功 表示数据是关键页面
flag=true
}else{//匹配不成功 表示数据不是关键页面
}
}
if(flag){ //若数据的 url 能够与规则的任意一个匹配成功,表示此 url 是关键页面,将 ip和cook返回
(ip,cook)
}else{ //若数据的 url 能够与规则的任意一个没有匹配成功,表示此url 不是关键页面,将“”和””返回
(“”,””)
}
//4调用 groupByKeyAndWindow,得到的结果是 key(IP)和 value的 list(Cookie的list)
groupByKeyAndWindow(Seconds(6),Seconds(2))
做接收返回 ipAndCook
val ipAndCook=processedData.map(message=>{
//遍历 ipAndCook
ipAndCook.map 拿一条数据,做返回
ipAndCook.map(message=>{
//5获取出 ip,和 value 的 list(Cookie的list),将 value 的 list 去重再求大小。
复制粘贴修改,获取不同行程的 list 改为获取 Cookie的list,删除获取出 ip,和 value 的 list。deparrcity 改为 cookList,去重求大小转换 toList.distinct.size 获得 cookSize,将 cookSize 返回。
//获取 ip
val ip=message._1
//获取 Cookie的list
val cookList=message._2
//将 value 的 list去重再求大小。
val cookSize=cookList.toList.distinct.size
//6将 ip 和值大小返回
(ip,cookSize)
二、回顾
截取数据 ip url cookie,ip 是 key,url 判断是否是关键页面。
遍历关键页面每个规则,用 url 匹配,匹配成功将 flag 改为 true 表示是关键页面返回(ip,cook),不是返回空。
groupByKevAndWindow,得到 IP 和 cook 的 list
遍历 ipAndCook,获取 IP 和 cook 的 list,去重求大小。
做接收,返回
val ipCookCount=ipAndCook.map(message=>{
ipCookCount
}
判断关键页面,求 cookSize,返回
//6 按 IP 地址聚合-某个 IP,5分钟内访问关键页面的 Cookie 数
做接收
val ipCookCount=CoreRule.criticalCookies(processedData,broadca
stCriticalPagesList.value)
//将最终数据转换为 Map,便于后续提取,使用。
var=ipCookCountMap=null
拷贝数据类型
var=ipCookCountMapcollectAsMap[String,Int]=null
遍历数据.foreachRDD,将 rdd 转换为 collectAsMap,用 collectAs
Map 接收
ipCookCount.foreachRDD(rdd=>{
ipCookCountMap=rdd.collectAsMap()
})
三、执行效果
输出,循环遍历,调用 ipCookCount
ipCookCount.foreachRDD(rdd=>rdd.foreach(println)
输出效果,预处理、爬虫、爬虫识别跑起来,右键执行
关键页面前面输出 ip,数量为1。cook 去重求大小,前提是关键页面,爬虫访问的都是关键页面,与前面效果相同(192.168.100.2,1)
19/05/17 20:15:08 INFO VerifiableProperties: Property zookeeper.
connect is overridden to
19/05/17 20:15:08 INFO VerifiableProperties: Property zookeeper.
connect is overridden to
(192.168.100.2,1)
停止程序、爬虫
四、总结
先判断是否为关键页面,是关键页面的前提下返回 ip 和 cook 的 size,cookSize 求大小
1、抽取出数据中的 IP,数据中的 url 和数据中的 Cookie
//获取ip
val ip =message.remoteAddr
//获取url
val url=message.request
//获取 cook
val cook=message.cookie_JSESSIONID
2、遍历数据库中的关键页面的规则。
for(criticalPages<-criticalPagesList){
//3 使用 url 与规则进行匹配,
匹配成功返回(ip,cook),匹配不成功返回(“”,””)
if(url.matches(criticalPages)){
//匹配成功 表示数据是关键页面 flag=true
}else{//匹配不成功 表示数据不是关键页面
}
}
3、使用 url 与规则进行匹配,
if(flag){
(ip,cook)
}else{
(“”,””)
}
4、调用 groupByKevAndWindow,得到的结果是 key(IP)和 value 的 list(Cookie的list)
groupByKeyAndWindow(Seconds(6),Seconds(2))
5、获取出 ip,和 value 的 list(Cookie 的 list),将 value 的 list 去重再求大小。
//获取 Cookie 的 list
val cookList=message._2
//将 value 的 list去重再求大小。
val cookSize=cookList.toList.distinct.size
6、将 ip 和值大小返回
(ip,cookSize)
7、将最终数据转换为 Map,便于后续提取,使用。
var=ipCookCountMapcollectAsMap[String,Int]=null
ipCookCount.foreachRDD(rdd=>{
ipCookCountMap=rdd.collectAsMap()
})