PHP判断来访是搜索引擎蜘蛛还是普通用户的代码小结


Posted in PHP onSeptember 14, 2015

1、推荐的一种方法:php判断搜索引擎蜘蛛爬虫还是人为访问代码,摘自Discuz x3.2

<?php
function checkrobot($useragent=''){
	static $kw_spiders = array('bot', 'crawl', 'spider' ,'slurp', 'sohu-search', 'lycos', 'robozilla');
	static $kw_browsers = array('msie', 'netscape', 'opera', 'konqueror', 'mozilla');

	$useragent = strtolower(empty($useragent) ? $_SERVER['HTTP_USER_AGENT'] : $useragent);
	if(strpos($useragent, 'http://') === false && dstrpos($useragent, $kw_browsers)) return false;
	if(dstrpos($useragent, $kw_spiders)) return true;
	return false;
}
function dstrpos($string, $arr, $returnvalue = false) {
	if(empty($string)) return false;
	foreach((array)$arr as $v) {
		if(strpos($string, $v) !== false) {
			$return = $returnvalue ? $v : true;
			return $return;
		}
	}
	return false;
}
if(checkrobot()){
	echo '机器人爬虫';
}else{
	echo '人';
}
?>

实际应用中可以这样判断,直接不是搜索引擎才执行操作

<?php
if(!checkrobot()){
//do something
}
?>

2、第二种方法:

使用PHP实现蜘蛛访问日志统计

$useragent = addslashes(strtolower($_SERVER['HTTP_USER_AGENT']));

 if (strpos($useragent, 'googlebot')!== false){$bot = 'Google';}
 elseif (strpos($useragent,'mediapartners-google') !== false){$bot = 'Google Adsense';}
 elseif (strpos($useragent,'baiduspider') !== false){$bot = 'Baidu';}
 elseif (strpos($useragent,'sogou spider') !== false){$bot = 'Sogou';}
 elseif (strpos($useragent,'sogou web') !== false){$bot = 'Sogou web';}
 elseif (strpos($useragent,'sosospider') !== false){$bot = 'SOSO';}
 elseif (strpos($useragent,'360spider') !== false){$bot = '360Spider';}
 elseif (strpos($useragent,'yahoo') !== false){$bot = 'Yahoo';}
 elseif (strpos($useragent,'msn') !== false){$bot = 'MSN';}
 elseif (strpos($useragent,'msnbot') !== false){$bot = 'msnbot';}
 elseif (strpos($useragent,'sohu') !== false){$bot = 'Sohu';}
 elseif (strpos($useragent,'yodaoBot') !== false){$bot = 'Yodao';}
 elseif (strpos($useragent,'twiceler') !== false){$bot = 'Twiceler';}
 elseif (strpos($useragent,'ia_archiver') !== false){$bot = 'Alexa_';}
 elseif (strpos($useragent,'iaarchiver') !== false){$bot = 'Alexa';}
 elseif (strpos($useragent,'slurp') !== false){$bot = '雅虎';}
 elseif (strpos($useragent,'bot') !== false){$bot = '其它蜘蛛';}
 if(isset($bot)){
   $fp = @fopen('bot.txt','a');
   fwrite($fp,date('Y-m-d H:i:s')."\t".$_SERVER["REMOTE_ADDR"]."\t".$bot."\t".'http://'.$_SERVER['SERVER_NAME'].$_SERVER["REQUEST_URI"]."\r\n");
   fclose($fp);
 }

第三种方法:

我们可以通过HTTP_USER_AGENT来判断是否是蜘蛛,搜索引擎的蜘蛛都有自己的独特标志,下面列取了一部分。

function is_crawler() { 
  $userAgent = strtolower($_SERVER['HTTP_USER_AGENT']); 
  $spiders = array( 
    'Googlebot', // Google 爬虫 
    'Baiduspider', // 百度爬虫 
    'Yahoo! Slurp', // 雅虎爬虫 
    'YodaoBot', // 有道爬虫 
    'msnbot' // Bing爬虫 
    // 更多爬虫关键字 
  ); 
  foreach ($spiders as $spider) { 
    $spider = strtolower($spider); 
    if (strpos($userAgent, $spider) !== false) { 
      return true; 
    } 
  } 
  return false; 
}

