爬虫识别-关键页面数据读取|学习笔记

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Redis 版,经济版 1GB 1个月
简介: 快速学习爬虫识别-关键页面数据读取

开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第五阶段爬虫识别-关键页面数据读取】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/673/detail/11691


爬虫识别-关键页面数据读取

 

目录:

一、指标计算

二、需求

三、设计

四、代码

 

一、指标计算

image.png 

单位时间内的 IP 段访问量(前两位)

单位时间内访问关键页面的 Cookie 数

单位时间内的访问总量  

单位时间内查询不同行程的次数

单位时间内的关键页面访问总量

单位时间内的关键页面最短访问间隔

单位时间内的 UA 种类数统计

单位时间内小于最短访问间隔(自设)的关键页面查询次数

八个指标一部分需要用到关键页面,数据的关键页面在数据库已经配好。

数据封装为 processedData,效果没有问题。 

 

二、需求

在之前 dataprocess 中,加载和很多的数据库规则,在 rulecomput

e 时,也需要加载数据库规则,供计算指标使用,提前加载

规则 1:关键页面;爬虫识别流程里计算总量时要知道谁是关键页面,关键页面在数据库配置。后期分析关键页面的访问量,加载进来,并广播

规则 2:流程规则;后期需要根据流程规则对数据打分。假如八个指标计算完成进行指标碰撞,八个指标是数据计算得出,怎样知道根据数据判断是否为爬虫需要参考期,企业配置的8个阈值

 image.png

八个阈值:

5分钟内的 IP 访问量

5分钟内的关键页面访问总量

5分钟内的 UA 出现次数统计

5分钟内的关键页面最短访问间隔

5分钟内小于最短访问间隔()的关键页面查询次数

5分钟内关键页面的访问次数的 Cookie 数

5分钟内查询不同行程的次数

5分钟内的 IP 段访问总量

image.png

八个阈值在企业端数据库配置,八个指标算出与企业配置的八个阈值对比,从数据库里将八个指标读到程序,现在还在数据库里。

第二个流程规则是八个阈值数据,从数据库读到爬虫识别程序。关键页面、流程规则要读到数据库。

 

三、设计

1、在 sc 初始化后,kafka 数据加载前初始化 mysgl 数据,并广播。读取数据后加载到广播变量

2、在加载 kafka 数据后,需要根据数据库标识,标识是否需要更新决定什么时候需要更新广播变量

3、关键页面规则表 itcast_query_critical_pages

找到关键页面规则表双击打开

image.png 

前面为 id 后面为关键页面,后面字段都是关键页面,设计表无说明。

判断是否为关键页面将后面加载,用数据的 URL 和三个循环对比、匹配,匹配任意一个都表示是关键页面。

4、流程规则策略配置

a) itcast_process_info,

b) itcast_strategy

c)itcast_rule,

d)itcast_rules_maintenance_table

 

四、代码:关键页面(itcast_query_critical_pages)

.广播

//获取查询关键页面

var queryCriticalPages=AnalyzeRuleDB.queryCriticalPages()

