tldextract
2021-08-22 00:00:00

在对子域名进行收集的时候,我们可能会得到如下所示的域名:

1
https://www.baidu.com/s?wd=%E5%B0%8F%E6%80%AA

当然你可以通过进行正则匹配的方法进行匹配,来回去www.baidu.com这个域名

也可以通过tldextract模块来进行匹配,个人认为第二种更简单

介绍使用

tldextract准确地从URL的域名和子域名分离通用顶级域名或国家顶级域名。 例如,http://www.google.com,你只想取出连接的 ‘google’ 部分。 每个人都会想到用 ‘.’ 拆分,来获取域名和后缀,但这是不准确的。并且只有当你想到简单的,例如.com域名,以 ‘.’ 截取最后2个元素得到结果。 想想如果解析,例如:http://forums.bbc.co.uk,上面天真的分裂方法是有问题的,你会得到 ‘co’ 作为域名和“uk”为顶级域名,而不是“bbc”和“co.uk” 。tldextract有一个公共后缀列表 ,它可以匹配所有域名。 因此,给定一个URL,它从其域中知道其子域名,并且从其国家中知道其域名。

1
2
3
4
5
6
7
#示例1:
import tldextract

vol = tldextract.extract('https://www.baidu.com/s?wd=%E5%B0%8F%E6%80%AA')
print(vol)
#输出
#ExtractResult(subdomain='www', domain='baidu', suffix='com')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#简单实例
import requests
from lxml import etree
import tldextract

page = -2 #因为页面 0 8 18 28 38 拍哦徐
site=str(input('请输入域名:示例(baidu.com):'))
data1 = []


def bing_sera():
global page
global data1
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0',
'Accept': '*/*',
'Accept-Language': 'en-US,en;q=0.5',
'Accept-Encoding': 'gzip,deflate',
'referer': "http://cn.bing.com/"
}
while True:
# data2=data1.append(vol.fqdn)
#获取到带域名的连接
#当page<108,获取数据
if page<=108:
url='https://cn.bing.com/search?q=email+site%3{}&first={}&FORM=PORE'.format(site,page)
page_text = requests.get(url=url,headers=headers).text
tree = etree.HTML(page_text)
html_data=tree.xpath('//div[@id="b_content"]/main/ol/li/h2/a/@href') #xpath路径
# print(html_data)
data1.extend(html_data)
#对获取到的数据进行正则匹配,获取域名)
page += 10
#当page>108则,对数据进行处理
else:
data2=[]
for data in data1:
vol = tldextract.extract(data)
data2.append(vol.fqdn)
print(list(set(data2)))
break
bing_sera()