下面的php代码附带了更多的蜘蛛标识

function isCrawler() { 
    echo $agent= strtolower($_SERVER['HTTP_USER_AGENT']); 
    if (!empty($agent)) { 
        $spiderSite= array( 
            "TencentTraveler", 
            "Baiduspider+", 
            "BaiduGame", 
            "Googlebot", 
            "msnbot", 
            "Sosospider+", 
            "Sogou web spider", 
            "ia_archiver", 
            "Yahoo! Slurp", 
            "YoudaoBot", 
            "Yahoo Slurp", 
            "MSNBot", 
            "Java (Often spam bot)", 
            "BaiDuSpider", 
            "Voila", 
            "Yandex bot", 
            "BSpider", 
            "twiceler", 
            "Sogou Spider", 
            "Speedy Spider", 
            "Google AdSense", 
            "Heritrix", 
            "Python-urllib", 
            "Alexa (IA Archiver)", 
            "Ask", 
            "Exabot", 
            "Custo", 
            "OutfoxBot/YodaoBot", 
            "yacy", 
            "SurveyBot", 
            "legs", 
            "lwp-trivial", 
            "Nutch", 
            "StackRambler", 
            "The web archive (IA Archiver)", 
            "Perl tool", 
            "MJ12bot", 
            "Netcraft", 
            "MSIECrawler", 
            "WGet tools", 
            "larbin", 
            "Fish search", 
        ); 
        foreach($spiderSite as $val) { 
            $str = strtolower($val); 
            if (strpos($agent, $str) !== false) { 
                return true; 
            } 
        } 
    } else { 
        return false; 
    } 
} 
if (isCrawler()){ 
    echo "你好蜘蛛精!"; 
} 
else{ 
   echo "你不是蜘蛛精啊!"; 
}

第四种方法:

