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

news/2024/5/10 9:19:38/文章来源:https://blog.csdn.net/weixin_34004750/article/details/92428939

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

你的网站内容很有价值,希望被google,百度等正规搜索引擎爬虫收录,却不想让那些无节操的山寨爬虫把你的数据扒走坐享其成。本文将探讨如何在网站中加入优雅的反爬虫策略。

【思路】

反爬虫策略要考虑以下几点:

  1. 能被google、百度等正规搜索引擎爬虫抓取,不限流量和并发数;

  2. 阻止山寨爬虫的抓取;

  3. 反爬虫策略应该是实时检测的,而不是通过一段时间后的访问统计分析得出;

  4. 误判后的人性化处理(优雅之所在);


大部分的爬虫不是以浏览器方式来访问页面的,爬虫只下载网页的html源代码,不加载包含在页面中的js/css/图片,这是区分爬虫与否的一个关键。一个请求被识别出来不是浏览器访问,一定是爬虫,为了满足上面所说的第1点和第2点,进一步对http头agent进行验证,是否标记为google、百度的spider,严格一点的话应该判别来源IP是否为google、baidu的爬虫IP,这些IP在网上都可以找到。校验出来IP不在白名单就可以阻止访问内容。

当然,有一部分爬虫是以浏览器载入的方式来抓取内容的,所以,即使被识别出来是浏览器访问的来源ip。还要检测这个个ip在一个时间片内的并发数,超过一定阀值,可以认为是爬虫,阻止访问内容。

由于我们的反爬虫策略是基于IP的,会出现误判,尤其是并发量限制的判别。我们需要一种友好的方式来阻止访问。直接返回50x/40x空白或者错误页面是很粗鲁的,当真正的用户被误判阻止访问时能够手动解锁继续访问才是比较优雅的方式,大家不约而同的会想到验证码,对!让用户输入图形中的验证码解锁,可是我们平常见到的验证码都还是野蛮的,验证码技术从一开始的简单的数字,发展今天有输入汉字的、输入数学计算结果的等等五花八门,不仅以复杂的验证码刁难用户,还要加上各种干扰字符,美其名曰提高安全性,实际上是开发工程师脑残扎堆钻牛角尖的产物,用户是怨声载道。验证码的目的是区分人工和机器,要做到机器无法自动操作,同时让人工操作很方便、优雅。在本文的案例中,我们采用了一种比较有趣的验证码,让人识别物体,在验证码系统中预存了大量的事物,包括动物、植物、家具等等日常遇到的东西,验证用户的过程就是系统从这些事物中随机选出少量图形,并要求用户选中预设答案中的某一个即可解锁。

回到识别爬虫的步骤,我们用流程图理一下:

172704_zEIA_150221.png


【实现】

我们用nodejs(express)和redis来实现反爬虫系统,redis用来存放一些计数。

1、判别是否为浏览器访问

返回页面请求时,在redis中给该IP的页面访问计数+1。在每个页面中会引入一个js,当请求这个js文件时在redis中给该IP页面访问计数-1,这样,如果不是浏览器的请求,redis中的页面计数会不断增大,如果是浏览器请求,下载页面源代码时增1,随后浏览器加载js文件时减1,redis中的页面计数会归零。我们只需要判断页面计数是否为0来区分是否为浏览器访问,我们还可以给页面下载完了但是js没有加载这种特殊情况留点余地,设定一个阀值,例如:5,页面计数大于5就判别出该IP内有爬虫访问。

2、爬虫白名单识别

如果上一步被识别为爬虫访问,则进一步检测用户http头的user-agent、ip,判断是否在预设的白名单内。如果不在则阻止访问显示验证码。这个步骤很简单,不用多说。

3、浏览器访问下的并发量限制

同样在 redis下给每个IP做计数,和上面不同的是利用redis key的过期机制,每次计数累加时将key设定在一定的时间内过期,比如5秒,这个相当于一个时间片,如果5秒内有另外一个请求,会计数增加1,过期时间会延长5秒,如果在一个5秒内没有其他请求,这个key就会消失。此后一个请求进来计数从1开始。我们可以设定一个阀值,比如20,任意5秒内有20个请求进来为超限,阻止访问显示验证码。

4、优雅的验证码

系统预设了很多图片,每个图片是一个动物、植物、家具等,每个图片有一个ID值。从这些图片中任意抽出3个,并且选中其中一个为标准答案,注意这个过程都是程序后台进行,将标准答案ID放在session中。前台页面显示了这3幅图片,并根据预设的答案要求用户选择其中一个,用户只要选中对应的图片,将表单提交到后台,系统将提交的ID与session中ID比较判别是否正确。当然,每个图片都有一个固定的ID值有被穷举的漏洞,有很多改进的余地,此处仅讨论原型不做过多探讨。

