开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第三阶段):数据预处理-数据拆分代码及效果】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/671/detail/11651
数据预处理-数据拆分代码及效果
内容介绍:
一、数据拆分要实现的目标
二、数据拆分实现的过程
总体流程如下,数据预处理阶段脱敏完以后,接下来要做的事情是数据的拆分:
第三步是过滤数据清晰以后的数据当中,这里面去做个 map,得到的每一条数据都做了数据的脱敏,而后面的拆分、分类、解析、历史爬虫判断以及数据结构化,这几个过程也是针对一条一条数据的操作,所以要把这些步骤移到filtereddate.map 里面,放在第三步的后面。
也就是说这几个代码,这几个功能模块都是针对一条数据进行的操作,而后面的推送和监控就是针对一批一批数据库的操作,所以先把结构优化一下,移到第三步后面 filtereddate.map 里面之后,之前把身份证号码进行脱敏了,脱敏完以后接下来开始进行数据的拆分。
一、数据拆分要实现的目标
进入到目前为止,数据依然是使用#CS#进行拼接,拼接以后打到 kafka 里面,然后又接入到 streaming,数据预处理的程序当中。后续计算过程当中会频繁的使用到数据内的各个组成部分,例如 request,request 里面有 URL,requestmethod 前的 tab,服务器用户的 IP 以及 Cookie 等,现在数据是用#CS#进行拼接的,后续如果再用,第四步、第五步、第六步、第七步、第八步,好多步骤都需要用的这里面零散的数据,但是这些数据现在被拼成了一条,要用到这里面,比如说现在就用服务器的用户的IP,所以这里就用数据拆分,把这里面拼接后的数据进行拆分成一个一个的数据,这个时候想用什么拿什么,想用哪个数据拿哪个数据就可以了。
二、数据拆分实现的过程
现在数据是用#CS#拼接的,数据格式如下:
Local message=time_local 、request、 request method 、content_type 、request_body、 http_referer、 remote_adder 、http_user_agent 、time_iso8601 、server_adder、 http_cookie 、activeUserNumber
拼接后面用起来比较麻烦,所以为了方便使用,需要将数据进行拆分,然后组装成一个 TUPLE,以便于后续的使用,也就是说不用#CS#分割了,分成一个 TUPLE,里面包含了好多个数据,用哪个拿哪个就可以了。
实现这个思路的过程:使用脱敏后的数据,然后使用#CS#进行拆分,拆分完了以后得到一个一个的数据,将这一个一个的数据然后把分装成一个 TUPLE 返回。
实现的过程在数据脱敏的基础之上,然后去进行拆分,拆完以后获取数据的 URL、requestmethod 等也就是数据库,配置里面的这些数据,拆出来以后,再返回一个 TUPLE 就可以了。
代码用到一个叫 DataSplit,里面有一个小写的 dataSplit,就在这个方法里面去进行数据的拆分,创建一个DataSplit.dataSplit,在数据预处理里面有一个业务处理businessprocess,新建一个 scalaobject,然后粘贴一个datasplit,然后创建。
创建这个功能主要是用于数据切分的实现。主要就是切分完了以后返回一个 TUPLE,创建引入进来以后,先把数据传进来,数据是要基于脱敏以后的数据,就是 encryptedid,这就是脱敏以后的数据,身份证号和手机号都脱敏完了,接下来去进行拆分,拆分以后在这个时候把方法创建一下,在这个里面来实现数据的拆分,还是叫一个数据message,数据依然是使用#CS#进行拼接的,接下来就是用数据进行使用 split 来进行拆分,拆分完以后获得到每一个数据:
packagecom.air.antispider.stream.dataprocess.businessprocess
//用于数据切分的实现过程
Object Datasplit{
//实现数据的拆分
Def datasplit(message:String):Unit={
接下来就用#CS#进行拆分,message.split,#CS#加个-1,所有的#CS#都需要分割,分割完以后,得到的是一个经过拆分以后的就这些数据的 split,这个数据就得到了,然后求取一下数据的长度,value 给定个名字叫valuesLength,叫做数组,就是认为这个数组的长度,接下来判断首先要获取 request 的原始数据。
request,是第二个数据,而第二个数据拿到以后,里面实际要截取出里面的 Url,request 的里边真正要用到的数据是 URL,而这里的 POST 和 HTTP/1.1是不需要的,所以需要先使用#CS#去进行拆分,拆分完以后获得到这是第二个数据。
第二个数据的下角标是1,获取过来以后再用空格对这个数据进行拆分,拆分完以后再拿到用空格拆分完以后的第一个数据,第二个数据,第三个数据一共有三个,要拿第二个,这就是要最终拿到的结果,URL 是获取的 request,然后像里面的剩余的直接截取出来就行了。
稍微复杂一点的就是 request,先用#CS#拆分,拆分完以后再用空格拆分,拆分完以后拿到的就是 request,这个数据这个要做拆分的动作。
如果用#CS#拆分完的数组的长度1>1就是2,大于2。下角标是1,获取这个数组length里边的下角标为1的,也就是这里面的第二个数据。获取完了以后,还得用空格来进行拆分,就是 request,然后再去掉.split,再去用空格拆分,拆分完以后,长度如果大于1,大于1了才会有第二个数据。如果大于1,就再返回下角标为1的request.split的数据,也就URL,就是这里面定义了一个叫 requestURL 来进行接收,实际上就是最终的 URL,如果没有大于1就返回空,这个就截取出来数据当中 request 当中的 URL,就把它截取出来,这是第一个数据。
然后这个取完了以后,再去截取数据当中的叫requestmethod,是数据当中的第三个数据下角标是2,就获取数组的,前面用#CS#形式拆分完以后,如果长度大于二,就将下角标为2的值进行返回,就是 requestmethod。
Contenttype 的获取:是数据当中的第四个数据。第四个数据的下角标是3,就获取第三个。如果用#CS#拆分的数据,长度大于三,就是第四个,就返回第三个数据,如果没有就返回空,这个就是 Contenttype。实际上后面这些数据都一样,稍微有一点不一样的地方,就是第十个数据就是 cookie,要在 cookie 当中解析出两个数据,实际上所有代码,目的就是为了解析出 cookie 里面有一个 JSESSIONID 和 UserID4logcookie。在数据当中把这两个截取出来就行,实际上最终的目的就是要把这两个数据解析出来。而它们都包含在 cookie 里面。
这段代码的目的就是解析出 cookie 中第十个数据,角标是10的。cookie 里面的叫 JSESSIONID 和UserID4logcookie,这两个数据解析出来以后,实际上先用#CS#进行拆分的数据以及解析出来的这两个数据,就都准备完了,准备完以后,封装是一个如下所示的 TUPLE:
(request
requestMethod,contentType,requestBody ,httpReferrer,renoteAddr ,httpuserAgent ,timeIs08601,
serverAddr,
cookiesstr ,cookievalue. ,JSESSIONID,cookievalue. USERID)
TUPLE 把其放到最后并且进行返回,返回看一下数据类型,到整行里面,全部都是 string,复制然后粘贴到这个方法的返回值前面,这个代码就是用#S#拆分,拆分完以后数据获取出来以后,再封装成一个 TUPLE,再进行返回,而这里不返回 request,返回 requestURL。最终要的是 URL 进行返回,返回完了以后这个代码就写完了,最后在里面 val定义一个 TUPLE,然后来接收刚刚返回的一个 TUPLE,这个 datasplit 里是要去进行拆分,拆分完了以后再去进行返回。返回一个 TUPLE,而前面也定义了一个空 TUPLE,但这个里面表示的意思是空的:val (requesturl ,requestMethod ,content Type ,
requestBody ,httpReferrer remoteAddr ,httpuserAgent ,t imeI508601,
serverAddr ,cookiesstr .cooki evalue JSESS IONID, cook evalue USERID) =Datasplit . datasplit(enc ryptedId)
调用了 datasplit,才把结果给封装进去,这就是数据拆分的一个实际的代码过程。
实际的效果:比如拿出 requesturl,返回,返回完了以后后面有一个输出,直接得出切分以后的数据效果。如果能够直接输出一个 URL,就说明拆分是没有问题的,并且返回一个 PUPLE 也没有问题。程序运行后,接下来运行爬虫。接下来就会输出 URL:
/B2C40/query/jaxb/direct/query.ao
/B2C40/query/jaxb/direct/query.ao
现在不输出 URL,改为输出 requestmethod。再运行一遍,输出全部都是 post,这是切分完以后得到的数据:
这就是数据拆分的实现过程以及效果。