作为使用python编译框架的一名后端开发人员,总不能让自己的网站数据被同行给轻易的给爬取然后让他们潇洒的扬长而去吧。下面,我就给大家介绍一下在Python的后端开发中我们能使用的一些反爬的策略。
一丶初级阶段(利用第三方提供给我们的工具)
如果你用的是Django这个重量级框架的话,Django已经为你造好了轮子,我们可以利用它的中间件来写一个拦截器。
这里使用了HTTP的UserAgent字段来判断,可能有些爬虫修改了自身的UserAgent的参数来欺骗服务器,这种情况无法拦截。
中间件的具体实现:
from django.http.response import HttpResponseNotFound
try:
from django.utils.deprecation import MiddlewareMixin # Django 1.10.x
except ImportError:
MiddlewareMixin = object # Django 1.4.x - Django 1.9.x
class SimpleMiddleware(MiddlewareMixin):
def process_request(self, request):
http_user_agent = request.META.get('HTTP_USER_AGENT')
# remote_addr = request.META.get('REMOTE_ADDR')
http_user_agent = str(http_user_agent).lower()
if "py" in http_user_agent or "ssl" in http_user_agent:
return HttpResponseNotFound(content="<h1>Not Found</h1><p>The requested URL " request.path_info " was not found on this server.</p>")
return None
def process_response(self, request, response):
return response
在process_request中处理请求,process_response处理响应。
在process_request方法中,返回值为HttpResponse类型的对象的时候不交给普通的控制器处理,直接返回给浏览器,返回值为None的时候,请求处理完之后交给普通的控制器处理。
在settings.py文件的中间件配置中我们刚刚的中间件。
结果
当爬虫访问的时候,它只能获取到一个404页面的错误。
二丶进阶阶段(根据自己的网站内容制定相对应不同的策略)
1.限制IP地址单位时间的访问次数 :
分析:没有哪个常人一秒钟内能访问相同网站5次,除非是程序访问,而有这种喜好的,就剩下搜索引擎爬虫和讨厌的采集器了。
弊端:一刀切,这同样会阻止搜索引擎对网站的收录
适用网站:不太依靠搜索引擎的网站
采集器会怎么做:减少单位时间的访问次数,减低采集效率
2.屏蔽ip
分析:通过后台计数器,记录来访者ip和访问频率,人为分析来访记录,屏蔽可疑Ip。
弊端:似乎没什么弊端,就是站长忙了点
适用网站:所有网站,且站长能够知道哪些是google或者百度的机器人
采集器会怎么做:打游击战呗!利用ip代理采集一次换一次,不过会降低采集器的效率和网速(用代理嘛)。
3.用户登录才能访问网站内容 *
分析:搜索引擎爬虫不会对每个这样类型的网站设计登录程序。听说采集器可以针对某个网站设计模拟用户登录提交表单行为。
适用网站:极度讨厌搜索引擎,且想阻止大部分采集器的网站
采集器会怎么做:制作拟用户登录提交表单行为的模块
4、利用脚本语言做分页(隐藏分页)
分析:还是那句,搜索引擎爬虫不会针对各种网站的隐藏分页进行分析,这影响搜索引擎对其收录。但是,采集者在编写采集规则时,要分析目标网页代码,懂点脚本知识的人,就会知道分页的真实链接地址。
适用网站:对搜索引擎依赖度不高的网站,还有,采集你的人不懂脚本知识
采集器会怎么做:应该说采集者会怎么做,他反正都要分析你的网页代码,顺便分析你的分页脚本,花不了多少额外时间。
5.防盗链措施 (只允许通过本站页面连接查看,如:Request.ServerVariables(“HTTP_REFERER“) )
分析:asp和php可以通过读取请求的HTTP_REFERER属性,来判断该请求是否来自本网站,从而来限制采集器,同样也限制了搜索引擎爬虫,严重影响搜索引擎对网站部分防盗链内容的收录。
适用网站:不太考虑搜索引擎收录的网站
采集器会怎么做:伪装HTTP_REFERER嘛,不难。