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+MySQL的聊天室设计
Oct 09 PHP
用PHP来写记数器(详细介绍)
Oct 09 PHP
vs中通过剪切板循环来循环粘贴不同内容
Apr 30 PHP
php生成zip压缩文件的方法详解
Jun 09 PHP
php正则取img标记中任意属性(正则替换去掉或改变图片img标记中的任意属性)
Aug 13 PHP
php socket客户端及服务器端应用实例
Jul 04 PHP
PHP生成各种常见验证码和Ajax验证过程
Jan 10 PHP
PHP Header用于页面跳转时的几个注意事项
Oct 21 PHP
php+ajax+json 详解及实例代码
Dec 12 PHP
thinkphp5.1框架模板布局与模板继承用法分析
Jul 19 PHP
php数组指针函数功能及用法示例
Feb 11 PHP
ThinkPHP5与单元测试PHPUnit使用详解
Feb 23 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
php解决抢购秒杀抽奖等大流量并发入库导致的库存负数的问题
2014/06/19 PHP
php递归删除目录与文件的方法
2015/01/30 PHP
用js实现的模拟jquery的animate自定义动画(2.5K)
2010/07/20 Javascript
JS运行耗时操作的延时显示方法
2010/11/19 Javascript
mailto的使用技巧分享
2012/12/21 Javascript
js 获取页面高度和宽度兼容 ie firefox chrome等
2014/05/14 Javascript
Angularjs中UI Router的使用方法
2016/05/14 Javascript
js弹出框、对话框、提示框、弹窗实现方法总结(推荐)
2016/05/31 Javascript
jQuery EasyUI提交表单验证
2016/07/19 Javascript
使用JavaScript获取URL中的参数(两种方法)
2016/11/16 Javascript
JavaScript注入漏洞的原理及防范(详解)
2016/12/04 Javascript
简单实现jQuery上传图片显示预览功能
2020/06/29 jQuery
除Console.log()外更多的Javascript调试命令
2018/01/24 Javascript
element-ui 中的table的列隐藏问题解决
2018/08/24 Javascript
浅谈Node框架接入ELK实践总结
2019/02/22 Javascript
Js跳出两级循环方法代码实例
2020/09/22 Javascript
使用Python编写Linux系统守护进程实例
2015/02/03 Python
浅谈Python中copy()方法的使用
2015/05/21 Python
python实现二分查找算法
2017/09/21 Python
Python贪心算法实例小结
2018/04/22 Python
python dict 相同key 合并value的实例
2019/01/21 Python
Tensorflow分批量读取数据教程
2020/02/07 Python
浅析Python面向对象编程
2020/07/10 Python
python如何快速生成时间戳
2020/07/21 Python
python基本算法之实现归并排序(Merge sort)
2020/09/01 Python
如何让PyQt5中QWebEngineView与JavaScript交互
2020/10/21 Python
Python numpy大矩阵运算内存不足如何解决
2020/11/19 Python
Pycharm-community-2020.2.3 社区版安装教程图文详解
2020/12/08 Python
微软瑞士官方网站:Microsoft瑞士
2018/04/20 全球购物
《小儿垂钓》教学反思
2014/02/23 职场文书
请假条范文大全
2014/04/10 职场文书
领导班子民主生活会整改措施(工商局)
2014/09/21 职场文书
倡议书作文
2015/01/19 职场文书
外出培训学习心得体会
2016/01/18 职场文书
《黄山奇石》教学反思
2016/02/18 职场文书
python面向对象版学生信息管理系统
2021/06/24 Python