效果如图:

180756_fRg1_150221.png


好了,接下来我会贴出一些实现的代码,如果你想看看实现后的效果,可以访问碰头吧(http://www.pengtouba.com/)试验一下,首页没有加反爬虫策略。打开微信广场http://www.pengtouba.com/weixin/cast-c1p1s1.html 然后用F5强暴刷新你就会看到效果了。


【代码】

拦截请求(其他语言类似,例如java可以用拦截器)

app.get('/weixin/*', antiCrawler.openDoor);//需要保护的目录
app.get('/helper/close-door.js', antiCrawler.closeDoor); //伪js文件


antiCrawler.js

/*** anti crawler* Created by Cherokee on 14-7-13.*/
var settings = require("../settings.json");
var redis = require("redis");
var cache = require("../lib/cache.js");
var vcode = require('../lib/vcode.js');
var ac_redis_cli = redis.createClient(settings['anti_crawler_redis_db']['port'],settings['anti_crawler_redis_db']['host']);
var IP_RECORD_EXPIRE = settings['anti_crawler_redis_db']['ip_record_expire'];
var IP_LOCK_EXPIRE = settings['anti_crawler_redis_db']['ip_lock_expire'];
var IP_HAIR_EXPIRE = settings['anti_crawler_redis_db']['ip_hair_expire'];
var DOOR_THRESHOLD = settings['anti_crawler_redis_db']['door_threshold'];
var HAIR_THRESHOLD = settings['anti_crawler_redis_db']['hair_threshold'];ac_redis_cli.on('ready',function(){console.log('redis for anti-crawler is ready');
});ac_redis_cli.on('error',function(err){console.error('redis for anti-crawler error'+err);
});ac_redis_cli.on('end',function(){console.error('redis for anti-crawler closed');
});ac_redis_cli.select(settings['anti_crawler_redis_db']['db'],function(err){if(err)throw err;else {cache.set('ac_redis_cli',ac_redis_cli,77760000);console.log('redis for anti-crawler switch db :'+settings['anti_crawler_redis_db']['db']);}
});exports.openDoor = function(req, res, next) {var ua = req.get('User-Agent');var ip = req.ip;var url = req.url;if(/\/weixin\//.test(url)){ac_redis_cli.exists('lock:'+ip,function(err,bol){if(bol){send421(req,res);}else{ac_redis_cli.get('door:'+ip,function(err,d_num){if(d_num>DOOR_THRESHOLD){//some one didn't use browserif(isTrustSpider(ua,ip)){//it's trusted spiderkickDoor(ip,function(val){leaveHair(ip,function(val){next();});});}else{blockIt(req,res);}}else{//perhaps using simulated browser to crawl pagesac_redis_cli.get('hair:'+ip,function(err,h_num){if(h_num>HAIR_THRESHOLD){//suspiciousblockIt(req,res);}else {kickDoor(ip,function(val){leaveHair(ip,function(val){next();});});}});}});}});}
};exports.closeDoor = function(req,res){ac_redis_cli.multi().decr('door:'+req.ip).expire('door:'+req.ip,IP_RECORD_EXPIRE).exec(function(err, replies){if(replies&&parseInt(replies[0])<0){ac_redis_cli.set('door:'+req.ip,0,function(err){res.set('Content-Type', 'application/x-javascript');res.send(200,'{"zeroize":true}');});}else{res.set('Content-Type', 'application/x-javascript');res.send(200,'{"zeroize":false}');}});
}exports.verify = function(req,res){var vcode = req.body.vcode;var origin_url = req.body.origin_url;if(req.session.vcode&&vcode==req.session.vcode){req.session.vcode = null;ac_redis_cli.multi().del('lock:'+req.ip).del('door:'+req.ip).del('hair:'+req.ip).exec(function(err, replies){res.redirect(origin_url);});}else send421(req,res,origin_url);}var blockIt = function(req,res){ac_redis_cli.multi().set('lock:'+req.ip,1).expire('lock:'+req.ip,IP_LOCK_EXPIRE).exec(function(err, replies){send421(req,res);});
}var send421 = function(req,res,origin_url){var code_map = {};var code_arr = [];while(code_arr.length<3){var rindex = Math.ceil(Math.random() * vcode.list.length) - 1;if(!code_map[rindex]){code_map[rindex] = true;code_arr.push(rindex);}}var answer = code_arr[Math.ceil(Math.random() * 3) - 1];req.session.vcode = answer;res.status(421).render('weixin/421',{'code_list':code_arr,'code_label':vcode.list[answer],'origin_url':origin_url||req.url});
}var isTrustSpider = function(ua,ip){var trustBots  = [/Baiduspider/ig,/Googlebot/ig,/Slurp/ig,/Yahoo/ig,/iaskspider/ig,/Sogou/ig,/YodaoBot/ig,/msnbot/ig,/360Spider/ig];for(var i=0;i<trustBots.length;i++){if(trustBots[i].test(ua))return true;}return false;
}var kickDoor = function(ip,callback){ac_redis_cli.multi().incr('door:'+ip).expire('door:'+ip,IP_RECORD_EXPIRE).exec(function(err, replies){if(callback)callback(replies?replies[0]:null);});
}var leaveHair = function(ip,callback){ac_redis_cli.multi().incr('hair:'+ip).expire('hair:'+ip,IP_HAIR_EXPIRE).exec(function(err, replies){if(callback)callback(replies?replies[0]:null);});
}

实际应用中不仅要检测User-agent,还要有IP白名单检测,以上代码并没有包含 IP白名单。

send421函数就是显示验证码的步骤,verify函数是检验用户输入的验证码。


转载于:https://my.oschina.net/waterbear/blog/304870

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_728694.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

特大型网站技术架构脑图

为什么80%的码农都做不了架构师&#xff1f;>>> 转载于:https://my.oschina.net/dyxp/blog/348841

git 提及 修改_提及好友的网站是否有害?

git 提及 修改Heres an interesting problem I think Im faced with. A buddy of mine who owns a fantastic Ethiopian Restaurant here in Portland, OR is having a Jazz Dinner event. I was going to post a note about it in my blog, but then I realized, that if I …

基于centos 7搭建Nginx网站服务器(包含虚拟web主机的配置)

一 、Nginx服务基础 Nginx (engine x)专为性能优化而开发&#xff0c;其特点是占有内存少&#xff0c;它的稳定性和低系统资源消耗&#xff0c;以及对并发连接的高处理能力&#xff0c;&#xff08;单台物理服务器可支持5000个并发请求&#xff09;。事实上nginx的并发能力确实…

如何快速开发网站?

开发网站 &#xff0c;一般是如下过程&#xff1a; 找美工画图进行图片切分开发人员添加内容 现在还用JSP来做网页&#xff0c;当然属于...那啥的事情。 今天看看不一样的体验&#xff0c;稍有HTML基础&#xff0c;马上就可以照葫芦画瓢了。 第一步&#xff1a;找美工画图&…

互联网大型网站架构演变——上

每天十五分钟&#xff0c;熟读一个技术点&#xff0c;水滴石穿&#xff0c;一切只为渴望更优秀的你&#xff01; ————零声学院 架构演变第一步&#xff1a;物理分离 webserver 和数据库 最开始&#xff0c;由于某些想法&#xff0c;于是在互联网上搭建了一个网站&#xf…

网站seo优化需要注意的关键要点

网站的优化推广是一项需要长期作战的工作&#xff0c;一个网站的优化效果不是一两天就能有成效&#xff1b;一个优秀的seo大神也不是一朝半夕就能练成的。不管是网站的优化效果&#xff0c;还是想要成为一名优秀的SEOer&#xff0c;都是需要一个过程的。网站优化你需要知道的是…

前端技术资讯网站

欢迎来到前端的世界&#xff0c;让我们一起在活跃的前端社区中自由学习吧&#xff01;1.HOW TO KEEP UP TO DATE ON FRONT-END TECHNOLOGIES - 如何跟上前端开发技术的最新前沿 好资源&#xff0c;共勉&#xff01;2.Github 从实际项目中学习&#xff01;3.Stack Overflow 著名…

好奇心日报网站和App停更3个月

【TechWeb】5月28日&#xff0c;好奇心日报官方微博发布消息称&#xff0c;网站和App自2019年5月28日零时起停止更新3个月。 去年8月&#xff0c;好奇心日报也曾停更所有网络传播平台&#xff0c;进行全面彻底整改。 以下为好奇心日报声明内容&#xff1a; 好奇心日报的网站和A…

attn_matrix_ATTN波特兰人-先驱法院广场推出了新网站

attn_matrixHey Portland folks, Pioneer Courthouse Square - Portlands Living Room - launched their new site today. 嗨&#xff0c;波特兰人&#xff0c;先锋法院广场-波特兰的客厅-今天启动了他们的新网站。 I did their BrickFinder application in C# and VB.NET a wh…

单机至亿级流量大型网站系统架构的演进过程

阶段一、单机构建网站 网站的初期&#xff0c;我们经常会在单机上跑我们所有的程序和软件。此时我们使用一个容器&#xff0c;如tomcat、jetty、jboos&#xff0c;然后直接使用JSP/servlet技术&#xff0c;或者使用一些开源的框架如mavenspringstructhibernate、mavenspringspr…

防止恶意解析——禁止通过IP直接访问网站

一、什么是恶意解析一般情况下&#xff0c;要使域名能访问到网站需要两步&#xff0c;第一步&#xff0c;将域名解析到网站所在的主机&#xff0c;第二步&#xff0c;在web服务器中将域名与相应的网站绑定。但是&#xff0c;如果通过主机IP能直接访问某网站&#xff0c;那么把域…

沿用Python+Flask+Mysql的web建设技术开发网站

1 系统概要说明 1.1开发目的 如今音乐已经成为人们尤其是年轻人的日常必备。走路&#xff0c;坐车&#xff0c;逛街&#xff0c;我们都能看到戴着耳机听音乐的人。古风曲、日韩风、欧美风、hippop等等各种音乐风格多样。随着媒体的发展&#xff0c;微博微信公众号媒体采访等等的…

逻辑漏洞-客户端验证的邮箱-Web渗透实例之中国教育部青少年普法网站逻辑漏洞...

转载自&#xff1a;http://www.zmnhssn.com/?post61 漏洞地址&#xff1a;https://user.qspfw.com 用户登陆界面 具体漏洞地址: 用户密码找回界面&#xff1a;https://user.qspfw.com/page/user/findpwd/forget_pwd.do 这里可以确认网站有没有这个用户&#xff0c;这个用户…

JavaWeb网站性能优化的相关技术

2019独角兽企业重金招聘Python工程师标准>>> 一、提高服务器并发处理能力 我们总是希望一台服务器在单位时间内能处理的请求越多越好&#xff0c;这也成了web服务器的能力高低的关键所在。服务器之所以可以同时处理多个请求&#xff0c;在于操作系统通过多执行流体系…

(转)3款优秀的移动webAPP网站在线测试工具

原文&#xff1a;原文地址 目前适配各个终端的需求越来越强烈呢&#xff1f;比如我们APP项目上线之后&#xff0c;需要一个宣传推广专题页&#xff0c;这个页面当然最好是采取响应式布局来完成。因为需要来推广和下载我们的APP。 无论用户是电脑打开&#xff0c;还是移动端打开…

vs2017 asp.net 网站发布问题 (发布路径下含源码文件)

使用vs2010版本&#xff0c;网站发布后会自动将源码发不为.dll程序集&#xff0c;但vs2017需要进行设置&#xff0c;其他版本没有试过。 vs2017网站发布&#xff1a; 1. 2. 这里给一个你想用的名字&#xff0c;之后它会出现在你的程序文件&#xff08;不是发布路径&#xff09;…

小程序https请求,http网站升到https

最近开发小程序&#xff0c;因为以前只写过小程序的前端没注意接口&#xff0c;现在才发现原来所有的接口都必须使用https协议了&#xff0c;马上研究了一波&#xff0c;顺便也想给自己的博客升成https的。 申请免费证书 哈哈没办法就是喜欢免费的。。。真是煞费苦心找了很久。…

dd 0x7ffe0000_当您尝试启动网站时出现“意外的错误0x8ffe2740”错误信息

dd 0x7ffe0000Mental note: Skype will grab port 80 if it starts up before the IIS Web Server leading me to "Unexpected Error 0x8ffe2740 Occurred." 精神注意&#xff1a;如果在IIS Web服务器引导我出现“意外错误0x8ffe2740发生”之前启动&#xff0c; Skyp…

中小型网站架构分析及优化

先看网站架构图&#xff1a; 以上网站架构广泛运用中大型网站中&#xff0c;本文从架构每一层分析所用主流技术和解决手段&#xff0c;有助于初入网站运维朋友们&#xff0c;进一步对网站架构认识&#xff0c;从而自己形成一套架构概念。 第一层&#xff1a;CDN 国内网络分布主…

网站流量日志数据自定义采集

分布式集群爬虫小架构 离线hadoop分析数据整体流转图 网站流量日志数据自定义采集 网站流量日志数据自定义采集 1、系统的意义 网站流量数据统计分析&#xff0c;可以帮助网站管理员、运营人员、推广人员等获取网站流量信息&#xff0c;并从流量来源、网站内容、网站访客特性等…