<?php
$flag = false;
$tmp = $_SERVER['HTTP_USER_AGENT'];
if(strpos($tmp, 'Googlebot') !== false){
  $flag = true;
} else if(strpos($tmp, 'Baiduspider') >0){
  $flag = true;
} else if(strpos($tmp, 'Yahoo! Slurp') !== false){
  $flag = true;
} else if(strpos($tmp, 'msnbot') !== false){
  $flag = true;
} else if(strpos($tmp, 'Sosospider') !== false){
  $flag = true;
} else if(strpos($tmp, 'YodaoBot') !== false || strpos($tmp, 'OutfoxBot') !== false){
  $flag = true;
} else if(strpos($tmp, 'Sogou web spider') !== false || strpos($tmp, 'Sogou Orion spider') !== false){
  $flag = true;
} else if(strpos($tmp, 'fast-webcrawler') !== false){
  $flag = true;
} else if(strpos($tmp, 'Gaisbot') !== false){
  $flag = true;
} else if(strpos($tmp, 'ia_archiver') !== false){
  $flag = true;
} else if(strpos($tmp, 'altavista') !== false){
  $flag = true;
} else if(strpos($tmp, 'lycos_spider') !== false){
  $flag = true;
} else if(strpos($tmp, 'Inktomi slurp') !== false){
  $flag = true;
}
if($flag == false){
  header("Location: https://3water.com" . $_SERVER['REQUEST_URI']);
  // 自动转到https://3water.com 对应的网页
  // $_SERVER['REQUEST_URI'] 为域名后面的路径
  // 或换成header("Location: https://3water.com/abc/d.php");
  exit();
}
?>
PHP 相关文章推荐
php 设计模式之 工厂模式
Dec 19 PHP
PHP中几种常见的超时处理全面总结
Sep 11 PHP
PHP实现下载功能的代码
Sep 29 PHP
深入for,while,foreach遍历时间比较的详解
Jun 08 PHP
浅析php学习的路线图
Jul 10 PHP
php实现基于微信公众平台开发SDK(demo)扩展的方法
Dec 22 PHP
PHP实现支持SSL连接的SMTP邮件发送类
Mar 05 PHP
PHP面向对象之领域模型+数据映射器实例(分析)
Jun 21 PHP
Yii2框架redis基本应用示例
Jul 13 PHP
PHP实现的支付宝支付功能示例
Mar 26 PHP
Yii框架通过请求组件处理get,post请求的方法分析
Sep 03 PHP
详解PHP设计模式之依赖注入模式
May 25 PHP
php生成静态html页面的方法(2种方法)
Sep 14 #PHP
PHP概率计算函数汇总
Sep 13 #PHP
整理php防注入和XSS攻击通用过滤
Sep 13 #PHP
教你识别简单的免查杀PHP后门
Sep 13 #PHP
php文件扩展名判断及获取文件扩展名的N种方法
Sep 12 #PHP
php上传功能集后缀名判断和随机命名(强力推荐)
Sep 10 #PHP
ubuntu下配置nginx+php+mysql详解
Sep 10 #PHP
You might like
用ODBC的分页显示
2006/10/09 PHP
PHP下判断网址是否有效的代码
2011/10/08 PHP
PHP操作文件类的函数代码(文件和文件夹创建,复制,移动和删除)
2011/11/10 PHP
ubuntu下编译安装xcache for php5.3 的具体操作步骤
2013/06/18 PHP
thinkphp3查询mssql数据库乱码解决方法分享
2014/02/11 PHP
cakephp常见知识点汇总
2017/02/24 PHP
php屏蔽错误及提示的方法
2020/05/10 PHP
PHP利用curl发送HTTP请求的实例代码
2020/07/09 PHP
如何简单地用YUI做JavaScript动画
2007/03/10 Javascript
JavaScript实现x秒后自动跳转到一个页面
2013/01/03 Javascript
全面解析Bootstrap表单使用方法(表单控件状态)
2015/11/24 Javascript
实例详解display:none与visible:hidden的区别
2017/03/30 Javascript
Vuejs 实现简易 todoList 功能 与 组件实例代码
2018/09/10 Javascript
Node.js模拟发起http请求从异步转同步的5种用法
2018/09/26 Javascript
微信小程序环境下将文件上传到OSS的方法步骤
2019/05/31 Javascript
解决layui的radio属性或别的属性没显示出来的问题
2019/09/26 Javascript
[01:18:33]Secret vs VGJ.S Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
python中使用mysql数据库详细介绍
2015/03/27 Python
Python中的super用法详解
2015/05/28 Python
python 实现求解字符串集的最长公共前缀方法
2018/07/20 Python
详解python3安装pillow后报错没有pillow模块以及没有PIL模块问题解决
2019/04/17 Python
Python Django给admin添加Action的方法实例详解
2019/04/29 Python
python字符串下标与切片及使用方法
2020/02/13 Python
PyCharm vs VSCode,作为python开发者,你更倾向哪种IDE呢?
2020/08/17 Python
python中Pexpect的工作流程实例讲解
2021/03/02 Python
CSS3实现全景图特效示例代码
2018/03/26 HTML / CSS
香港百佳网上超级市场:PARKNSHOP.com
2020/06/10 全球购物
如何进行有效的自我评价
2013/09/27 职场文书
邮政员工辞职信
2014/01/16 职场文书
加工操作管理制度
2014/01/19 职场文书
幼儿园六一儿童节演讲稿
2015/03/19 职场文书
致我们终将逝去的青春观后感
2015/06/10 职场文书
请病假条范文
2015/08/17 职场文书
大学校园餐饮创业计划书
2019/08/07 职场文书
Go使用协程交替打印字符
2021/04/29 Golang
Django 实现jwt认证的示例
2021/04/30 Python