数据预处理-数据解析-确定解析规则思路及效果|学习笔记

简介: 快速学习数据预处理-数据解析-确定解析规则思路及效果

开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第三阶段数据预处理-数据解析-确定解析规则思路及效果】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/671/detail/11662


数据预处理-数据解析-确定解析规则思路及效果


内容介绍:

一、代码实现

二、代码执行


一、代码实现

前面完成了规则的读取,并加载到了广播变量里,解析的代码也完成了如下:

val queryRequestData =

AnalyzeRequest.analyzeQueryRequest( requestType,

requestMethod,contentType,requestUrl,requestBody,travel

Type, broadcastQueryRules.value)

这一行代码就能把规则解析出来,它是怎么解析的?

这里定义了一个方法,叫 queryRequestDate,这里面调用了一个叫 analyzeRequest,然后这里面有一个叫 analyQueryRequest。它后面括号里传了这么几个参数,先来看一下参数 requestType ,它是前面解析好的是飞行类型还是操作类型的标签。后面这个是 requestMethod 和 contentType ,还有 requesturl 都在前面做的数据拆分里面。

//数据拆分功能

val(requesturl ,requestNethod ,contentType ,requestBotdy,

httpReferrer ,remoteAddr ,httpUserAgent ,timeIso8601,

serverAddr ,cookiesstr ,cookievalue_JESSIONID,

cookievalue_usERID) =Datasplit.datasplit(encryptedId)

上面的代码就包含了之前需要的所有参数,所以做数据拆分,就是因为后续的计算会反复的用到这些数据。如果每次用它的时候再来拆分,就会很麻烦。所以做数据拆分就是一劳永逸了。

Traveltype 是刚刚计算出的单程和往返的标签。然后还有广播变量 broadcastQueryRules,因为这里面解析的是查询类的数据,广播变量的读取规则代码是:

//将规则加载到广播变量

@volatile var broadcastQueriyRules=sc.broadcast(queryRule)

image.png

因为这里面也是查询类的数据,也就是说把查询类的这三个规则,也就是把 behavior_type 等于零的读过来。读过来以后就是参数。广播变量放到这个方法里。那么这个方法是什么意思?

先看 analyzeRequest。这个就是解析数据的代码,它是已经写好的。

数据解析方法里面需要的几个参数也是前面算好的,因为解析数据要用到这几个参数,所以直接把参数传到这个方法里就行。

这里面有一个 analyzeQueryRequest ,也就是下图的这个方法:

image.png

它是来解析查询类的数据的,不同类型的数据根据不同的解析规则来进行解析。

怎么解析?刚刚读过来的规则是查询类的,而现在里面有三种情况,所以查询类的 query 也有三种情况。

image.png

目的是解析这个数据,那现在有三种选择,只能用一个。

所以下面的代码告诉了方法:

val queryRequestData: QueryRequestData = new

QueryRequestData

//数据库中有四条解析规则,我们需要通过传过来的这一条数据,确定数据凡配上的解析规则,然后用这个解析规则解析数据

val matchedRules = analyzeRules.filter { rule =>

//先根据请求方式和请求类型过滤出是属于查询的规则

if (rule.requestMethod .equalsIgnoreCase(requestMethod)

&& rule.BehaviorType ==requestTypelabel.behaviorType.id)

true

else

false

}

看里面的 analyzeRules ,就是最后一个参数。

这里有一个 filter ,用filter 去过滤,现在有三个规则,那么最起码要过滤两个。

这里有一个 analyzeRules.fliter 它是在数据库里查出来的,在数据库当中有一个 request method ,是三个数据库中的第一个指标的。判断代码是:

rule.requestMethod .equalsIgnoreCase(requestMethod)

看下图:

image.png

这个是判断是否相等的。用之前计算的 requestMethod 跟数据库里面配置出来的 requestMethod 比较。因为计算的数据都是 post 那让它和数据库里面的 post 比较,不等于的就返回 false 然后过滤掉。所以现在是有三种选择,这里面通过的 requestMethod 都是 post 。而数据库的第三个规则,也就是图中第四行是 get ,那么它就要被过滤掉。这样就从三个选择变成了两个选择。

看下一个,Rule.behaviorType 也就是这里面的 behavior_type。

image.png

这个标记的 Requesttypelabel ,就是前面计算的 Requesttype。

也就是说,数据库当中的 behaviorType 等于数据计算出来的behaviorType的id。

数据库里面的 behaviorType 是0,而现在的数据已经确定都是国内查询,也就是behaviorType是查询型的,那么这里面拿到的一定是0。所以两个都是0,也就没有过滤掉数据,所以到目前为止还是两个数据,如果这两个条件都满足,就返回 true ,不然就返回 false。

下面就是上述方法的代码:

