`

web性能优化(三)反爬虫策略

阅读更多

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

 

   反爬虫策略,表面上看似乎跟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 -l   
2156293  
  
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/sh   
file=/home/songlin.lu/shell/log/forbid-ips-tmp.log   
myIps=/home/songlin.lu/shell/log/noforbid_ips.log   
today=`date +'%Y%m%d'`   
logForbidIp=/home/songlin.lu/shell/log/forbid-iptables-logs-$today.log   
netstatFile=/home/songlin.lu/shell/log/forbid-netstat-nat-tmp.log   
/bin/netstat -nat -n > $netstatFile   
nowDate=`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 > $file   
drop_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/sh   
today=`date +'%Y%m%d'`   
logReleaseIpLog=/home/songlin.lu/shell/log/release-iptables-log-$today.log   
iptables=/home/songlin.lu/shell/log/release-iptables-save-tmp.log   
tmpFile=/home/songlin.lu/shell/log/release-forbid-logs-tmp.log   
/sbin/iptables-save > $iptables   
drop_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 On   
LoadModule 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://dynamiclu.iteye.com/]

 

 

 

 

 

 

 

 

  • 大小: 32.7 KB
分享到:
评论

相关推荐

    基于python的反爬虫技术的研究源码数据库论文.docx

    Django是一个强大的Python Web框架,提供了一整套安全性和性能优化功能,适合用于开发反爬虫策略。通过Django,我们可以定制中间件(Middleware)来检测和阻止潜在的爬虫行为,例如,检查用户代理(User-Agent)以...

    python反爬虫技术的研究源码数据库演示.zip

    - 反爬虫策略:可能包含IP限制、User-Agent检测、验证码、滑动验证、请求频率控制、动态网页解析等。通过设置规则或使用第三方库如`django-middleware-ipban`,可以限制特定IP的访问次数。 - 验证机制:可以通过...

    网络爬虫在 Web 信息搜索与数据挖掘中应用

    - **反爬虫策略**:应对网站的反爬虫机制,确保爬虫的稳定运行。 ##### 3.3 性能分析 网络爬虫的性能主要受到以下几个因素的影响: - **抓取速度**:受网络带宽、服务器响应时间和爬虫程序的优化程度等因素的影响...

    Python编写网页爬虫优化版

    在实际爬取过程中,我们还需要考虑反爬虫策略。服务器可能会通过IP限制、User-Agent检查等方式防止爬虫。为此,可以使用随机延迟、更换User-Agent、使用代理IP池等方式降低被封禁的风险。 此外,良好的代码组织和...

    C# 网络爬虫-做了算法优化和连接优化

    8. **反爬虫策略**:理解常见的网站反爬机制,如验证码、User-Agent限制、IP封禁等,并采取相应对策,如更换User-Agent、使用代理IP等。 9. **代码组织与注释**:良好的代码结构和详尽的注释是任何项目的基础,这有...

    高性能网络爬虫研究

    4. **反爬虫策略应对**:针对网站的反爬虫机制采取有效的应对措施。 5. **分布式爬虫设计**:实现节点间的高效协作与负载均衡。 #### 四、结论 高性能网络爬虫的设计与实现是当今互联网领域研究的一个热点。通过对...

    基于node服务使用puppeteer进行页面抓取提供给爬虫进行seo优化.zip

    反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等...

    Python-Gain采用asynciouvloop和aiohttp编写的Web爬虫框架

    - 自定义中间件:用户可以编写自己的中间件来实现特定的功能,例如请求重试、反反爬虫策略等。 - 插件系统:通过插件化设计,用户可以轻松扩展框架功能,满足不同需求。 通过Gain,开发者可以更专注于编写爬虫逻辑...

    一种新型网络爬虫设计(A new web crawler’s design)

    接着,文章可能会提到反爬虫策略和IP代理。随着网站对爬虫的防御意识增强,反爬虫技术也随之发展,如验证码、IP限制、User-Agent检测等。为应对这些挑战,新型爬虫可能采用更加智能的识别和处理机制,例如使用机器...

    web爬虫WebMagic-0.7.3源代码及示例

    WebMagic是一个开源的Java实现的...同时,也可以了解到如何处理反爬虫策略、处理JavaScript渲染的页面以及优化爬虫性能等方面的知识。对于想要学习和实践网络爬虫技术的开发者来说,WebMagic-0.7.3是一个很好的起点。

    网络爬虫技术探究.doc

    网络爬虫技术是计算机科学领域的一个重要分支,它主要用于自动化地收集和处理互联网上的大量信息。网络爬虫,也被称为Web蜘蛛或网络...关键词:网络爬虫,广度优先,搜索引擎,URL管理,网页解析,数据存储,反爬虫策略

    keywords_爬虫_pythonweb_

    Python网络爬虫是一种用于自动化获取网页数据的技术,它在信息技术领域扮演着重要角色,尤其是在大数据分析、搜索引擎优化和网站监控等方面。Python之所以成为爬虫开发的首选语言,得益于其丰富的库支持和简洁易读的...

    真情奉献Java写的Web爬虫

    4. **爬虫策略**: - **深度优先搜索(DFS)**:沿着链接一直深入到某个深度,然后再回溯。 - **广度优先搜索(BFS)**:先抓取当前页面所有链接的目标页面,再扩展到下一层。 5. **网页动态加载与Ajax处理**: - ...

    基于PHP的PT php小说搜索爬虫优化程序.zip

    【标题】"基于PHP的PT php小说...总之,这个基于PHP的PT小说搜索爬虫项目是一个综合性的Web开发实践,涵盖了网络请求、网页解析、数据处理、爬虫策略等多个方面,对提升PHP开发者在Web爬虫领域的技能有很好的学习价值。

    网络爬虫论文资料

    10. **学术研究**:压缩包中的论文资料可能涵盖了爬虫算法优化、反反爬策略研究、爬虫性能评估、数据质量保证等方面,对于深入理解网络爬虫的理论和实践具有重要价值。 这些只是网络爬虫领域的一部分核心概念和知识...

    爬虫工程源代码.zip

    - **爬虫框架(Web Crawling Frameworks)**:如Scrapy、PySpider等,提供了一套完整的解决方案,简化了爬虫的开发流程。 通过这个"爬虫工程源代码.zip",你将有机会学习到一个实际爬虫项目是如何运作的,了解每个...

    Python 网络爬虫(Web Crawlers)学习笔记。.zip

    - **反爬虫策略**:识别并应对网站的反爬虫技术,如User-Agent伪装、IP代理、延时请求等。 4. **高级话题** - **爬虫分布式**:使用Scrapy框架实现分布式爬虫,提高爬取效率。 - **爬虫伦理**:遵循robots.txt...

    自己动手写网络爬虫

    - **反爬虫策略**:网站通常会采取限制IP访问频率、验证码等方式防止爬虫。应对策略包括使用代理IP池、模拟真实用户行为等。 - **数据清洗**:爬取的数据可能存在格式不一致、缺失值等问题。需要通过正则表达式、...

    爬虫脚本项目源码-搜索引擎

    Python爬虫脚本将实现这一功能,可能包括URL管理、请求头设置、错误处理和反爬虫策略等。数据预处理涉及清洗抓取到的数据,例如去除HTML标签、标准化文本等。索引构建则是将预处理后的数据转化为可快速检索的结构,...

    ssh爬虫搜索工程

    在"ssh爬虫搜索工程"中,Elog4j可能被用来记录爬虫的抓取进度、错误信息、性能统计等,便于开发者追踪问题和优化程序。 【SSHWeb】 SSHWeb可能指的是整个基于SSH框架的Web应用程序,包括所有相关的源代码、配置文件...

Global site tag (gtag.js) - Google Analytics