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 smarty模版引擎中的缓存应用
Dec 11 PHP
PHP 源代码压缩小工具
Dec 22 PHP
php ftp文件上传函数(基础版)
Jun 03 PHP
PHP无限分类(树形类)的深入分析
Jun 02 PHP
php实现微信扫码自动登陆与注册功能
Sep 22 PHP
PHP利用超级全局变量$_POST来接收表单数据的实例
Nov 05 PHP
php版微信小店API二次开发及使用示例
Nov 12 PHP
PHP缩略图生成和图片水印制作
Jan 07 PHP
php提交表单时保留多个空格及换行的文本样式的方法
Jun 20 PHP
Laravel中encrypt和decrypt的实现方法
Sep 24 PHP
详解Yaf框架PHPUnit集成测试方法
Dec 27 PHP
PHP7创建COOKIE和销毁COOKIE的实例方法
Feb 03 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重新实现PHP脚本引擎内置函数
2007/03/06 PHP
Yii2使用自带的UploadedFile实现的文件上传
2016/06/20 PHP
PHP中$GLOBALS['HTTP_RAW_POST_DATA']和$_POST的区别分析
2017/07/03 PHP
PHP时间戳和日期相互转换操作实例小结
2018/12/18 PHP
PHP addAttribute()函数讲解
2019/02/03 PHP
php生成随机数/生成随机字符串的方法小结【5种方法】
2020/05/27 PHP
js中判断Object、Array、Function等引用类型对象是否相等
2012/08/29 Javascript
jQuery侧边栏随窗口滚动实现方法
2013/03/04 Javascript
Select标签下拉列表二级联动级联实例代码
2014/02/07 Javascript
jquery插件NProgress.js制作网页加载进度条
2015/06/05 Javascript
javascript实现禁止复制网页内容汇总
2015/12/30 Javascript
Nodejs爬虫进阶教程之异步并发控制
2016/02/15 NodeJs
巧用Javascript的逻辑运算符
2016/12/02 Javascript
详解利用jsx写vue组件的方法示例
2017/07/17 Javascript
Node接收电子邮件的实例代码
2017/07/21 Javascript
如何让你的JS代码更好看易读
2017/12/01 Javascript
Vue 页面状态保持页面间数据传输的一种方法(推荐)
2018/11/01 Javascript
webpack打包多页面的方法
2018/11/30 Javascript
vue-cli+iview项目打包上线之后图标不显示问题及解决方法
2019/10/16 Javascript
使用Python内置的模块与函数进行不同进制的数的转换
2016/03/12 Python
Python增量循环删除MySQL表数据的方法
2016/09/23 Python
python自动12306抢票软件实现代码
2018/02/24 Python
python3 pandas 读取MySQL数据和插入的实例
2018/04/20 Python
浅析Python 3 字符串中的 STR 和 Bytes 有什么区别
2018/10/14 Python
破解安装Pycharm的方法
2018/10/19 Python
浅谈python在提示符下使用open打开文件失败的原因及解决方法
2018/11/30 Python
手把手教你Python yLab的绘制折线图的画法
2019/10/23 Python
Python object类中的特殊方法代码讲解
2020/03/06 Python
利用Python自动化操作AutoCAD的实现
2020/04/01 Python
Python批量修改xml的坐标值全部转为整数的实例代码
2020/11/26 Python
John Varvatos官方网站:设计师男士时装
2017/02/08 全球购物
捐款活动总结
2014/08/27 职场文书
同学聚会邀请函
2015/01/30 职场文书
2016年第16个全民国防教育日宣传活动总结
2016/04/05 职场文书
MySQL 常见存储引擎的优劣
2021/06/02 MySQL
利用Apache Common将java对象池化的问题
2022/06/16 Servers