使用redis限制网络数据爬虫访问

146 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第25天,点击查看活动详情

微信截图_20191226205440.png

我也不知道我这博客写啥了,经常被人爬取数据。

之前还是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 !== NULLreturn $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 !== $posunset($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>';
        }

 

最后效果如下图所示:

微信截图_20191226204947.png

 

 

有好的建议,请在下方输入你的评论。

欢迎访问个人博客 guanchao.site