JavaEthical Hackers程序员

浅析Java Web 防爬虫机制

2017-06-12  本文已影响410人  Koali啦

前戏:
因为作者喜欢爬虫,所以总结了一下自己爬虫时一般遇到的难处,所以这些难处就是防爬虫的有效措施。


了解一般防爬虫的方法:
1.给令牌(类似我们拿快递,需要有身份验证的令牌,才给你拿快递)。
2.记录ip(同ip访问量速度太高等等)。
其他的还有很多。。。


今天我们模拟第一种机制:给令牌。
首先我们看看这个网页:

普通.png

其次看看页面的源码:

页面源码.png

一般爬虫遇到这种网页,肯定偷偷开心,因为只要爬整个网页就可以获取里面的图片资源等等。。。
接下来我们再来看看同样的网页,不同的源码:

源码2.png

这两个源码的实现的效果是一样的,为什么他们区别那么大(第一个基本各种标签都在界面上,第二个就两个div)。


没错,很多人猜到了,就是异步加载(Ajax)!
至于如何异步加载不是本篇文章的重点,接下来我们看看如何实现异步加载和令牌式来防爬虫。
接下来看看图片,了解整个令牌防爬虫。


图解.png

因为有了令牌验证,爬虫并不能直接爬取,他需要拿到令牌,假设你的令牌很难构造,这就可以过滤很多爬虫了!


看到这里应该明白怎么个防爬虫原理了吧,接下来关键的是令牌的构造!
这里有两种方式:
第一种:请求服务器给令牌(比如你登陆后,个人信息存在session,在加密给你一个令牌),不过这种给服务器的压力大,不建议。
第二种:在客户端构成令牌(看是在我们客户端构成令牌,不过加密够难解,还是不容易伪造!)


实现方法:

<script type="text/javascript" src="Js/jquery-3.2.1.js"></script>//Jquery
    <script type="text/javascript" src="Js/LoadPage.js"></script>//异步的JS
    <script type="text/javascript" src="Js/Encrypt.js"></script>//加密的JS

由于异步不是重点,所以略过。。。。
接下来,我们服务器接收令牌并且判断,合法给予资源,不合法不给予!

 try {
            params = Encrypt.GetMD5Code(token);
            System.out.println("服务器的params:"+params);
        }catch (Exception e){
            e.printStackTrace();
        }
        String getToken = req.getParameter("token");
        System.out.println("客户端的params:"+getToken);
        if (getToken.equals(params)){//判断令牌是否合法!
//合法便给予资源            
resp.getWriter().print( "![](Pic/me.jpg)\n");
        }
    }

接下来我们看看通过抓包,我们的模拟是否成功~
抓包看看令牌:

令牌.png

服务器和客户端的令牌是否相同,相同合法给予图片资源!

服务端.png

给予资源(在response里面)

响应.png
至此我们获取到了资源!
本文为原创,如有转载请注明转载地址,对作者的一种鼓励!
本次项目发布在github上(求个star(●'◡'●)):https://github.com/Elricyo/PreventSpider
谢谢观看!有什么问题请评论,作者也是Java Web 的菜鸟!
上一篇下一篇

猜你喜欢

热点阅读