User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
百度百科
在 ASP.NET Core 中,可以通过以下代码在 Action 中获取到一个 HTTP 请求的 User Agent 信息:
if (Request.Headers.TryGetValue("User-Agent", out var userAgent)) { await Response.WriteAsync("User Agent:" + userAgent); }
一个常见的 UA 字符串可以是下面这个样子:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36
UAParser
可以通过一个名为 UAParser 的组件对 User Agent 进行解析:
var parser = Parser.GetDefault(); var info = parser.Parse("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36"); info.Device.Dump("设备信息"); info.OS.Dump("操作系统信息"); info.UA.Dump("用户代理信息");
注意:Dump 扩展方法来自 LINQPad ,可以在码农很忙搜索 LINQPad 了解更多信息。
输出信息如下:
其中,UAParser.Device
类型的 IsSpider
属性表示这个 User Agent 是否代表一个网络爬虫。以 Google 搜索引擎为例,它的 User Agent 是这样的:
Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
这将会产生如下输出:
可以看到,UAParser告诉我们,这是一个来自于蜘蛛的 User Agent。
rDNS
即便我们使用 UAParser 根据 User Agent 做出了爬虫的判定,但因为 User Agent 的伪造成本极低,我们仍需要一个更严格的规则来确定该请求是否真的来自一个搜索引擎蜘蛛,在一些防爬取场景下更是如此。
可逆DNS(rDNS,reverse DNS)是一种把一个IP地址分解成一个域名的方法,正像域名系统(DNS)把域名分解成关联的IP地址。
大型的搜索引擎提供商,比如谷歌、百度以及微软均会有固定的 IP 地址作为爬虫的 IP ,并且会将这些 IP 做 rDNS 解析。可以通过查询某个 IP 的 rDNS 解析记录,来判断这个 IP 到底是不是真的来自谷歌或者百度。
以谷歌爬虫的某个 IP:66.249.79.250 为例,在 Windows 系统上,可以使用 nslookup 命令查询该 IP 的 rDNS 记录:
但如果是一个伪造的搜索引擎蜘蛛,则该 IP 不存在 rDNS 记录或者记录并不来自对应的搜索引擎:
可以使用系统内置的 Dns 类来获取一个 IP 的 rDNS 解析记录:
Dns.GetHostEntry("66.249.79.250").Dump();
GetHostEntry
方法也提供异步的版本: GetHostAddressesAsync
。如果在正式程序中使用该代码,请做好异常处理。
总结
本文讲述了如何在 ASP.NET Core 项目中获取用户的 User Agent 信息,并通过 UAParser 组件对获取到的 User Agent 进行解析。以及如何通过来访 IP 判断一个请求是否真的来自一个搜索引擎爬虫。