我正在开发一个应用程序,如果用户不在我们的浏览器列表中,则会重定向用户以升级浏览器。
我的目标是创建一个例外,根据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;
}
有人能指出我哪里出错了吗?
答案 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);
在这种情况下,您还可以处理被黑的用户代理和其他情况。