网站反爬虫策略

反爬虫策略,表面上看似乎跟WEB系统优化没有关系,经过分析,发现该策略是可以归到WEB性能优化的系列之中。

通过分析apache日志发现,某系统40%的带宽和服务器资源都消耗在爬虫上,如果除去10%-15%搜索引擎的爬虫,做好反爬虫策略,能节省20%-25%的资源,其实是变向优化了web系统。

一、爬虫请求与正常用户请求的区别

爬虫请求是类似httpClient的机制或curl,wget的命令,用户请求一般走浏览器。

区别:爬虫请求一般不会执行页面里的异步JavaScript操作,而用户请求则执行Jquery提供的异步JavaScript操作,具体如下:

<script type="text/javascript">$(document).ready(function(){        alertFunTest();}function alertFunTest() {    alert(“异步”);}</script >

代码alert(“异步”)一般不会被爬虫请求执行。

二、分析系统有多少爬虫行为

  某系统某天的日志分析如下:

cat access20110421.log | wc -l2156293

cat  page_access20110421.log | sort | uniq -c | sort -nr | head -n20 441421 /读帖页          20.4% 374274 /弹出框          17.3% 266984 /帖子点击数        12.3% 213522 /读取支持数和反支持数        9.9% 207269 /其它                 9.6% 203567 /帖子列表页        9.4% 185138 /刷新功能           8.5% 164884 /帖子列表点击      7.6%

如上所示,帖子点击数请求是不会被爬虫执行的。

(读帖页数-帖子点击数)/ 读帖页数=爬虫执行读帖页次数的比例

(441421 - 266984 )/ 441421=39.6%

结论:近40% 帖子的读取操作是爬虫行为,读帖占系统85%以上的操作,也就是说近1/3以上的网络和服务器资源在为爬虫服务。

三、请求在不同层面对应的反抓策略

(一)防火墙层面

通过netstat80端口的tcp连接量判断IP是否非法。

WEB系统都是走http协议跟WEB容器连通的,每次请求至少会产生一次客户端与服务器的tcp连接。通过netstat命令,就可以查看到当前同时连接服务器所对应的IP以及连接量。

命令  /bin/netstat -nat -n | grep 80   一般都几百或几千个。

同一个IP对应的连接数超过我们观察到的一个阀值时,就可判断为非正常的用户请求。阀值设定至关重要,大型网吧或同一个学校、公司出来的IP也可能会被误判为非法请求。

此策略我写了两个定时脚本去,一个定时封IP( tcpForbidCmd.sh ),一个定时释放IP ( tcpReleaseCmd.sh ),分别是每隔5分钟和40分钟各执行一次

tcpForbidCmd.sh参考代码如下:

#!/bin/shfile=/home/songlin.lu/shell/log/forbid-ips-tmp.logmyIps=/home/songlin.lu/shell/log/noforbid_ips.logtoday=`date +‘%Y%m%d‘`logForbidIp=/home/songlin.lu/shell/log/forbid-iptables-logs-$today.lognetstatFile=/home/songlin.lu/shell/log/forbid-netstat-nat-tmp.log/bin/netstat -nat -n > $netstatFilenowDate=`date +‘%Y-%m-%d %H:%M‘`/bin/awk -F: ‘/tcp/{a[$(NF-1)]++}END{for(i in a)if(a[i]>90)print i}‘ $netstatFile > $filedrop_ip=`cat $file |awk ‘{print $2}‘`for iptables_ip in $drop_ip do  if [ $iptables_ip != $0 ] && [ -z "` iptables -L -n | grep DROP | awk ‘{print$4}‘|grep $iptables_ip`" ] && [ -z "` cat $myIps |grep $iptables_ip`"];then   /sbin/iptables -A INPUT -s $iptables_ip -p tcp --dport 80 -j DROP    echo $iptables_ip >> /home/songlin.lu/shell/log/release-forbid-logs-tmp.log   echo ‘--------------------‘$nowDate‘----‘$iptables_ip >> $logForbidIp  fi done

文件/home/songlin.lu/shell/log/noforbid_ips.log为白名单列表

tcpReleaseCmd.sh参考代码如下:

#!/bin/shtoday=`date +‘%Y%m%d‘`logReleaseIpLog=/home/songlin.lu/shell/log/release-iptables-log-$today.logiptables=/home/songlin.lu/shell/log/release-iptables-save-tmp.logtmpFile=/home/songlin.lu/shell/log/release-forbid-logs-tmp.log/sbin/iptables-save > $iptablesdrop_ips=`cat $tmpFile`nowDate=`date +‘%Y-%m-%d %H:%M‘`for iptables_ip1 in $drop_ips do  if [ ! -z "`cat $iptables |awk /DROP/‘{print $4}‘ | grep $iptables_ip1`" ]  then   /sbin/iptables -D INPUT -s $iptables_ip1 -p tcp --dport 80 -j DROP   echo ‘--------------------‘$nowDate‘----‘$iptables_ip1 >> $logReleaseIpLog  fi done> $tmpFile

此策略相当于给我们的系统设定了门槛,类似公路交通系统内,某马路设定限高4米栏杆,高于4米的车不能在此通行。该策略能预防恶意的或新手写的请求频率不规则的爬虫。

(二)WEB服务器容器层面

a.User-Agent判断      b. connlimit模块判断

每个爬虫会声明自己的User-Agent信息,我们可以通过判断爬虫的User-Agent信息来识别,具体查看相关文档

Apache作connlimit需要mod_limitipconn来实现,一般需要手动编译。

  编辑httpd.conf文件,添加如下配置

ExtendedStatus OnLoadModule limitipconn_module modules/mod_limitipconn.so< IfModule mod_limitipconn.c >   < Location / >   # 所有虚拟主机的/目录          MaxConnPerIP  20     # 每IP只允许20个并发连接          NoIPLimit image/*  # 对图片不做IP限制    < /Location>  < /IfModule>

Nginx作connlimit,限制ip并发数,比较简单

添加limit_conn  这个变量可以在http, server, location使用  如:limit_conn   one  10;

(三)日志层面

  通过日志和网站流量分析识别爬虫

用awstats分析服务器日志,用流量统计工具,如Google Analytics来统计IP对应的流量记录,流量统计在网页里面嵌入一段js代码。把统计结果和流量统计系统记录的IP地址进行对比,排除真实用户访问IP,再排除我们希望放行的网页爬虫,比如Google,百度,youdao爬虫等。最后的分析结果就得到爬虫的IP地址。

(四)程序层面

时时反爬虫过滤机制

实现起来也比较简单,我们可以用memcached或本地内存来做访问计数器,在缓存过期之前的时间段内(如3分钟),每个IP访问一次,计数器加1,缓存的KEY包括IP,通过计数器得到的值,判断超过一个阀值,这个IP很可能有问题,那么就可以返回一个验证码页面,要求用户填写验证码。如果是爬虫的话,当然不可能填写验证码,就被拒掉了,保护了后端的资源。

阀值的设定也是很重要的,不同的系统不一样。

我们将这个过滤机制改进一下,将更加准确。 即我们在网页的最下面添加一个JS的异步请求,此异步请求用来减计数器的值,进页面时对IP进行加值,出页面时减值,生成一个差值。 根据我们之前的分析,爬虫不会执行异步JS减值请求。 这样可以从生成的值的大小上判断这个IP是否为爬虫。

程序逻辑如下图所示:

[文章作者:狂奔的鹿(陆松林)本文版本:v1.0  转载请注明原文链接:http://www.cnblogs.com/dynamiclu/]

时间: 2024-08-03 20:59:13

网站反爬虫策略的相关文章

python解决网站的反爬虫策略

网站的反爬虫策略: 从功能上来讲,爬虫一般分为数据采集,处理,储存三个部分.这里我们只讨论数据采集部分. 一般网站从三个方面反爬虫:用户请求的Headers,用户行为,网站目录和数据加载方式.前两种比较容易遇到,大多数网站都从这些角度来反爬虫.第三种一些应用ajax的网站会采用,这样增大了爬取的难度(防止静态爬虫使用ajax技术动态加载页面). 1.从用户请求的Headers反爬虫是最常见的反爬虫策略. 伪装header.很多网站都会对Headers的User-Agent进行检测,还有一部分网站

反击“猫眼电影”网站的反爬虫策略

0×01 前言 前两天在百家号上看到一篇名为<反击爬虫,前端工程师的脑洞可以有多大?>的文章,文章从多方面结合实际情况列举了包括猫眼电影.美团.去哪儿等大型电商网站的反爬虫机制.的确,如文章所说,对于一张网页,我们往往希望它是结构良好,内容清晰的,这样搜索引擎才能准确地认知它:而反过来,又有一些情景,我们不希望内容能被轻易获取,比方说电商网站的交易额,高等学校网站的题目等.因为这些内容,往往是一个产品的生命线,必须做到有效地保护.这就是爬虫与反爬虫这一话题的由来.本文就以做的较好的"

给网站加入优雅的实时反爬虫策略

你的网站内容很有价值,希望被google,百度等正规搜索引擎爬虫收录,却不想让那些无节操的山寨爬虫把你的数据扒走坐享其成.本文将探讨如何在网站中加入优雅的反爬虫策略. [思路] 反爬虫策略要考虑以下几点: 能被google.百度等正规搜索引擎爬虫抓取,不限流量和并发数: 阻止山寨爬虫的抓取: 反爬虫策略应该是实时检测的,而不是通过一段时间后的访问统计分析得出: 误判后的人性化处理(优雅之所在): 大部分的爬虫不是以浏览器方式来访问页面的,爬虫只下载网页的html源代码,不加载包含在页面中的js/

如何给网站加入优雅的反爬虫策略

你的网站内容很有价值,希望被google,百度等正规搜索引擎爬虫收录,却不想让那些无节操的山寨爬虫把你的数据扒走坐享其成.本文将探讨如何在网站中加入优雅的反爬虫策略. [思路] 反爬虫策略要考虑以下几点: 能被google.百度等正规搜索引擎爬虫抓取,不限流量和并发数: 阻止山寨爬虫的抓取: 反爬虫策略应该是实时检测的,而不是通过一段时间后的访问统计分析得出: 误判后的人性化处理(优雅之所在): 大部分的爬虫不是以浏览器方式来访问页面的,爬虫只下载网页的html源代码,不加载包含在页面中的js/

互联网网站的反爬虫策略浅析

因为搜索引擎的流行,网络爬虫已经成了很普及网络技术,除了专门做搜索的Google,Yahoo,微软,百度以外,几乎每个大型门户网站都有自己的搜索引擎,大大小小叫得出来名字得就几十种,还有各种不知名的几千几万种,对于一个内容型驱动的网站来说,受到网络爬虫的光顾是不可避免的. 一些智能的搜索引擎爬虫的爬取频率比较合理,对网站资源消耗比较少,但是很多糟糕的网络爬虫,对网页爬取能力很差,经常并发几十上百个请求循环重复抓取,这种爬虫对中小型网站往往是毁灭性打击,特别是一些缺乏爬虫编写经验的程序员写出来的爬

网站反爬虫

因为搜索引擎的流行,网络爬虫已经成了很普及网络技术,除了专门做搜索的Google,Yahoo,微软,百度以外,几乎每个大型门户网站都有自己的搜索引擎,大大小小叫得出来名字得就几十种,还有各种不知名的几千几万种,对于一个内容型驱动的网站来说,受到网络爬虫的光顾是不可避免的. 一些智能的搜索引擎爬虫的爬取频率比较合理,对网站资源消耗比较少,但是很多糟糕的网络爬虫,对网页爬取能力很差,经常并发几十上百个请求循环重复抓取,这种爬虫对中小型网站往往是毁灭性打击,特别是一些缺乏爬虫编写经验的程序员写出来的爬

网站反扒策略解决方案

爬虫技术天天在进步,反爬虫技术也不甘落后,谁落后谁就要挨打.很多时候,我们在网站的采集过程中,爬着爬着就发现,才爬一会就被针对了,然后只好升级反反爬策略,然而还是非常容易被识破.那么问题出在哪里呢?哪怕针对各种反爬策略都作出了相对应的反反爬策略,哪怕各方面已经做的够好了,但问题依旧.那么问题可能出现在代理IP的身上.也许你用的不是高匿代理IP,也许你用的不是优质代理,也许你用的不是独享IP池.我们知道,当使用普匿代理或者透明代理访问网站时,会暴露给目标网站知道你在使用代理IP访问,那么相对应的就

关于反爬虫策略

一.为什么要反爬虫 1.爬虫占总PV比例较高,这样浪费钱(尤其是三月份爬虫). 三月份爬虫是个什么概念呢?每年的三月份我们会迎接一次爬虫高峰期. 最初我们百思不得其解.直到有一次,四月份的时候,我们删除了一个url,然后有个爬虫不断的爬取url,导致大量报错,测试开始找我们麻烦.我们只好特意为这个爬虫发布了一次站点,把删除的url又恢复回去了. 但是当时我们的一个组员表示很不服,说,我们不能干掉爬虫,也就罢了,还要专门为它发布,这实在是太没面子了.于是出了个主意,说:url可以上,但是,绝对不给

解决猫眼网反爬虫策略的爬虫

项目代码:Github [目录] 一.引入问题 二.分步实现 1.页面爬取 2.woff下载 3.字体解析规则 一.引入问题 可以看到,猫眼网电影评分,票房等的数据在响应的html中并不是直接提供给你的.这里的xefcf,xef87等数据,是以'特殊符号'的形式显示出来的. 可以发现这里请求了一个woff字体文件,而xefcf,xef87等数据的规则就是在这其中的.所以我们只需要在请求这个网页的同时,截去这部分style,然后获得woff地址,将它下载到本地,进行解析,就可以实现对评分的解密了.