【问题标题】:Toggle links for crawler and guest visitors切换爬虫和访客访问者的链接
【发布时间】:2015-09-22 17:17:58
【问题描述】:

我需要为爬虫和访客显示两个不同的链接。示例:
爬虫见正常链接-<a href="example.com">example.com</a>
客人见链接-<a href="other.com/register">Register to see link</a>

// Check the user agent of the current 'visitor'
if($Detect->isCrawler()) {
    // true if crawler user agent detected
}else{
    // false
}

【问题讨论】:

  • 当你给普通用户一个注册页面时,给搜索引擎一些有趣的内容听起来像是一个被搜索引擎惩罚的好方法。
  • 谁能确认这个建议?你确定吗? Facebook 使用隐藏链接。

标签: php html css


【解决方案1】:

在大多数情况下,您可以通过查看“User-Agent”标头来确定您的网站是否被抓取:

function isWebCrawler() {
  $isCrawler = false;

  $userAgent = $_SERVER['HTTP_USER_AGENT'];
  if(strlen(strstr($userAgent, "Google")) <= 0 ) {
    $isCrawler = true;
  }

  return $isCrawler;
}

以下是大多数主要机器人的用户代理字符串列表: List of Web Crawler User Agents

【讨论】:

    【解决方案2】:

    使用 robots.txt 阻止
    不幸的是,实际上并没有一个万无一失的系统来检测机器人。使用robots.txt 文件,将允许您阻止大多数合法的机器人。然而,还有很多“攻击性”的机器人会简单地忽略这个文件。另外,您的问题是检测它们而不是阻止它们。

    使用用户代理检测
    因此,检测机器人的第二个最佳方法是使用$_SERVER['HTTP_USER_AGENT'] 检查用户代理。例如:

    function isCrawler($agent)
    {
        $crawlers = array(
            array('Google', 'Google'),
            array('msnbot', 'MSN'),
            array('Rambler', 'Rambler'),
            array('Yahoo', 'Yahoo'),
            array('AbachoBOT', 'AbachoBOT'),
            array('accoona', 'Accoona'),
            array('AcoiRobot', 'AcoiRobot'),
            array('ASPSeek', 'ASPSeek'),
            array('CrocCrawler', 'CrocCrawler'),
            array('Dumbot', 'Dumbot'),
            array('FAST-WebCrawler', 'FAST-WebCrawler'),
            array('GeonaBot', 'GeonaBot'),
            array('Gigabot', 'Gigabot'),
            array('Lycos', 'Lycos spider'),
            array('MSRBOT', 'MSRBOT'),
            array('Scooter', 'Altavista robot'),
            array('AltaVista', 'Altavista robot'),
            array('IDBot', 'ID-Search Bot'),
            array('eStyle', 'eStyle Bot'),
            array('Scrubby', 'Scrubby robot')
        );
    
        foreach ($crawlers as $c)
        {
            if (stristr($agent, $c[0]))
            {
                return($c[1]);
            }
        }
    
        return false;
    }
    
    $crawler = isCrawler($_SERVER['HTTP_USER_AGENT']);
    

    使用外部资源提高可靠性
    但是,那里有太多的机器人,以至于您的阵列将变得非常大,无法全部捕获。更不用说它会很快过时。因此使用更新很多的外部资源更可靠。网站UserAgentString.com 正在提供这样的服务。像这样的简单代码可以为您解决问题:

    $api_request="http://www.useragentstring.com/?uas=".urlencode($_SERVER['HTTP_USER_AGENT'])."&getJSON=all";
    $ua=json_decode(file_get_contents($api_request));
    if($ua["agent_type"]=="Crawler"){
        echo '<a href="example.com">example.com</a>';
    } else {
        echo '<a href="other.com/register">Register to see link</a>';
    }
    

    感谢这个问题:How to identify web-crawler?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-28
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 2016-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多