4

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

我的目标是创建一个异常来检测它们是否是爬虫,基于它们的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;
    }

谁能指出我哪里出错了?

4

2 回答 2

12

如果您查看 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;
}
于 2013-11-08T19:17:25.223 回答
0

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

安装这个.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;
  }

Robot:普通爬虫
RobotMobile:模拟移动设备的
爬虫 RobotImitator:这不是爬虫,而是模拟爬虫的东西

如果你愿意,你也可以使用:

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

于 2020-05-13T20:18:35.137 回答