@volatile var broadcastQueryCriticalPages=sc.broadcast(queryCrit

icalPages

数据库值读到程序要先加载,AnalyzeRuleDB 里有关键的查询页面

queryCriticalPages()

根据经验在初始化阶段读取数据

setupRuleComputeSsc 初始化

Ssc=new StreamingContext(sc,Seconds(2))实例 StreamingContext

引入进 AnalyzeRuleDB.queryCriticalPages(),没有此方法,创建方法。

def queryCriticalPages():Nothing=??? 剪切到最后

object AnalyzeRuleDB{ 预处理的 AnalyzeRuleDB,爬虫识别与预处理使用同一个 object

//读取关键页面到程序

def queryCriticalPages():Unit={

读取关键页面需要 sql 语句,复制粘贴

//读取黑名单的 sql

val sql="select ip name from itcast_ip_blacklist'

//接受数据的字段

val field="ip_namel

//调用 QueryDB 读取数据

val blackIpList=QueryDB.queryData(sql,field)

//返回过滤数据

blackIpList

黑名单改为关键页面,sql 改为 criticalPageMatchExpression,表名改为 itcast_query_critical_pages,接收为 criticalPageMatchExpres

sion,blackIpList 改为 criticalPageList 返回过滤数据为 criticalPag

eList

def queryCriticalPages():ArrayBuffer[String]={

//读取关键页面的 sql

val sql="select criticalPageMatchExpression from itcast_query_criti

cal_pages“

//接受数据的字段

val field="criticalPageMatchExpression

//调用 QueryDB 读取数据

val criticalPageList=QueryDB.queryData(sql,field)

//返回过滤数据

criticalPageList

返回程序接收

//读取关键页面到程序

val criticalPageList=AnalyzeRuleDB.queryCriticalPages()

//将数据添加到广播变量

数据拿来广播,前面做接收 val broadcastcriticalPageList,前面加修饰不稳定 @volatile

@volatileval broadcastcriticalPageList=sc.broadcast(criticalPageLi

st)

判断是否需要更新,初始化阶段读取程序,两秒钟迭代一次。

用 kafkaValues 调用 foreachRDD,在 RDD 做大括号,每两秒钟循环一次,放入是否需要更新

kafkaValues.foreachRDD(rdd=>{

val needUpdateQueryCriticalPages=jedis.get("NeedUpDateQueryC

riticalPages"

if(!needUpdateQueryCriticalPages.isEmpty()&&needUpdateQueryCriticalPages.toBoolean){

queryCriticalPages=AnalyzeRuleDB.queryCriticalPages() broadcastQueryCriticalPages.unpersist()

broadcastQueryCriticalPages=sc.broadcast(queryCriticalPages) jedis.set("NeedUp DateQueryCriticalPages", "false")

没有 jedis 创建 jedis,爬虫预处理阶段有,复制粘贴

//实例 redis 为后续使用

val redis =JedisConnectionUtil.getJediscluster

初始化时创建,引入

将 redis 改为 jedis,queryCriticalPages 改为 criticalPageList,val 改为 var 可变类型,broadcastQueryCriticalPages 改为 broadcast

CriticalPagesList

//读取关键页面到程序

var criticalPagesList=AnalyzeRuleDBqueryCriticalPages()

//将数据添加到广播变量

@volatilevar broadcastCriticalPagesList=scbroadcast(criticalPages

List)

kafkaValues.foreachrDd(rdd=>{//关键页面是否改变标识

val needUpdateQueryCriticalPages=jedis.get("NeedUpDateQueryC

riticalPages")

if(!needUpdateQueryCriticalPages.isEmpty()&&needUpdateQueryCriticalPages.toBoolean){

criticalPagesList =AnalyzeRuleDB.queryCriticalPages()

broadcastCriticalPagesList.unpersist()

broadcastCriticalPagesList =sc.broadcast(queryCriticalPages)

jedis.set("NeedUpDateQueryCriticalPages","false")

}

逻辑

kafkaValues RDD 两秒钟循环,将数据添加到广播变量后判断数据是否需要更新,redis 里添加 key two or false。

查询关键页面是否需要更新,如果不等于空!查询转换为 toBoolean 表示需要更新,重新读取数据库规则、关键页面,广播变量进行清空,重新加载数据到广播变量里,将值改为 false。

关键页面数据读取成功。

相关文章
|
15天前
|
数据采集 XML 前端开发
五:《智慧的网络爬虫》— bs4数据解析
【8月更文挑战第4天】bs4(Beautiful Soup 4)是python的一个库,最主要的功能是从网页抓取数据,它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式。BeautifulSoup会帮你节省数小时甚至数天的工作时间。在本篇文章的最后设置了一个爬取全国所有天气的项目作为本篇文章的总结,愿大家有所收获~
36 6
五:《智慧的网络爬虫》— bs4数据解析
|
27天前
|
数据采集 大数据 Python
FFmpeg 在爬虫中的应用案例:流数据解码详解
在大数据背景下,网络爬虫与FFmpeg结合,高效采集小红书短视频。需准备FFmpeg、Python及库如Requests和BeautifulSoup。通过设置User-Agent、Cookie及代理IP增强隐蔽性,解析HTML提取视频链接,利用FFmpeg下载并解码视频流。示例代码展示完整流程,强调代理IP对避免封禁的关键作用,助你掌握视频数据采集技巧。
FFmpeg 在爬虫中的应用案例:流数据解码详解
|
11天前
|
数据采集 数据可视化 搜索推荐
Python爬虫技术从去哪儿网获取旅游数据,对攻略进行可视化分析,提供全面的旅游攻略和个性化的出行建议
本文利用Python爬虫技术从去哪儿网获取旅游数据,通过数据处理和可视化分析,提供了全面的旅游攻略和个性化出行建议,同时探讨了热门目的地、出游方式、时间段以及玩法的偏好,为旅游行业和游客提供了有价值的参考信息。
|
6天前
|
数据采集 数据挖掘 数据处理
Python爬虫开发:爬取简单的网页数据
本文详细介绍了如何使用Python爬取简单的网页数据,以掘金为例,展示了从发送HTTP请求、解析HTML文档到提取和保存数据的完整过程。通过这个示例,你可以掌握基本的网页爬取技巧,为后续的数据分析打下基础。希望本文对你有所帮助。
|
7天前
|
数据采集 数据挖掘 数据处理
Python爬虫开发:爬取简单的网页数据
在数据分析中,数据的获取是第一步。随着互联网的普及,网络爬虫成为获取数据的重要手段。本文将详细介绍如何使用Python爬取简单的网页数据。
|
13天前
|
数据采集 数据挖掘 Python
python爬虫去哪儿网上爬取旅游景点14万条,可以做大数据分析的数据基础
本文介绍了使用Python编写的爬虫程序,成功从去哪儿网上爬取了14万条旅游景点信息,为大数据分析提供了数据基础。
|
27天前
|
数据采集 Web App开发 存储
Python-数据爬取(爬虫)
【7月更文挑战第24天】
55 7
|
27天前
|
数据采集 机器学习/深度学习 算法
Python-数据爬取(爬虫)
【7月更文挑战第23天】
43 5
|
2月前
|
XML 数据采集 前端开发
四:《智慧的网络爬虫》— 数据解析之xpath解析
本篇文章主要讲述了数据解析中的xpath解析,及相对路径的定位语法。最后以爬取豆瓣top250首页作为示例总结
67 5
四:《智慧的网络爬虫》—  数据解析之xpath解析
|
1月前
|
数据采集 存储 Web App开发
Python-数据爬取(爬虫)
【7月更文挑战第15天】
86 3