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
更多关于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
更快 - 比纯正则表达式解决方案更准确
- 内存占用更低
使用场景
- 网站分析工具
- 日志处理系统
- 网络安全应用
- 广告跟踪系统
- 任何需要精确识别域名组成部分的应用
注意事项
- 该库会自动缓存和更新公共后缀列表,默认情况下每天检查一次更新
- 对于离线应用,可以禁用自动更新功能
- 处理国际化域名时,确保系统支持IDN转换
go-fasttld 是一个强大而高效的工具,能够满足大多数域名解析需求,特别是在需要处理大量域名的场景下表现优异。