about:blank

编程与生活一样, 都是严肃而富有艺术的
随笔 - 14, 评论 - 73, 引用 - 1

导航

关于

其实我是蜘蛛侠...
另一个blog: http://yishan.cc/blogs/nickledson

标签

每月存档

最新留言

  • re: 我眼中的编程之美
    写得真好!
    by magicboy(匿名) on 2008/3/18 15:51:40
  • re: 我眼中的编程之美
    赞一个,把算法能力和项目工程能力区别开来对待是现在很多一线开发人员的通病,我曾经也深陷这个误区不能自拔
    by Anrs(匿名) on 2008/3/13 8:35:41
  • 回复: Hard Drive
    很有同感,我喜欢!!!!!!!!!
    by borcala(匿名) on 2008/2/18 20:47:00
  • 回复: Hard Drive
    很有同感,我喜欢!
    by borcala(匿名) on 2008/2/18 20:46:00
  • 回复: Hard Drive
    看来还是有些人关注这本书的:) <br> <br>&gt;&gt;lzz, xjb: <br>我一直都是&quot;敏于思而疏于行&...
    by VincentChen(匿名) on 2008/2/15 21:19:00
  • 回复: Hard Drive
    Hard Drive = 用力开车的意思。 <br> <br>但是“用力开车”查不到这样的书。
    by ralph(匿名) on 2008/2/14 17:20:00
  • 回复: Hard Drive
    有中文版本嗎?
    by 阿牛(匿名) on 2008/2/14 16:47:00
  • 回复: Hard Drive
    有中文版本嗎?
    by rockniu(匿名) on 2008/2/14 16:47:00
  • 回复: Hard Drive
    Hard Drive 翻译成中文是什么?是硬盘么?
    by drive(匿名) on 2008/2/13 13:38:00
  • 重要但不紧急的事
    事儿真多。 有重要的事,有紧急的事,有紧急但不重要的事,也有重要但不紧急的事。(详细的论述参见 “超级高效人士的超级6+1个习惯”或者其他时间管理的书籍) 对于IT 行业的人来说,读书,是一件重要但不...
    by Joycode@Ab110.com(匿名) on 2008/2/12 13:32:00
  • 回复: Hard Drive
    那lz是如何行动的呢?
    by lzz(匿名) on 2008/2/12 12:01:00
  • 回复: Hard Drive
    成功的道理很多,但关键是如何行动
    by xjb(匿名) on 2008/2/10 16:40:00
  • 回复: Hard Drive
    深受触动 谢谢楼主!
    by helixapp(匿名) on 2008/2/9 0:20:00
  • 回复: Hard Drive
    有点意思,新年快乐……
    by false(匿名) on 2008/2/8 19:12:00
  • 回复: Hard Drive
    写得非常不错,思路不错,顶一个,新年快乐……
    by 91cn00(匿名) on 2008/2/8 18:26:00
  • 回复: Hard Drive
    路过,顶一下。再祝新年快乐。
    by 问道优酷(匿名) on 2008/2/8 15:09:00
  • 回复: 对判定网页爬虫算法的一点思考
    X为间隔数组,那么Y就是相对于开始的时间么…… <br>所以你这个意思就是点击时间和点击序号线性相关么…… <br>假如加入随机化,我很怀疑这个是否成立…… <br>...
    by Henry(匿名) on 2008/2/8 12:19:00
  • 回复: 发两个刚做的web part
    发个源码噻,大家一起学习进步
    by webpart开发者(匿名) on 2008/1/4 9:29:00
  • 回复: 发两个刚做的web part
    请教 怎样把自己做的web part 运用到网站上
    by zmn(匿名) on 2007/11/14 13:38:00
  • 回复: 发两个刚做的web part
    怎么没源码啊``给我发个好吗 <br> xhlvsxzj@163.com
    by `(匿名) on 2007/11/1 16:21:00

广告

 

判断网页蜘蛛最简单的一个办法就是设置一个时间段, 然后记录这个时间段内来自某个源的点击数, 再计算其点击频率, 如果点击频率很高, 则认为它是一个爬虫, 反之则是正常访问. 这种做法的缺陷在于:什么样的阈值才算是爬虫的标准呢? 10秒内点击12次, 还是5秒内点击6次? 而且, 对于那些一次性打开多个并发请求的爬虫类型来说(比如突然来个20并发请求的burst), 这个方法可以说是很有效, 但是对于那些周期性的请求爬虫来说(比如每隔1秒请求一个页面), 这种算法就完全失效了, 所以你网站上的信息还是在不知不觉中流失.

对于周期性请求的爬虫, 也有数学方法可以判断, 那就是将每次请求的间隔记录成数组X[ n ], 对这个数组求其方差, 如果方差很小, 那么就可以判断这是一个周期性请求的爬虫, 这又引出了最初的问题, 多大的方差阈值才是爬虫标准?

那么再进一步, 周期性是一种数字的定性规律, 而不是由方差可以定量衡量的. 因为爬虫访问服务器是有规律的, 即频繁且具有一定的周期性, 如果说正常的人类点击可以看成随机分布的话, 那么爬虫的访问数据模型则可以用近似均匀分布来描述. 所以我们可以对请求时间间隔数组X[ n ]求其数学期望e(其实就是均值), 构造另一个数组{Y[ i ] = sum(X[ i : n ]), (i = 0, 1, 2, 3...n)}, 即Y[ i ]为X[ 0 ]到X[ i ]的累加, 再对Y[ n ]和{Z[ i ] = e * i, (i = 0,1,2,3...n)}数组做一元线性回归分析, 对于爬虫来说, 由于X[ n ]接近均匀分布, 那么Z[ i ] = i * e将很有可能约等于Y[ i ], 也就是说Y[ n ]与Z[ n ]数组是线性相关的, 而对于人类点击来说, X[ n ]则更有可能近似于随机分布, 那么Y[ n ]与Z[ n ]则不应该具有线性相关的性质, 基于以上数学基础, 我们通过判断Y[ n ]与Z[ n ]数组是否线性相关, 就可以判断访问是否是爬虫的点击, 即如果得到的直线斜率越接近1 == tan(45'), 则说明其具有周期性规律, 反之则不然. 之所以将回归直线构造到斜率为一的附近, 是根据tan(x)函数的性质, 因为它在离靠近0'时增长缓慢, 而靠近90'时又增长过快, 都不利于性质判定.

下面是我根据上述方法对两个真实iis log记录进行分析的结果(各取300次点击记录, 单位为秒):

图一: ip为222.41.178.219的人类访问记录散点图, x轴为时间线, y轴为两次访问的timespan间隔

图二: 根据上述算法的到的散点图, x轴为Z[ n ]数组, y轴为Y[ n ]数组, 很明显, 他们不具有线性相关的关系

图三: baiduspider的爬虫访问记录散点图, x轴为时间线, y轴为两次访问的timespan间隔(貌似有点规律 :) )

图四: 根据上述算法的到的散点图, x轴为Z[ n ]数组, y轴为Y[ n ]数组, 很显然, 他们具有线性相关的关系

分析: 两组数据都为300次点击的记录, 单位为秒, 其中人类的访问具有一个很明显的特征, 就是会有许多同时的并发访问, 这是因为, 当人类的浏览器载入一个网页时, 它会同时请求这个网页上的所有图片, 脚本和多媒体, activeX插件文件等, 表现在[图一]中, 就是许多timespan都等于0. 而爬虫由于只需要爬网页内容, 所以他们并不需要访问网页上的图片, 而是遍历网页上的所有超链接来进一步爬整个网站! 从matlab画出来的图看, 我提出的这个线性回归分析算法看上去还是相当有效的说, ^_^

Crawler analysis第一阶段实验数据(实验数据, 包含两个真实的log文件, 感兴趣可以拿去玩玩!)

打印 | 张贴于 2007-05-14 15:22:00 | Tag:数据挖掘

留言反馈

#回复: 对判定网页爬虫算法的一点思考 编辑
X为间隔数组,那么Y就是相对于开始的时间么……
所以你这个意思就是点击时间和点击序号线性相关么……
假如加入随机化,我很怀疑这个是否成立……
2008-02-08 12:19:00 | [匿名:Henry]
#回复: 对判定网页爬虫算法的一点思考 编辑
是要过滤爬虫?看看HttpContext.Current.Request.UserAgent
一看就是没理论功底的民工
2007-10-15 17:25:00 | [匿名:haha]
#回复: 对判定网页爬虫算法的一点思考 编辑
是要过滤爬虫?看看HttpContext.Current.Request.UserAgent
2007-05-31 17:38:00 | [匿名:david fan]
#回复: 对判定网页爬虫算法的一点思考 编辑
非常有趣。
2007-05-30 22:16:00 | [匿名:picasa]
#回复: 对判定网页爬虫算法的一点思考 编辑
判定方法不错,不过在实际的使用中还需要增加一些其他的判定方法进行更精确的判定;实际的网络结构、无法预测的用户行为都会影响判定算法。
2007-05-24 10:15:00 | [匿名:Robert.ZDO]
#回复: 对判定网页爬虫算法的一点思考 编辑
全都是边缘蓝色, 中间白色得圈圈, 不过叠加得多了感觉看上去整个是蓝色的XD~~
2007-05-21 22:46:00 | [匿名:wma ]
#回复: 对判定网页爬虫算法的一点思考 编辑
我的意思是,大中型网站peak的时候,pageview超过10K/sec,你这个判定还怎么做呢?
2007-05-17 02:59:00 | [匿名:怡红公子]
#回复: 对判定网页爬虫算法的一点思考 编辑
用javascript可以过滤掉很多的爬虫。

嵌入javascript,往服务器回写访问记录。绝大部分爬虫都不管javascript。
2007-05-15 17:46:00 | [匿名:Jasper]
#回复: 对判定网页爬虫算法的一点思考 编辑
to sb:

有一类爬虫, 它们什么都爬, 还有一类爬虫, 它们专门爬图片和多媒体数据...它们的访问规律也可以看成是均匀分布的
2007-05-15 17:41:00 | [匿名:VincentChen]
#回复: 对判定网页爬虫算法的一点思考 编辑
判断是否在访问网页的同时访没访问图片就行了啊
2007-05-15 13:15:00 | [匿名:sb]
#回复: 对判定网页爬虫算法的一点思考 编辑
>>怡红公子

当然不是拿来实时判定嘛, 俺的意思是可以通过对iis log分析来找出哪些是疑似爬虫, 最终筛选并加入到阻止列表的动作还是要靠手工来完成:)
从模式识别角度来说, 光靠这一个特征(考虑其分布律)和这么两个小样本并不能说明这个手段在所有情况下都有效的, 所以我还会继续改进这个算法!
2007-05-15 10:54:00 | [匿名:VincentChen]
#回复: 对判定网页爬虫算法的一点思考 编辑
这个算法的时间复杂度太高了
不适用于大的站点
2007-05-15 04:22:00 | [匿名:怡红公子]
#回复: 对判定网页爬虫算法的一点思考 编辑
>> Some Cai BirD

Y[i]为X[n]数组中X[0]到X[i]的和, 如果是X[n]是均匀分布, 那么Z[i] = i * e则很有可能约等于Y[i], 然而现实情况是, 对于爬虫, X[n]接近均匀分布, 而对于人类点击X[n]则更有可能接近随机分布, 所以判断Y[n]与Z[n]数组是否线性相关就可以判断是否是爬虫的点击, 这正是我提出算法的数学基础 :)

ps: 你可能把Y[i]理解成X[n]整个数组之和了吧, 它显然和n* e是相等的!
2007-05-14 18:50:00 | [匿名:VincentChen]
#回复: 对判定网页爬虫算法的一点思考 编辑
>>

我的意思就是“均值*数量”不是就等于“和”么。。

那感觉斜率应该恒为1呀。。heh
2007-05-14 16:42:00 | [匿名:Some Cai BirD]
#回复: 对判定网页爬虫算法的一点思考 编辑
>>aspnetx

我觉得只要判断其相关性就行了, 因为爬虫的访问规律可以看成是均匀分布的, 频繁而具有一定的周期性, 而人类点击可以看成是随机分布吧
2007-05-14 16:36:00 | [匿名:VincentChen]
#回复: 对判定网页爬虫算法的一点思考 编辑
>>Some Cai BirD

数学期望是一种统计量, 其实就是均值:)

>> 加菲猫

全都是边缘蓝色, 中间白色得圈圈, 不过叠加得多了感觉看上去整个是蓝色的XD~~
2007-05-14 16:35:00 | [匿名:VincentChen]
#回复: 对判定网页爬虫算法的一点思考 编辑
没看懂什么意思。。

Y[i]=Sum(X[0]到X[i])?
Z[i]=(X[0]到X[i]的期望)*i?

对这些离散量数学期望不就是平均值么。。平均值*i != Sum ?
2007-05-14 16:28:00 | [匿名:Some Cai BirD]
#回复: 对判定网页爬虫算法的一点思考 编辑
蓝色圈圈和百色圈圈有什么区别?
2007-05-14 16:17:00 | [匿名:加菲猫]
#回复: 对判定网页爬虫算法的一点思考 编辑
用贝叶斯理论应该可以建立起一种有效的识别爬虫的机制吧
关键是有足够的历史数据来测试这个模型
2007-05-14 15:54:00 | [匿名:aspnetx]
博客主人设置本博客不允许匿名用户发表言论,请登录后再试

Powered by: Joycode.MVC引擎 0.5.2.0