golang高性能顶级域名(eTLD)提取插件库go-fasttld的使用

Golang高性能顶级域名(eTLD)提取插件库go-fasttld的使用

概述

go-fasttld 是一个高性能的有效顶级域名(eTLD)提取模块,可以从URL中提取子组件。URL可以包含主机名、IPv4地址或IPv6地址。eTLD提取基于Mozilla公共后缀列表,支持像’blogspot.co.uk’和’sinaapp.com’这样的私有域名。

安装

go get github.com/elliotwutingfeng/go-fasttld

使用示例

基本用法

// 初始化fasttld提取器
extractor, _ := fasttld.New(fasttld.SuffixListParams{})

// 提取URL子组件
url := "https://user@a.subdomain.example.a%63.uk:5000/a/b?id=42"
res, _ := extractor.Extract(fasttld.URLParams{URL: url})

// 显示结果
fasttld.PrintRes(url, res) // 漂亮地打印res.Scheme, res.UserInfo, res.SubDomain等

结果示例:

Scheme UserInfo SubDomain Domain Suffix RegisteredDomain Port Path HostType
https:// user a.subdomain example a%63.uk example.a%63.uk 5000 /a/b?id=42 hostname

IPv4地址处理

extractor, _ := fasttld.New(fasttld.SuffixListParams{})
url := "https://127.0.0.1:5000"
res, _ := extractor.Extract(fasttld.URLParams{URL: url})

IPv6地址处理

extractor, _ := fasttld.New(fasttld.SuffixListParams{})
url := "https://[aBcD:ef01:2345:6789:aBcD:ef01:2345:6789]:5000"
res, _ := extractor.Extract(fasttld.URLParams{URL: url})

国际化标签分隔符支持

go-fasttld 支持以下国际化标签分隔符(IETF RFC 3490):

全角句号 表意全角句号 全宽全角句号 半宽表意全角句号
U+002E . U+3002 U+FF0E U+FF61
extractor, _ := fasttld.New(fasttld.SuffixListParams{})
url := "https://brb\u002ei\u3002am\uff0egoing\uff61to\uff0ebe\u3002a\uff61fk"
res, _ := extractor.Extract(fasttld.URLParams{URL: url})

高级选项

自定义公共后缀列表文件

cacheFilePath := "/absolute/path/to/file.dat"
extractor, err := fasttld.New(fasttld.SuffixListParams{CacheFilePath: cacheFilePath})

更新公共后缀列表缓存

// 如果未指定CacheFilePath且本地缓存超过3天,将自动更新
extractor, _ := fasttld.New(fasttld.SuffixListParams{})

// 手动更新本地缓存
if err := extractor.Update(); err != nil {
    log.Println(err)
}

私有域名处理

默认情况下排除私有域名(如blogspot.com):

extractor, _ := fasttld.New(fasttld.SuffixListParams{})
url := "https://google.blogspot.com"
res, _ := extractor.Extract(fasttld.URLParams{URL: url})

要包含私有域名:

extractor, _ := fasttld.New(fasttld.SuffixListParams{IncludePrivateSuffix: true})
url := "https://google.blogspot.com"
res, _ := extractor.Extract(fasttld.URLParams{URL: url})

忽略子域名

extractor, _ := fasttld.New(fasttld.SuffixListParams{})
url := "https://maps.google.com"
res, _ := extractor.Extract(fasttld.URLParams{URL: url, IgnoreSubDomains: true})

Punycode转换

默认不转换国际化URL:

extractor, _ := fasttld.New(fasttld.SuffixListParams{})
url := "https://hello.世界.com"
res, _ := extractor.Extract(fasttld.URLParams{URL: url})

转换为Punycode:

extractor, _ := fasttld.New(fasttld.SuffixListParams{})
url := "https://hello.世界.com"
res, _ := extractor.Extract(fasttld.URLParams{URL: url, ConvertURLToPunyCode: true})

错误处理

如果URL无效,Extract()返回的第二个值error将非nil。仍然可以从第一个返回值ExtractResult中检索部分提取的子组件。

extractor, _ := fasttld.New(fasttld.SuffixListParams{})
url := "https://example!.com" // 主机名中包含无效字符
if res, err := extractor.Extract(fasttld.URLParams{URL: url}); err != nil {
    fmt.Println("Error:", err)
}
fasttld.PrintRes(url, res) // 仍然可以检索部分提取的子组件

性能

go-fasttld 在长URL上表现尤其出色。基准测试显示它在各种场景下都优于其他类似库。

实现细节

