开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第三阶段):数据预处理-单程往返-需求与思路】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/671/detail/11658
数据预处理-单程往返-需求与思路
内容介绍:
一,单程往返的概念及目标
二,代码实现
一,单程往返的概念及目标
数据分类有一个分类叫数据是单程的还是往返的。那么什么是单程什是往返?
模块的目的就是根据数据当中 httpReferrer 里面日期格式数据出现的次数。这个数据包含日期格式,比如年月日。根据这个数据出现的次数判断它是单程还是往返还是其他。如果有一个日期类型格式就是单程,两个就是往返,没有就是其他。
以南方航空为例,当前默认的,是从广州到北京。
现在默认的是往返,下面点击单程。
当点击单程的时候,发现返回日期没有了,重新点击往返就会再次显示。所以点击单程只有一个日期,往返就有两个日期。那也就说往返的业务场景有两个日期格式的数据,单程的有一个。
下面来监控。打开监控会显示下面的页面:
然后以从广州到北京为例,现在是往返类型有两个日期。
然后跟踪一下实际效果,点击网络。
在过滤 URL 里查询 query。
然后在里面找到并点击往返(Referer),会显示:
https://b2c.csair.com/B240/newTrips/static/main/page/booking
/index.html?
t=R&c1=CAN&c2=PEK&d1=2019-05-16&d2=2019-05-16&at=1
&ct=0&it=0
从中可以看到两个日期格式,把它打开并直接粘到程序里,这个就是 httpReferrer 。
里面的日期格式有两个,所以它是往返类型,就根据这个来进行计算。
二,代码实现
目标明确了,但是要怎么做?
先来创建一下实例来判断是单程还是往返
打这个标签的一个方法,就是下面这个方法:
TravelTypeClassifier.classifyByRefererAndRequestBody
把它粘贴过来,
把后面的括号补全。会发现现在它是红的,红的说明当前并没有名为 TravelTypeClassifier的 object 。 按下图步骤创建 object 。创建名为TraveITypeClassifier,
这个方法主要就是用于实现单程-往返的标签。
package
com.air.antispider.stream.dataprocess.businessprocess
//用于实现返程-往返标签
object TravelTypeclassifier {
}
主要在上面这个地方来实现这个工作。创建完之后这里就不报错了。
但是后面这个 classifyByRefererAndRequestBody 这个方法还没有,所以接下来要实现这个方法。在这个方法当中,我们根据 httpReferrer 去判断单程往返。所以需要找到这个数据,这个数据在哪?
//数据拆分功能
val(requestUr1,requestMethod,contentType,requestBody,
httpReferrer,remoteAddr,httpUserAgent,timeIso8601,
serverAddr,cookiesStr,cookieValue_JSESSIONID,
cookieValue_USERID)=DataSplit.dataSplit(encryptedId)
上面是对数据进行了拆分,里面有 httpRreferrer 这个数据。所以将其粘贴进来以后,这个方法就创建完了。
TravelTypeClassifier.classifyByRefererAndRequestBody(httpRreferrer)
这样参数就准备好了并且放到了这个方法里边,但是这个方法还没有,所以如下图所示创建方法:
在这里加上注释:表明这个方法用于实现打单程往返标签
package
com.air.antispider.stream.dataprocess.businessprocess
//用于交现返程-往返标签
object TravelTypeclassifier {
//实现打单程往返标签
def classifyByRefererAndRequestBody( httpReferrer:
string : Unit = {
}}
这样这个方法就创建完毕。
接下来就这个方法来实现打标签的过程。先把数据加过来,数据的代码如下:
https://b2c.csair.com/B2C40/newTrips/static/main/page/booking
/index.html?
t=R&c1=CAN&c2=PEK&d1=2019-05-16&d2=2019-05-16
&at=1&ct=0&it=0
整体的代码就是:
package
com.air.antispider.stream.dataprocess.businessprocess
//用于交现返程-往返标签
object TravelTypeclassifier {
//实现打单程往返标签
def classifyByRefererAndRequestBody( httpReferrer:
string : Unit = {
https://b2c.csair.com/B2C40/newTrips/static/main/page/booking
/index.html?
t=R&c1=CAN&c2=PEK&d1=2019-05-16&d2=2019-05-16
&at=1&ct=0&it=0
}}
这就是数据,那这个数据按照什么顺序来进行处理的。先看一下这个数据有什么特点。这个数据要怎么判断日期类型出现的数量?
使用一种最朴实的方法判断,看一下这个数据,前面是 url访问的路径,后面是一些参数。他们之间用问好分割。所以先用问号做一次拆分,拆分完以后再仔细观察后面的数据。
https://b2c.csair.com/B2C40/newTrips/static/main/
page/booking/index.html?
//
t=R&c1=CAN&c2=PEK&d1=2019-05-16&d2=2019-05-16
&at=1&ct=0&it=0
切分完以后的第二个数据再与字符(&)进行拆分。拆分的结果:
//https://b2c.csair.com/B2c40/newTrips/static/main/
page/booking/index.html ?l
//t=R&
//c1=CAN&
// c2=PEK&
//d1=2019-05-16&
//d2=2019-05-16&
//at=1&
//ct=0&
/ /it=0
拆完以后的每个参数里面都有等号。然后再用等号拆,拆分完以后的第二个值是就是我的数据,可能是也可能不不是日期。
所以就按照这个思路来,先用问号拆再用与字符拆然后再用等号儿拆。拆分完以后出来的第二个数据就是我们想要的数据。然后用日期这个格式的一个正则表达式去判断,拿这个数据去匹配正则表达式,如果匹配上就等于找到了。找到以后就做一个日期类型的计数器来统计数量。匹配上一次计数器加一,最后算一下计数器的数量就可以了。再根据数量来进行判断是单程还是往返。
总结一下这个思路:
第一步,先用问号对数据进行切分。
第二版,在第一步的基础上用语字符去进行拆分。
第三步,再用等号把第二部的数据进行切割,获取第二个数据。
第四步:等号拆分完以后,要在这里面用一个日期格式的正则表达式跟切分完以后的第二个数据去匹配。
第五步,用技数器记录匹配上的次数。
第六步,通过计数器的值判断是单程还是往返还是其他。
以上就是本节课的内容。