前戏:
因为作者喜欢爬虫,所以总结了一下自己爬虫时一般遇到的难处,所以这些难处就是防爬虫的有效措施。
了解一般防爬虫的方法:
1.给令牌(类似我们拿快递,需要有身份验证的令牌,才给你拿快递)。
2.记录ip(同ip访问量速度太高等等)。
其他的还有很多。。。
今天我们模拟第一种机制:给令牌。
首先我们看看这个网页:
普通.png
其次看看页面的源码:
页面源码.png
一般爬虫遇到这种网页,肯定偷偷开心,因为只要爬整个网页就可以获取里面的图片资源等等。。。
接下来我们再来看看同样的网页,不同的源码:
源码2.png
这两个源码的实现的效果是一样的,为什么他们区别那么大(第一个基本各种标签都在界面上,第二个就两个div)。
没错,很多人猜到了,就是异步加载(Ajax)!
至于如何异步加载不是本篇文章的重点,接下来我们看看如何实现异步加载和令牌式来防爬虫。
接下来看看图片,了解整个令牌防爬虫。
图解.png
因为有了令牌验证,爬虫并不能直接爬取,他需要拿到令牌,假设你的令牌很难构造,这就可以过滤很多爬虫了!
看到这里应该明白怎么个防爬虫原理了吧,接下来关键的是令牌的构造!
这里有两种方式:
第一种:请求服务器给令牌(比如你登陆后,个人信息存在session,在加密给你一个令牌),不过这种给服务器的压力大,不建议。
第二种:在客户端构成令牌(看是在我们客户端构成令牌,不过加密够难解,还是不容易伪造!)
实现方法:
//Jquery
//异步的JS
//加密的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 的菜鸟!