go-fasttld 使用压缩字典树(trie)存储eTLD,URL主机子组件从右到左解析,直到找不到更多匹配节点。这种方法提供了高效的eTLD提取性能。

致谢

该模块是Python fasttld模块的移植版本,并增加了对完整URL、IPv4和IPv6地址子组件提取的支持。


更多关于golang高性能顶级域名(eTLD)提取插件库go-fasttld的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang高性能顶级域名(eTLD)提取插件库go-fasttld的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


go-fasttld: 高性能顶级域名(eTLD)提取库

go-fasttld 是一个用于提取顶级域名(eTLD)的高性能 Go 语言库,它基于 Mozilla 的公共后缀列表(Public Suffix List),能够准确识别和提取域名的各个组成部分。

主要特性

  • 高性能解析
  • 支持最新的公共后缀列表
  • 线程安全
  • 简单易用的 API
  • 自动更新公共后缀列表

安装

go get github.com/elliotwutingfeng/go-fasttld

基本使用

初始化解析器

package main

import (
	"fmt"
	"github.com/elliotwutingfeng/go-fasttld"
)

func main() {
	// 创建解析器实例
	extractor, err := fasttld.New(fasttld.SuffixListParams{})
	if err != nil {
		panic(err)
	}
	
	// 使用默认选项创建解析器(推荐)
	extractor := fasttld.NewDefault()
}

提取域名组成部分

// 解析URL或域名
result, err := extractor.Extract(fasttld.URLParams{
	URL: "https://sub.example.co.uk/path?query=value",
})
if err != nil {
	panic(err)
}

fmt.Printf("完整域名: %s\n", result.Domain)      // example.co.uk
fmt.Printf("子域名: %s\n", result.SubDomain)    // sub
fmt.Printf("根域名: %s\n", result.RootDomain)   // example.co.uk
fmt.Printf("顶级域名: %s\n", result.TLD)        // co.uk
fmt.Printf("注册域名: %s\n", result.RegisteredDomain) // example.co.uk
fmt.Printf("子域名+根域名: %s\n", result.SubDomain+"."+result.RootDomain) // sub.example.co.uk

批量处理

urls := []string{
	"https://www.google.com",
	"https://sub.example.co.uk",
	"https://a.b.c.example.io",
}

for _, url := range urls {
	result, err := extractor.Extract(fasttld.URLParams{URL: url})
	if err != nil {
		fmt.Printf("Error processing %s: %v\n", url, err)
		continue
	}
	fmt.Printf("%s -> Root: %s, Sub: %s\n", url, result.RootDomain, result.SubDomain)
}

高级用法

自定义公共后缀列表

extractor, err := fasttld.New(fasttld.SuffixListParams{
	// 使用自定义的公共后缀列表URL
	URL: "https://example.com/custom_suffix_list.dat",
	
	// 禁用自动更新
	AutoUpdate: false,
	
	// 自定义缓存文件路径
	CacheFile: "/tmp/custom_suffix_list.dat",
})

处理国际化域名(IDN)

result, err := extractor.Extract(fasttld.URLParams{
	URL: "https://xn--mgbh0fb.xn--kgbechtv",
	// 启用IDN转换
	ConvertIDN: true,
})

fmt.Println(result.Domain) // 输出: موقع.شبكة

性能优化

对于需要处理大量域名的场景,可以重复使用解析器实例:

// 初始化一次
extractor := fasttld.NewDefault()

// 在goroutine中并发使用
var wg sync.WaitGroup
urls := []string{"https://a.example.com", "https://b.example.org"}

for _, url := range urls {
	wg.Add(1)
	go func(u string) {
		defer wg.Done()
		result, _ := extractor.Extract(fasttld.URLParams{URL: u})
		fmt.Println(result.RootDomain)
	}(url)
}
wg.Wait()

性能对比

go-fasttld 经过优化,比其他同类库有显著的性能提升:

  • 比标准库的 net/url 更快
  • 比纯正则表达式解决方案更准确
  • 内存占用更低

使用场景

  1. 网站分析工具
  2. 日志处理系统
  3. 网络安全应用
  4. 广告跟踪系统
  5. 任何需要精确识别域名组成部分的应用

注意事项

  • 该库会自动缓存和更新公共后缀列表,默认情况下每天检查一次更新
  • 对于离线应用,可以禁用自动更新功能
  • 处理国际化域名时,确保系统支持IDN转换

go-fasttld 是一个强大而高效的工具,能够满足大多数域名解析需求,特别是在需要处理大量域名的场景下表现优异。

回到顶部