蜘蛛/机器人UserAgent检测C#

时间:2013-11-08 19:14:29

标签: c# asp.net user-agent

我正在开发一个应用程序,如果用户不在我们的浏览器列表中,则会重定向用户以升级浏览器。

我的目标是创建一个例外,根据UserAgent字符串检测它们是否是爬虫。

此时,我收到一条消息......“没有.ToLower的定义或扩展方法”

这是我的代码:

    private bool IsValidCrawler(HttpRequestBase request)
    {
        bool isCrawler = true;

        switch (request.Browser.Crawler.ToLower())  
        {
            case "googlebot":
            case "bingbot":
            case "yahoo!":
            case "facebookexternalhit":
            case "facebookplatform":
                break;
        }

        return isCrawler;
    }

有人能指出我哪里出错了吗?

2 个答案:

答案 0 :(得分:11)

如果查看Crawler属性(http://msdn.microsoft.com/en-us/library/system.web.configuration.httpcapabilitiesbase.crawler(v=vs.110).aspx)的文档,您会发现它是一个布尔类型。

如果请求来自已知的抓取工具,则该属性本身会通知您。您可以暂时尝试以下操作。离开这个方法,你不必改变太多。

private bool IsValidCrawler(HttpRequestBase request)
{
    bool isCrawler = request.Browser.Crawler;

    return isCrawler;
}

答案 1 :(得分:0)

有数千个爬虫,包含在.NET框架中的用户代理解析器仅能处理其中几个爬虫,并且不会保留其中的更新列表。

安装this .nuget软件包,它提供了一个语义解析器,并且该库非常活跃。

您可以使用以下代码初始化解析器:

public static class YauaaSingleton
{
    private static UserAgentAnalyzer.UserAgentAnalyzerBuilder Builder { get; }

    private static readonly Lazy<UserAgentAnalyzer> analyzer = new Lazy<UserAgentAnalyzer> (() => Builder.Build());

    public static UserAgentAnalyzer Analyzer
    {
        get
        {
            return analyzer.Value;
        }
    }

    static YauaaSingleton()
    {
        Builder = UserAgentAnalyzer.NewBuilder();
        Builder.DropTests();
        Builder.DelayInitialization();
        Builder.WithCache(100);
        Builder.HideMatcherLoadStats();
        Builder.WithAllFields();
    }
}

那么非常简单:

  private bool IsValidCrawler(HttpRequestBase request)
  {
      var ua = YauaaSingleton.Analyzer.Parse(request.UserAgent);
      var devideClass = UserAgentClassifier.GetDeviceClass(ua);
      if (devideClass == DeviceClass.Robot || devideClass == DeviceClass.RobotMobile || devideClass == DeviceClass.RobotImitator)
          return true;
      return false;
  }

机器人:普通爬虫
RobotMobile :模拟移动设备的抓取工具
RobotImitator :这不是爬虫,而是模仿爬虫

如果需要,您还可以使用:

var isHuman = UserAgentClassifier.IsHuman(ua);在这种情况下,您还可以处理被黑的用户代理和其他情况。