没有输出的输入是不完整的

0%

python-域名抽取

在看scrapy-cluster源码的时候发现了一个非常实用的包-tldextract,
可以非常方便的抽取出一个url的域名作为redis的key的一部分,感觉很神奇。所以记录一下。

对于 www.kingwen.cn 这个网址,tldextract 可以提取出三部分:www、kingwen、cn,分别对应子域 subdomain、主体标签 domain、公共后缀 suffix。这里 cn 是顶级域,kingwen.cn 是其下一级域名,www.kingwen.cn 再下一级。有了这个包,我们就不用自己拆分啦。

安装tldextract包

1
pip3 install tldextract

使用tldextract包

1
2
3
4
5
6
7
8
9
10
import tldextract

if __name__ == '__main__':
url = 'www.kingwen.cn'
res = tldextract.extract(url)
print(res.subdomain, res.domain, res.suffix) # www kingwen cn
print(res.top_domain_under_public_suffix) # kingwen.cn(较新版本;旧版属性名为 registered_domain)
url1 = 'localhost:8080/hello'
res = tldextract.extract(url1)
print(res.subdomain, res.domain, res.suffix) # '' localhost ''

源码实现

主要分为三部分。

  • 首先是进行切割,将输入的url进行划分,利用# ? @ : 等特殊符号进行不断的划分,最后将主体的域名部分提取出来。
  • 其次将前一步得到的域名按’.'切分成list。从位置i到末尾逐段匹配公共后缀列表PSL,找到匹配的位置i。当时查看的列表有7336条记录,这个数量会随列表更新而变化。
  • 找到公共后缀且 i > 0 时,list[i:]就是suffix,list[:i-1]就是subdomain,list[i-1]就是domain。如果没有找到公共后缀,或后缀前没有主体标签,还需要单独处理。

尽管比较简单,但是比较实用,所以就记录一下。
在以后用到的时候可以省去很多烦恼。