>科技>>正文

基于滑动窗口和SVM的爬虫检测

原标题:基于滑动窗口和SVM的爬虫检测

背景介绍

随着现在爬虫抓取策略的不断更新,传统单一策略的识别方式越来越难,所以我们需要一种更加灵活和智能的爬虫识别策略。比如现在的爬虫都使用大量的代理IP,单个IP的访问频率和次数都控制在一定的阈值范围内,而且访问的间隔和页面尽量随机或者模拟真实用户的访问行为,使得检测变得非常困难;基于以上的现状,我们采用基于滑动窗口和机器学习的方式来解决这个问题。

设计思路

滑动窗口是用户访问在时间或空间维度上的一个集合,时间维度指的是一定时间段内的访问、空间维度指的是一个固定访问次数。

滑动是指这个窗口随着时间或者空间在不断的往前移动。我们以下图来做一个解释:

图一指的是一个用户或爬虫开始访问,访问次数为4,但窗口设置大小为6,所以没有达到窗口阈值大小;

图二用户或爬虫继续访问,这时达到窗口大小,启动爬虫一次爬虫检测;

图三是检测完毕后扔掉集合前一半数据,继续等待请求到达,当窗口满了之后启动下一次检测策略,以此类推;

SVM(Support Vector Machine)指的是支持向量机,是一种业界比较通用的分类模型解决方案,他主要的工作原理就是根据不同的训练集生成分类模型,然后通过分类模型对请求进行预测,参考下图(有关SVM的原理在这里就不多介绍了,大家可以直接百度查询);

那怎样把滑动窗口和支持向量机结合起来识别爬虫呢?

是这样,我们先通过滑动窗口拿到用户的一个访问序列,然后从序列中抽取用户的特征,生成特征向量,然后输入到SVM里面去进行预测,如下图所示:

我们自定义了以下特征来识别用户和爬虫(绿色表示代码已实现,红色为未实现):

size:窗口大小,用于计算平均响应时间等参数;

urlCount:指窗口内有效url的数量;

uaCount:窗口内有效UA数量;

referRatio:非空和有效的refer占比;

successStatusRatio:响应成功的占比;

cookieIdentityRatio:携带coolie的占比,扩展思路是对coolie内容做校验;

traceUrlRatio:traceUrl指的是前端为了页面加载等性能监控而在js发送的异步数据, 用于分析页面加载等性能指标或者用户点击行为数据。这部分请求数据的参考价值在于,一般的爬虫在抓取页面的时候不会解析执行js脚本,所以根据改url占总的请求url的比例可以判断是否为爬虫的一个特征;

userPath:跟具体业务有关,统计所有正常业务访问路径,然后根据窗口内访问路径做匹配,匹配度越低的证明是爬虫的概率越高,由于时间关系,这个特征并没有应用到我们的代码里面;

系统架构

系统采用client-server的架构,每个模块的功能简介如下:

client端

1、从远端cache里拉取爬虫黑名单,采用相应的拦截策略进行拦截。具体的拦截策略client端会提供一些常用的拦截策略,如果需要扩展,适用方可以根据自己的业务场景做扩展;

2、标准格式的日志打印,因为每个业务线或者公司的access日志格式都存在差异,而且有些特征字段可能没有,所以我们在client端集成了统一的日志打印工作,格式如下:

private String ip;

private Date requestTime;

private String requestUrl;

private String requestMethod;

private String statudCode;

private String referer;

private String userAgent;

private String qunarGlobal;

private String sessionId;

private String previous;

private String current;

private List<Entity> cookies;

private List<Entity> headers;

3、服务端注册和数据同步功能,client段在启动时回去server端注册,server端的后台可以配置一些拦截策略通过数据同步给client端;

ELK:日志收集,主要是保证client端打印的日志能实时或准实时同步到ELK;

service端

1、SVM学习模块,在爬虫识别之前,我们需要提前使用标识为用户访问日志和爬虫访问的数据进行特征学习;

2、在线抽取拦截模块,定时任务会拉取ELK的访问日志,针对每一个用户生成滑动窗口,等待窗口打满之后出发爬虫识别;

3、展现部分,对当前的每个用户实时识别的结果会在后台展示,如果被窗口识别为爬虫的次数越多,排名越靠前,证明是爬虫的概率越高;

4、配置部分,公共策略会通过配置模块下发到每个client端,目前暂未应用;

Cache:

1、因为需要对每个用户创建一个滑动窗口,所以数据量肯定很大,所以需要远端cache作为窗口数据保存;

2、黑名单或者白名单保存,所有的Client端共用一套黑名单白名单数据,这样会大大减少在每个系统爬虫检测的消耗,一个IP一旦被识别为爬虫,会在所有的client端实时生效;

如何使用

接入成本很低,只需要引用client的jar包,增加一个filter即可,当然还需要把日志收集到ELK,然后把日志地址告诉我们,我们会在server端增加新接入系统的爬虫识别(后面通过配置即可),然后给每个使用方开通相应的后台权限。返回搜狐,查看更多

责任编辑:

声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
阅读 ()
投诉
免费获取
今日推荐