首页 > 其他分享 >防爬虫方法

防爬虫方法

时间:2024-05-16 16:43:21浏览次数:23  
标签:return redis 爬虫 frequency key time userAgent 方法

调用方法 

// 检查请求是否来自爬虫
    if ($this->isCrawler()) {
        $this->ajaxReturn(array('status'=>'0','info'=>'爬虫访问'));
    }
    //限制访问次数
    $result = $this->api_frequency_visits(UID);
    if (!$result) {
        $this->ajaxReturn(array('status'=>'0','info'=>'访问次数过多'));
     }

 

// 检查用户代理是否像常规浏览器
    function isCrawler() {
        $userAgent = $_SERVER['HTTP_USER_AGENT'];
        if(!$userAgent){
            return true; //true 表示是爬虫
        }
        $knownCrawlers = [
            'Googlebot', 'Bingbot', 'Slurp', 'DuckDuckBot', 'Baidu', 'Yahoo', 'Yandex',
        ];
        foreach ($knownCrawlers as $crawler) {
            if (strpos($userAgent, $crawler) !== false) {
                return true;
            }
        }
        if(substr($userAgent, 0,16)=="python-requests/" or substr($userAgent, 0,14)=="Python-urllib/"){
            return true;
        }
        return false;
    }
/**
 * @param $uid
 * @return bool|int
 * 检测用户接口访问频率
 */
function api_frequency_visits ($uid) {
    $key = "user:{$uid}:api:frequency";
    $redis = new Redis();
    $redis->connect('127.0.0.1');
    $data = $redis->hGetAll($key);
    //需要删除的key
    $del_key = [];
    //时间内访问的总次数
    $total = 0;
    //时间内最大访问次数
    $max_frequency = 10;
    //当前时间
    $now_time = time();
    //限制时间
    $limit_time = 60;
    foreach ($data as $time=>$count) {
        if ($time < $now_time - $limit_time) {
            $del_key[] = $time;
        } else {
            $total += $count;
        }
    }
    //存在需要删除的key
    if ($del_key) {
        $redis->hDel($key, ...$del_key);
    }
    if ($total >= $max_frequency) {
        return false;
    }
    return $redis->hIncrBy($key, $now_time, 1);
}

 

标签:return,redis,爬虫,frequency,key,time,userAgent,方法
From: https://www.cnblogs.com/zinging/p/18196218

相关文章

  • 登录宝塔面板提示参数格式错误解决方法
    问题描述:登录宝塔面板提示参数格式错误,如下图所示 解决方法:登录服务器SSH终端中执行下面命令(非面板终端)修复面板1.删除之前无法使用的面板环境(不会影响当前网站数据的使用)mv  /www/server/panel/pyenv /www/backup/pyenv2.重新获取新的面板环境和更新包curl http://dow......
  • 如何将pdf转换成ppt?这3种方法简单实用!
    PDF是一种常见的文档格式,而PPT则是一种常见的演示文稿格式。有时候,我们需要将PDF文件转换成PPT格式,以便在演示或展示中使用。下面,介绍pdf怎么转换成ppt的3种方法。一、使用在线转换工具这种方法是最简单、最快捷的方式之一。有很多在线工具都可以免费将PDF转成PPT,例如smallpdf中......
  • flutter开发项目编译失败依赖冲突的解决方法dependency_overrides
    1.问题在复杂的稍等大点的flutter项目当中,依赖各种第三方框架是很正常,而且也有有很多依赖的,但有时难免存在不同的框架刚好使用了同一个依赖库的不同版本,特别是依赖了系统的某个库的不同版本这个时候就难免会出现同一个依赖库不同版本冲突的编译失败问题2.现象Becauseflut......
  • 超实用又简单的像素图转矢量图方法
    今天发现了一个超级牛的像素图转矢量图方法,觉得很有必要分享给大家!随着AIGC的发展,现在很多很厉害的AI工具如雨后春笋一般涌现,今天被网友疯狂安利了这款超棒的AI工具网站: 赶紧打开网站看了看,好家伙,79.99港币一个月!!! 看到这个价格以后,我连尝试的欲望都没有了!因为我刚好就......
  • 易基因:干货|DNA甲基化测序后的后期验证方法
    易基因:干货|DNA甲基化测序后的后期验证方法大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。做完测序后,如果需要对分析结果中感兴趣的内容进行后期验证,则需要进行下游实验设计。DNA甲基化研究的后期验证包括简单验证、全基因组甲基化干扰实验(非靶向)、靶向目标基......
  • 使用命令登录harbor报错authentication required解决方法
    使用命令在终端登录harbor报错报错信息如下#dockerlogin192.168.3.61Authenticatingwithexistingcredentials...StoredcredentialsinvalidorexpiredUsername(admin):adminPassword:Errorresponsefromdaemon:Get"http://192.168.3.61/v2/":unauthorized:......
  • 爬虫-JSON文件存储
    JSON文件存储JSON是一种轻量级的数据交换格式,它是基于ECMAScript的一个子集;JSON在Python中分别由list和dict组成;1、JSON模块的功能函数描述json.dumps()将python类型转换为字符串,返回一个str对象。实现把一个python对象编码转换成JSON字符串json.loads()把JSO......
  • 爬虫-CSV文件存储
    CSV文件存储CSV是CommaSeparatedValues,称为逗号分隔值,一种以.csv结尾的文件,所有值都是字符串。文件操作示例importcsvwithopen('student.csv','a+',newline='')asfile:#newline=''表示不空行#创建一个writer对象writer=csv.writer(file)#一次写......
  • 子类调用父类构造方法例题
    这段代码定义了三个类:Father(父类)、Child(子类)和Test(测试类)。首先,main方法执行newChild();时,会调用子类的构造函数。父类子类在子类Child的无参构造函数中,首先调用了this("dd"),这实际上是调用了Child类的有参构造函数但是,在子类Child的有参构造函数中,又调用了super("dd"),这......
  • 墨刀的特点和使用方法
    墨刀是一款专业的原型设计工具,具有以下特点:简单易用:墨刀拥有直观的操作界面,用户可以轻松地创建原型设计,并且无需编程知识。多平台支持:墨刀可以在多个平台上使用,包括Web、iOS和Android,用户可以随时随地进行设计工作。实时协作:墨刀支持团队实时协作,多人可以同时编辑同一......