if(rule.requestMethod.equalsIgnoreCase(requestMethod&&

rule.Behavior==requestTypeLabel.behaviorType.id)

true

else

false

还剩下两条数据,这时就要用到 filter 。调用 request,也就是之前解析的requesturl。

代码如下:

.filter { rule =>

//然后根据url正则表达式,过滤出是属于国内查询还是国际查询 request.matches(rule.requestMatchExpression)

requestMatchExpression 这个字段就在数据库当中。

如下图所示:

image.png

它是正则表达式。那用数据传过来的解析出来的 url 去匹配它的规则,如果匹配上就是 true,没匹配上就是 false 。

这里面有一个 app 有一个 query.ao,而数据过滤完以后,

val DataProcess= filteredData.map( message=>{

过滤后的数据都是 query.ao ,所以这个 query.ao 能匹配上返回 true ,app 就无法匹配返回 false 。经过这个操作,从两个选择,就成功的从两个选择里面。从这两个选择里面变成了只有一个选择。这样就明确到底该用哪一个规则来解析数据。此刻就用 depcity, arrcity,flightdate 来解析。

image.png

后面的代码就是来实现数据的解析的。按照这一批数据的规则来解析,解析完了以后出发地、目的地和起飞时间就都有了。后面的代码就是解析的过程,但是太多这里就不进行展示。


二、代码执行

解析完以后来看一下实际的效果。

//3对数据进行解析(在多种解析规则的情况下,确定最终使用哪一个规则进行解析)

val queryRequestData =

AnalyzeRequest.analyzeQueryRequest(requestType,

requestMethod,contentType,requesturl,requestBody,

travelType, broadcastQueryRules.value)

这个解析完以后接收回来的数据。把这个数据输出一下。

val queryRequestData = AnalyzeRequest .

analyzequeryRequest(requestType,requestMethod,contentType,requesturl,requestBody,travelType,

broadcastQueryRules.value)

val data= queryRequestData match {

case Some(datas)=> datas.depcity}

data

先随便先给个数据,做一个输出。这里返回出发地打出来。打出来以后,在前面做一个接收(val data =),然后对 data 进行一个返回。

执行这个代码看一下是不是能够把出发地解析出来。

然后把爬虫跑起来,看一下效果。

.add(new BasicNamevaluePair(

name:"json",

value: "{(\ "depcity \" : \ CAN\",\"arrcity\" : “WUH\",\“flightdate\":\"2018220\",\"adultnum)":\"1\",

这样如果解析结果正确,就会输出 CAN,看下面的结果:

image.png

爬虫的 depCity 是 CAN,这样就说明解析正确。

再来把出发地改成起飞日期:

case Some(datas)=> datas.flightDate}

日期是20180220,

然后再次执行,看下面结果:

image.png

所以起飞日期就被解析出来了。这样就把解析的工作做完了。

所以 case Some(datas)=> datas 中的数据想要哪个都可以拿到

image.png

解析数据就解析完成了,把程序和爬虫停掉。

相关文章
|
2天前
|
SQL 分布式计算 监控
Sqoop数据迁移工具使用与优化技巧:面试经验与必备知识点解析
【4月更文挑战第9天】本文深入解析Sqoop的使用、优化及面试策略。内容涵盖Sqoop基础,包括安装配置、命令行操作、与Hadoop生态集成和连接器配置。讨论数据迁移优化技巧,如数据切分、压缩编码、转换过滤及性能监控。此外,还涉及面试中对Sqoop与其他ETL工具的对比、实际项目挑战及未来发展趋势的讨论。通过代码示例展示了从MySQL到HDFS的数据迁移。本文旨在帮助读者在面试中展现Sqoop技术实力。
73 2
|
2天前
|
Python
选择和过滤数据DataFrame信息案例解析
该文介绍了如何使用pandas处理DataFrame数据。首先,通过创建字典并调用pd.DataFrame()函数转换为DataFrame。接着展示了使用loc[]选择年龄大于30的记录,iloc[]选取特定位置行,以及query()根据字符串表达式筛选(年龄大于30且城市为北京)数据的方法。
67 1
|
2天前
|
JSON 前端开发 Java
Json格式数据解析
Json格式数据解析
|
2天前
|
存储 JSON 数据格式
LuaJIT编写的解析十六进制数据
LuaJIT编写的解析十六进制数据
21 1
|
2天前
|
自然语言处理 数据可视化 数据挖掘
带你飞上云端,轻松解析数据——gopup库详细解析--包含安装库教程
本文介绍了Python库gopup,它是一个用于轻松爬取互联网数据的工具,简化了数据收集和处理的过程。文章提供了gopup的安装教程,特别强调了安装时需注意setuptools版本,并给出了PyCharm和命令行两种安装方法。gopup库能获取包括指数、百度和谷歌数据等多种类型的数据。文中还展示了如何使用gopup获取微博指数和豆瓣新片榜数据,并通过代码示例呈现数据和图表。此外,文章提醒了使用时的风险和部分接口的失效情况,并提供了库文档链接以供深入学习。gopup库适用于数据可视化和数据分析,是进行文本挖掘和自然语言处理项目的理想工具。
带你飞上云端,轻松解析数据——gopup库详细解析--包含安装库教程
|
2天前
|
存储 JSON 数据处理
从JSON数据到Pandas DataFrame:如何解析出所需字段
从JSON数据到Pandas DataFrame:如何解析出所需字段
14 1
|
2天前
|
XML Java 数据库
【后台开发】TinyWebser学习笔记(3)HTTP连接与解析
【后台开发】TinyWebser学习笔记(3)HTTP连接与解析
14 4
|
2天前
|
存储 缓存 Linux
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(三)--实时与非实时数据交互
本文介绍了Xenomai中的XDDP(Xenomai Distributed Data Protocol)通信机制,XDDP用于实时和非实时进程之间的数据交换。XDDP在Xenomai内核中涉及的数据结构和管理方式,以及创建XDDP通道后的实时端和非实时端连接过程。
22 0
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(三)--实时与非实时数据交互
|
2天前
|
XML 存储 开发框架
c#教你网站数据轻松解析抓取,HtmlAgilityPack解析的奇妙之处
c#教你网站数据轻松解析抓取,HtmlAgilityPack解析的奇妙之处
11 0
|
2天前
|
JSON 安全 前端开发
解析FormData格式数据:Python实践指南
解析FormData格式数据:Python实践指南
15 1

推荐镜像

更多