我正在开发一个应用程序,如果用户不在我们的浏览器列表中,它将重定向用户升级浏览器。
我的目标是根据其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;
}
有人可以指出我出了问题的地方吗?
如果您查看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;
}
有成千上万的搜寻器,包括在.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(); } }
然后非常简单:
:普通搜寻器RobotMobile:模拟移动设备的爬虫RobotImitator:这不是爬虫,而是模仿爬虫的东西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; }
机器人
如果您愿意,也可以使用:
[var isHuman = UserAgentClassifier.IsHuman(ua);
在这种情况下,您还处理被黑的用户代理和其他情况。