golang浏览器能力检测与解析插件库browscap_go的使用

golang浏览器能力检测与解析插件库browscap_go的使用

介绍

PHP有get_browser()函数可以检测用户浏览器的能力。这是Go语言中类似get_browser()功能的实现。

browscap.ini文件是一个数据库,提供了大量关于浏览器及其能力的详细信息,如名称、版本、JavaScript支持等。

快速开始

首先需要使用browscap.ini文件初始化库,然后可以获取浏览器信息作为Browser结构体。

import (
	"fmt"
	bgo "github.com/digitalcrab/browscap_go"
)

func main() {
	// 初始化browscap库,参数1是browscap.ini文件路径,参数2表示是否使用缓存
	if err := bgo.InitBrowsCap("browscap.ini", false); err != nil {
		panic(err)
	}
	
	// 解析用户代理字符串
	browser, ok := bgo.GetBrowser("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36")
	if !ok || browser == nil {
    	panic("Browser not found")
	} else {
    	// 输出浏览器信息
    	fmt.Printf("Browser = %s [%s] v%s\n", browser.Browser, browser.BrowserType, browser.BrowserVersion)
    	fmt.Printf("Platform = %s v%s\n", browser.Platform, browser.PlatformVersion)
    	fmt.Printf("Device = %s [%s] %s\n", browser.DeviceName, browser.DeviceType, browser.DeviceBrand)
    	fmt.Printf("IsCrawler = %t\n", browser.IsCrawler())
    	fmt.Printf("IsMobile = %t\n", browser.IsMobile())
	}
}

完整示例

下面是一个更完整的示例,展示了如何使用browscap_go库:

package main

import (
	"fmt"
	"log"
	bgo "github.com/digitalcrab/browscap_go"
)

func main() {
	// 初始化browscap库
	err := bgo.InitBrowsCap("browscap.ini", true) // 第二个参数true表示使用缓存
	if err != nil {
		log.Fatalf("初始化browscap失败: %v", err)
	}

	// 测试的用户代理字符串
	userAgents := []string{
		"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
		"Mozilla/5.0 (iPhone; CPU iPhone OS 14_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1",
		"Googlebot/2.1 (+http://www.google.com/bot.html)",
	}

	for _, ua := range userAgents {
		fmt.Printf("\n解析用户代理: %s\n", ua)
		
		browser, ok := bgo.GetBrowser(ua)
		if !ok || browser == nil {
			fmt.Println("未识别的浏览器")
			continue
		}

		// 输出浏览器详细信息
		fmt.Println("=== 浏览器信息 ===")
		fmt.Printf("名称: %s\n", browser.Browser)
		fmt.Printf("类型: %s\n", browser.BrowserType)
		fmt.Printf("版本: %s\n", browser.BrowserVersion)
		
		fmt.Println("\n=== 平台信息 ===")
		fmt.Printf("平台: %s\n", browser.Platform)
		fmt.Printf("平台版本: %s\n", browser.PlatformVersion)
		
		fmt.Println("\n=== 设备信息 ===")
		fmt.Printf("设备名称: %s\n", browser.DeviceName)
		fmt.Printf("设备类型: %s\n", browser.DeviceType)
		fmt.Printf("设备品牌: %s\n", browser.DeviceBrand)
		
		fmt.Println("\n=== 能力检测 ===")
		fmt.Printf("是爬虫: %t\n", browser.IsCrawler())
		fmt.Printf("是移动设备: %t\n", browser.IsMobile())
		fmt.Printf("支持Cookies: %t\n", browser.Cookies)
		fmt.Printf("支持JavaScript: %t\n", browser.JavaScript)
	}
}

许可证

The MIT License (MIT)

Copyright (c) 2015 Maksim Naumov

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

更多关于golang浏览器能力检测与解析插件库browscap_go的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang浏览器能力检测与解析插件库browscap_go的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


browscap_go - Golang浏览器能力检测与解析库

browscap_go是一个用于解析浏览器User-Agent字符串的Golang库,它基于Browscap项目的数据,可以识别浏览器类型、版本、设备类型等信息。

安装

go get github.com/philipjkim/browscap_go

基本使用

