开发者学堂课程【大数据实战项目 - 反爬虫系统(Lua+Spark+Redis+Hadoop框架搭建)第六阶段:第六阶段总结】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/674/detail/11736
第六阶段总结
内容介绍:
一、爬虫识别规则
二、模块逻辑分析
三、数据预处理及爬虫监控
一、爬虫识别规则
在5-1中读取数据、规则,识别过程当中会涉及到8个指标的计算,这8个指标计算就是第五阶段,而第六阶段就是根据前面计算出来的结果进行打分,所以第五第六阶段做的是爬虫识别过程,接下来对第五第六阶段进行总结。
1、单位时间内IP段的访问量。根据这个指标能够统计出数据当中某一个区域内的访问量。
2、单位时间内访问的总量。即某一个IP单位时间内访问的总量,总量越多表示是爬虫的可能性越大,因为正常人可能会访问10次8次,爬虫可能会访问几十次几百次甚至上千次。
3、某个IP单位时间内关键页面的访问总量。在1、2的前提下加一个条件,即需要关键页面。普通人对于关键页面访问的次数比较少,爬虫访问的所有路径可能都是关键页面,根据这个区别可以判断是否是爬虫。
4、单位时间内ua的种类的数量。爬虫可能会来回切换ua以躲避反爬虫的统计,可以根据此特性来识别ua 的种类数,越多是爬虫的可能性越大。
5、单位之间的某个IP访问的关键页面的cookie 数。爬虫可能会来回切换cookie ,需要做驱虫,第六个也需要。
6、某IP单位时间内访问不同行程的次数。切换越多是爬虫的可能性越大。出发地和目的地拼装成一个字符串,即可进行驱虫。
7、单位时间内关键页面的最小访问时间间隔。爬虫速度比较快,效率比较高,每两次之间的访问时间间隔会很短,而正常人访问的时间会比较长,因为有思考和对比的时间。
8、计算单位时间内某一个IP小于某个最短访问时间间隔的关键页面的数量。例如正常人小于两秒钟的数量较少,而爬虫的很可能全都小于两秒钟,数量越多,爬虫的可能性越大。
二、模块逻辑分析
1、读取封装
下面分析实践过程,回到代码即爬虫识别中,首先有一个main方法,在爬虫识别的程序入口设置了日志的级别,程序被quit时运行完最后一批再关闭,然后设置 APP内部 master 以及开启机器监控任务,开启后实例 sparkcontext ,kafkaparams ,topics ,之后把这三个参数传到 setuprulecomputeSsc 里,然后开启任务、循环。
在这个方法里实例了 sparks dreaming 的context ,两秒钟读取一次数据,读取后拿到从 striving里接收、在kafka里读取的数据,接下来去进行8个指标的计算。由于读出的数据是1条,里面的数据是#CS#,所以要在里面进行封装,将输入的数据封装成processeddata ,再调用Processeddata .的方式,把数据获取出来,用时可以直接通过.的方式拿取数据,比较方便。
2、指标计算
(1)计算五分钟内IP段的访问总量。获取出数据当中的IP后,把 Processeddata 塞到IP blockcounts 算法里,在这个方法里首先截取出IP,我要统计的是IP段,要将前两位截出来。先拿到第一个.的位置,再拿到第二个.的位置,用substring进行截取,从0截到第二个.的位置,就是 Ip段,拿到后将IP段作为key ,1作为value 进行输出。
统计IP段的访问量类似于单词的总数,调用 reducebykey 进行统计,而reducebykey 中统计的数量,要统计的是5分钟时间范围内IP端的访问总量,而同步计算周期比较短,但计算的时间跨度比较大,所以就要用reducebykeyandwindow 传入两个数据a和b,做一个简单的操作,窗口的宽度是5分钟,窗口的滑动长度是2秒钟。
根据企业需求是10秒或20秒或30秒滑动一次,调用reducebykeyandwindow进行计算,出来的结果就是IP和IP段已经IP段对应的值,之后进行返回,返回以后要转化成map,原因为后续计算出来的结果是IP和量,8个结果中只有第一个是IP段,后面7个都是IP和1个量。
要做爬虫的计算分析、指标碰撞,用到的是某一个IP对应的值的集合,与IP没关系。
将IP针对的IP段所对应值抽取出来,为了便于抽取转化成map。map的key 是ip , value 是值,调用时通过 keymap 的名称已经.get的方式,就可以把IP对应的值获取出来。
(2)针对某一个IP统计五分钟范围内的访问总量。把数据传递进去,即可直接获取IP并返回。要求计算IP的总量,没有任何条件,因而将IP作为key,1作为value ,调用reducebykeyandwindow 去进行加加,求出来的结果即为IP对应的总数,同样需要转化为map 。
(3)五分钟内关键页面的访问总量。需要先判断是不是关键页面,如果是再进行输出IP和数量,不是即可跳过。
将IP和URL抽取出来,URL与关键页面进行匹配,上述程序中的一段代码可在初始化阶段读取程序,读取出数据的关键页面以及流程相关的信息,读取出后放入广播变量,判断是否需要更新。关键页面出现,进入方法取出IP,key URL 是判断是否为关键页面的依据,匹配成功表示是关键页面,里面有关键页面的flag ,如果是,将其改成true,默认情况下是false 即不是关键页面。可以根据前面的判断知道是不是关键页面,如果是返回IP和1,不是返回IP和0,同样调用reducebykeyandwindow 进行计算Ip的关键页面的前提下被访问了多少次,同样转化为map 。
(4)五分钟范围内的ua 统计出现的数量。将数据传递到ua中,通过processeddata 传进来以后遍历数据中的IP和获取数据中的ua ,返回IP和ua ,调用groupbykeyandwindow (同样是andwindow ,但是这里面是groupby )进行分组,完成后拿到结果,分组后的结果中有多个值是IP和一个value 的list 。
Value 的list 指的是ua的list ,将ua去除后求大小即为ua 的数量,将其遍历后先进行tolist 的转化,调用 distinct 和size ,即可求出ua的数量,再返回IP和ua 的数量。同样将其转化成map 。
(5)不同行程以及cookie 与前面的ua一样,只是取出的数据不一样,不同行程将出发地和目的地取出来作为key ,拼接后作为key 重求大小,cookie也重求大小,但需要先判断是否是关键页面,如果是再返回IP和cookie,不是即可跳过。
(6)五分钟范围内关键页面的最小访问时间间隔。
①判断是否是关键页面,拿URL与关键页面进行匹配,成功表示是关键页面,因为统计的是最小访问时间间隔,需要多个时间,然后输出IP和时间,调用 groupbykeyandwindow ,拿到IP和时间的list ,遍历时间的list,获取某一个时间将其转化成时间戳,先转化成标准时间,再转化成时间戳。
②将时间塞到一个list 时间戳里,然后对时间戳的list 进行排序,得到相邻的两个再求差,得到差的集合,对差的集合进行排序,排序以后获取的第一个就是最小访问时间集合,接着返回IP和最小访问时间间隔。其中业务逻辑不复杂,但是代码比较多。
(8)五分钟范围内关键页面的小于最小访问间隔的次数。
①判断是否是关键页面,然后获取最小访问时间间隔,在程序的数据库中可获取,往后设置一个计数器,表述最小时间的次数。
②用URL匹配关键页面,如果是关键页面返回IP和时间,拿到多个时间进行遍历,将时间转化成时间戳,拿到时间戳的list进行排序,排序后得到两个数据之间的时间差,与数据库里面查出来的最小时间差距对比,若数据的时间小于默认值,那么计数器记录的就是小于默认值的数量,最终将计数器的数量IP作为key ,数量作为value 返回。
3、爬虫识别
(1)指标碰撞
计算完8个指标,每条数据进行遍历,前期为指标碰撞的准备工作,即在通过IP获取出8个指标对应的值,再获取企业里这8个值,通过遍历将两个结果代到碰撞算法中,指标碰撞出来的结果返回两个结果再发送给打分算法,会得到最终的得分,再用最终的得分与最终阈值匹配来判断大小关系,然后返回true or false ,判断是不是爬虫。
①使用 processeddata ,也就是前面8次用到的数据,遍历里面的每一个数据,获取数据的IP,用IP、processeddata 以及8个结果和流程的广播变量放到碰撞算法里。而碰撞算法这里面先要获取出这8个结果,也就是 IP对应在8个结果里的值,先获取出来。只有第一个是IP段先处理一下,IP段获取出来,有了IP,8个结果都获取完后将数据封装成一个map ,map 里的key 是流程规则的名称,规则的名称作为key ,值作为value封装到map里,map封装完以后,将这两个结果发送到真正的碰撞算法里。
②以上是准备数据,这里是碰撞,碰撞的过程里实例了一个与选定与否无关的所有的数据的指标的结果,以及一个必须是选定的同时数据的值大于阈值的结果。
(2)最终打分
①拿到流程,遍历流程,一个流程中有多个规则,遍历每一个规则,获取每一个规则对应的阈值,其中rulename 比较特殊,它有两个值,第二个值才是阈值。其他的全部是第一个值是阈值。
②所有流程的阈值配置好后获取出来, datavalue 指的是数据计算出来的结果,那也就是我们前面塞过来的结果,将计算出来的结果用rulename 来 get ,与企业配置的结果做对比,若数据计算出来的结果大于配置结果,就取数据当中对应的分数,将其封装到all里,不管有没有选中。也把后面命中的规则加进去。
③要判断是否选中,也就是这里必须是选中的结果,将其封装完后来实现打分。两个结果塞给打分算法,根据其返回一个分数。
(3)爬虫判断
最终的阈值分数获取出来和数据打出来的分数对比,若计算出来的分数大于阈值分数,就返回ture ,否则返回false ,ture表示是爬虫,false表示不是爬虫,将其返回获取数据后封装flowsscore,即可获得流程ID,分数及是否是爬虫。得到封装数据后即可获取是否是爬虫的规则。
4、数据入库
(1)非爬虫过滤
数据中可能有非爬虫数据,需要过滤非爬虫数据,过滤出数据当中的flowsscore ,若是true 就是爬虫,不是就是false ,用filte r进行过滤即可。
(2)爬虫去重
过滤掉非爬虫数据后,数据中有重复数据,需要获取出IP和flowsscore ,再调一次reducebykeyandwindow 进行驱虫,驱虫后得到最终结果。
(3)写入Redis
①数据获取出来后,写到 redis 里,把数据序列化一下再遍历出来得到结果,获取IP 和 flowsscore ,拼接将要写到redis 里面的key,将前缀+IP+flowI+时间,有grow upbykey 可以不加时间,这取决于业务,和前端工程师进行约定,要什么数据给什么数据即可。
组装key获取时间,组装value 后将数据写到redis即可。
②写入redis 里有可能造成数据丢失,可以做一个备份,在数据写入到 Redis 的同时实例一个 row 类型的 arraybuffer 存储获取的数据。在这里写入一条数据填充一下,填充后将数据写入hdfs 作为备份。若数据丢失,前面启动时可以先做一次恢复,在radis 里面标记防止丢失。
三、数据预处理及爬虫监控
最后一个功能模块即计算离线数据时,领导想看的数据还没有预处理结果,可将5-1的读出数据写入到hdfs 里。做完这个代码后,做一个系统的监控,即爬虫识别阶段的监控,监控的最终结果就是能够在首页中看到数据,即爬虫识别的效率。


















