持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第25天,点击查看活动详情
我也不知道我这博客写啥了,经常被人爬取数据。
之前还是Apache服务器的时候,有一次,爬虫访问的并发量太高,导致我数据库写入访问数据并发而导致数据崩了。
这个有点不太好。
之前想过使用Cookie来限制用户,但这对于爬虫来说,好像没有什么作用。虽然我的网站添加了roboet.txt,但是奈何人家就是爬咱也没有招呀。
后来想到了缓存,redis和memcache,缓存是个好东西啊。
将访问的客户端的ip存储缓存。
判断其在一定时间内的访问次数。
如果过于频繁,不让其访问就是了。还是挺实用是我,但是这种方式也仅仅能防御不使用代理的爬虫,要是实用代理对你的网站进行爬虫,我这招就不好用了。
安装redis请参考《Centos7.6安装Redis服务》
PHP配置redis请参考《PHP7.2安装redis扩展及访问》
具体代码:
/**
* redis限制游客访问次数
*/
public function RedisLimitVisit()
{
$redis = new Redis();
$redis->connect('127.0.0.1', 6379); //连接 Redis
if (!$redis->exists(get_real_ip())){
//第一次访问
$redis->set(get_real_ip(),1,5*60); // 设置5分钟过期时间并设置初始值1
}else{
//已经记录过IP
if ($redis->get(get_real_ip()) < 90){ //判断IP有没有到达拉黑阈值
$redis->incr(get_real_ip()); //次数加一
return true;
}else{
return false;
}
}
}
/**
* 获取客户端ip
*/
public function get_real_ip($type = 0,$adv=false) {
$type = $type ? 1 : 0;
static $ip = NULL;
if ($ip !== NULL) return $ip[$type];
if($adv){
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$pos = array_search('unknown',$arr);
if(false !== $pos) unset($arr[$pos]);
$ip = trim($arr[0]);
}elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
}elseif (isset($_SERVER['REMOTE_ADDR'])) {
$ip = $_SERVER['REMOTE_ADDR'];
}
}elseif (isset($_SERVER['REMOTE_ADDR'])) {
$ip = $_SERVER['REMOTE_ADDR'];
}
$long = sprintf("%u",ip2long($ip));
$ip = $long ? array($ip, $long) : array('0.0.0.0', 0);
return $ip[$type];
}
客户端调用:
$resault = $this->RedisLimitVisit();
if(!$resault)
{
echo '<script>alert("您在5分钟之内访问次数超限,此限制将于5分钟之后解除。"); window.location.href = "'.BLOG_URL.'"</script>';
}
最后效果如下图所示:
有好的建议,请在下方输入你的评论。
欢迎访问个人博客 guanchao.site