1. 初始化解析器

package main

import (
	"fmt"
	"log"
	"time"

	"github.com/philipjkim/browscap_go"
)

func main() {
	// 创建解析器实例
	parser, err := browscap_go.NewParser()
	if err != nil {
		log.Fatal(err)
	}

	// 设置自动更新间隔(可选)
	parser.SetAutoUpdate(true, 24*time.Hour) // 每24小时自动更新一次

	// 加载数据(第一次使用时会自动下载)
	err = parser.Init()
	if err != nil {
		log.Fatal(err)
	}
}

2. 解析User-Agent字符串

func parseUserAgent(parser *browscap_go.Parser, userAgent string) {
	// 解析User-Agent
	browser, err := parser.Parse(userAgent)
	if err != nil {
		log.Printf("解析失败: %v", err)
		return
	}

	// 输出解析结果
	fmt.Printf("浏览器: %s\n", browser.Browser)
	fmt.Printf("版本: %s\n", browser.Version)
	fmt.Printf("平台: %s\n", browser.Platform)
	fmt.Printf("设备类型: %s\n", browser.DeviceType)
	fmt.Printf("是否是爬虫: %v\n", browser.Crawler)
	fmt.Printf("是否是移动设备: %v\n", browser.IsMobileDevice)
}

3. 示例解析

func main() {
	parser, err := browscap_go.NewParser()
	if err != nil {
		log.Fatal(err)
	}
	err = parser.Init()
	if err != nil {
		log.Fatal(err)
	}

	// 测试不同的User-Agent
	userAgents := []string{
		"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
		"Mozilla/5.0 (iPhone; CPU iPhone OS 14_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1",
		"Googlebot/2.1 (+http://www.google.com/bot.html)",
	}

	for _, ua := range userAgents {
		fmt.Printf("\n解析User-Agent: %s\n", ua)
		parseUserAgent(parser, ua)
	}
}

高级功能

1. 自定义数据文件路径

func customDataPath() {
	// 设置自定义数据文件路径
	parser, err := browscap_go.NewParserWithOptions(&browscap_go.Options{
		CacheDir:      "/path/to/cache/dir",
		BrowscapFile:  "/path/to/browscap.ini",
		AutoUpdate:    true,
		UpdateTimeout: 30 * time.Second,
	})
	if err != nil {
		log.Fatal(err)
	}

	err = parser.Init()
	if err != nil {
		log.Fatal(err)
	}
}

2. 手动更新数据

func manualUpdate(parser *browscap_go.Parser) {
	// 检查是否有更新
	updateAvailable, err := parser.IsUpdateAvailable()
	if err != nil {
		log.Printf("检查更新失败: %v", err)
		return
	}

	if updateAvailable {
		fmt.Println("发现新版本数据,正在更新...")
		err = parser.Update()
		if err != nil {
			log.Printf("更新失败: %v", err)
		} else {
			fmt.Println("更新成功")
		}
	} else {
		fmt.Println("已是最新版本")
	}
}

性能优化

对于高并发场景,可以考虑以下优化:

func concurrentParsing(parser *browscap_go.Parser, userAgents []string) {
	// 使用sync.Pool减少内存分配
	var wg sync.WaitGroup
	results := make(chan *browscap_go.Browser, len(userAgents))

	for _, ua := range userAgents {
		wg.Add(1)
		go func(ua string) {
			defer wg.Done()
			browser, _ := parser.Parse(ua)
			results <- browser
		}(ua)
	}

	go func() {
		wg.Wait()
		close(results)
	}()

	for browser := range results {
		fmt.Printf("解析结果: %+v\n", browser)
	}
}

注意事项

  1. 首次使用时会自动下载数据文件(约20MB),可能需要一些时间
  2. 数据文件会缓存在本地,默认位置是$HOME/.browscap_go/browscap.ini
  3. 对于移动应用中的User-Agent,可能需要额外处理
  4. 某些定制浏览器可能无法准确识别

替代方案

如果browscap_go不能满足需求,还可以考虑以下替代库:

browscap_go的优势在于它基于Browscap项目,提供了非常详细的浏览器能力信息,而不仅仅是简单的User-Agent解析。

回到顶部