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 04 PHP
php array_unique之后json_encode需要注意
Jan 02 PHP
学习使用curl采集curl使用方法
Jan 11 PHP
2个自定义的PHP in_array 函数,解决大量数据判断in_array的效率问题
Apr 08 PHP
php中FTP函数ftp_connect、ftp_login与ftp_chmod用法
Nov 18 PHP
Yii入门教程之目录结构、入口文件及路由设置
Nov 25 PHP
PHP中浮点数计算比较及取整不准确的解决方法
Jan 09 PHP
php实现插入数组但不影响原有顺序的方法
Mar 27 PHP
PHP编写文件多服务器同步程序
Jul 02 PHP
PHP弱类型语言中类型判断操作实例详解
Aug 10 PHP
php nginx 实时输出的简单实现方法
Jan 21 PHP
tp5.1 框架路由操作-URL生成实例分析
May 26 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
剧场版动画《PSYCHO-PASS 3 FIRST INSPECTOR》3月27日日本上映!
2020/03/06 日漫
创建数据库php代码 用PHP写出自己的BLOG系统
2010/04/12 PHP
PHP新手用的Insert和Update语句构造类
2012/03/31 PHP
PHP中的类型提示(type hinting)功能介绍
2015/07/01 PHP
PHP模拟asp中response类实现方法
2015/08/08 PHP
PHP实现QQ登录实例代码
2016/01/14 PHP
Thinkphp自定义生成缩略图尺寸的方法
2019/08/05 PHP
参考:关于Javascript中实现暂停的几篇文章
2007/03/04 Javascript
最近项目写了一些js,水平有待提高
2009/01/31 Javascript
解决Extjs4中form表单提交后无法进入success函数问题
2013/11/26 Javascript
JavaScript中检查对象property的存在性方法介绍
2014/12/30 Javascript
JavaScript实现的链表数据结构实例
2015/04/02 Javascript
wangEditor编辑器失去焦点后仍然可以在原位置插入图片分析
2015/05/06 Javascript
VUEJS实战之修复错误并且美化时间(2)
2016/06/13 Javascript
Highcharts学习之数据列
2016/08/03 Javascript
JQuery实现列表中复选框全选反选功能封装(推荐)
2016/11/24 Javascript
Node.js 的模块知识汇总
2017/08/16 Javascript
nodejs aes 加解密实例
2018/10/10 NodeJs
如何手动实现es5中的bind方法详解
2018/12/07 Javascript
详解微信小程序-扫一扫 wx.scanCode() 扫码大变身
2019/04/30 Javascript
在Django的模板中使用认证数据的方法
2015/07/23 Python
使用PM2+nginx部署python项目的方法示例
2018/11/07 Python
Django 内置权限扩展案例详解
2019/03/04 Python
pyinstaller打包程序exe踩过的坑
2019/11/19 Python
Java如何基于wsimport调用wcf接口
2020/06/17 Python
html5调用app分享功能示例(WebViewJavascriptBridge)
2018/03/21 HTML / CSS
英国快时尚女装购物网站:PrettyLittleThing
2018/08/15 全球购物
主管竞聘书范文
2014/03/31 职场文书
考核评语大全
2014/04/29 职场文书
节约用水标语
2014/06/11 职场文书
阅兵口号
2014/06/19 职场文书
博士生导师推荐信
2014/07/08 职场文书
学校社团活动总结
2015/05/07 职场文书
初中数学教学反思范文
2016/02/17 职场文书
实习报告范文之电话客服岗位
2019/07/26 职场文书
Spring依赖注入多种类型数据的示例代码
2022/03/31 Java/Android