📜  php 检测爬虫 - PHP (1)

📅  最后修改于: 2023-12-03 15:33:38.754000             🧑  作者: Mango

PHP 检测爬虫

爬虫是一种自动化工具,可以快速地从网络上抓取大量数据。有时爬虫行为是不被允许的,因为它可能会导致网站过载或占用过多资源。因此,开发者可能需要在PHP应用程序中检测爬虫并阻止它们。

1. 检测用户代理

每个 HTTP 请求都包括一个用户代理标头,用于标识发送请求的客户端。爬虫通常使用自定义用户代理字符串,因此可以通过检查用户代理来检测爬虫。下面是一个示例函数,用于检测常见的爬虫用户代理:

function is_crawler() {
    $user_agent = strtolower($_SERVER['HTTP_USER_AGENT']);
    $crawlers = array(
        'googlebot',
        'bingbot',
        'yahoo',
        'yandex',
        'baidu',
        'duckduckbot',
        // add more crawlers here
    );
    foreach ($crawlers as $crawler) {
        if (strpos($user_agent, $crawler) !== false) {
            return true;
        }
    }
    return false;
}

该函数返回 true 如果用户代理标头包含任何提供的爬虫字符串,否则返回 false

2. 检测访问频率

爬虫通常以极快的速度访问网站页面,因此可以通过检测频繁的访问来检测爬虫。下面是一个示例函数,用于检测来访者是否访问频繁:

function is_frequent_visitor($limit=10, $timeframe=60) {
    $ip = $_SERVER['REMOTE_ADDR'];
    $timestamp = time();
    $filename = sys_get_temp_dir() . "/" . $ip;
    if (!is_file($filename)) {
        file_put_contents($filename, $timestamp);
    } else {
        $times = array_filter(explode("\n", file_get_contents($filename)), function($line) use ($timestamp, $timeframe) {
            return ($timestamp - $line) < $timeframe;
        });
        if (count($times) > $limit) {
            return true;
        }
        $times[] = $timestamp;
        file_put_contents($filename, implode("\n", $times));
    }
    return false;
}

该函数将来访者的 IP 地址和时间戳记录在一个临时文件中,并检查最近的 $limit 次访问是否超过 $timeframe 秒。如果是,则返回 true,否则将时间戳添加到文件中并返回 false

3. 检测 JavaScript 引擎

大多数爬虫不会解析 JavaScript,因此可以通过检测来访者是否支持 JavaScript 来识别爬虫。下面是一个示例函数,用于检测是否支持 JavaScript:

function has_javascript() {
    return empty($_SERVER['HTTP_ACCEPT']) ||
        strpos($_SERVER['HTTP_ACCEPT'], 'javascript') !== false ||
        strpos($_SERVER['HTTP_ACCEPT'], 'ecmascript') !== false;
}

该函数返回 true 如果 HTTP_ACCEPT 标头包含 "javascript" 或 "ecmascript" 字符串(表示支持 JavaScript),否则返回 false

结论

以上是一些基本的方法来在 PHP 中检测爬虫。需要注意的是,这些方法都不是 100% 可靠的,因为爬虫可以模拟浏览器 User-Agent 或使用 JavaScript 引擎。因此,应考虑使用其他技术(如验证码或 IP 阻止)来增强爬虫防护。