去年,我购买了域名cvtutorials.com(一口气买了10年的:p),打算在这个网站以及自己的公众号:机器视觉全栈er上输出机器视觉领域文章,跌跌撞撞已经有大半年了。
由于不可抗因素,部分地区访问网站无法显示界面,我也无能为力:p
回过头来看,我选的域名还是蛮好的嘛(厚着脸皮),cv指的是计算机视觉,后面的tutorials意思是教程,你要是问我为啥没选mvtutorials,正好和机器视觉全栈er有呼应啊?那是因为我考虑到mv还有music video之意,所以就避开了。
恰好:p,我有机会接触到了web3.0,也想给自己的网站搞个web3.0时代的域名。首先我就利用python自己写了个代码实现web3.0域名的批量查询,看看域名是否已经注册了,看看能不能捡个漏。代码(代码获取方式直接到最后
)实现的主要组成部分如下:
web3.0是web2.0和区块链的结合。和web2.0不同的是,web3.0时代的数据和内容不会被少数的大型科技公司垄断,会被参与者自己掌握。
web 1.0:1991~2004
web 2.0:2004~?
web 3.0:2014~?
web3.0时代,基于以太坊开发的Dapp层出不穷。和web2.0时代用可读性好的域名代替IP地址类似,web3.0时代,用可读性好的域名去替代地址(我个人觉得这个钱包地址类似身份证是你的身份),ENS就是其中的代表性的域名服务。ENS全称是Ethereum Name Service(以太坊域名服务),是从以太坊基金会孵化出来的。
我们打开浏览器,在地址栏中输入app.ens.domains,可以看到如下界面:
在搜索框中输入cvtutorials,我们可以看到cvtutorials.eth还没有注册:p(Available表示没有被注册)
通过地址栏可以看出,为了想验证某个域名是否被注册,可以直接访问https://app.ens.domain/search/<domain_name>
地址即可。首先,我们需要批量生成我们想要探查的域名,代码如下:
import csv
# 访问域名的前缀
base_url = "https://app.ens.domains/search/"
# 从words5_ori.csv文件中获取单词用来批量生成域名
words5_ori = []
csv_reader = csv.reader(open("./words5_ori.csv"))
for line in csv_reader:
words5_ori.append(line)
# 对单词表中的单词进行处理,包括移除两个字母的单词、移除空格等(移除的都是不符合ens域名规则的)
words5_remove_twocharacters = [i for i in words5_ori if len(i[0])>2]
words5_remove_space = [i for i in words5_remove_twocharacters if " " not in i[0]]
req_urls = [base_url + i[0] for i in words5_remove_space]
这样我们就生成了req_urls列表,里面是待检测的域名集合。
Selinum是一个开源的web UI自动化测试工具,可以通过浏览器的驱动程序(根据自己浏览器版本进行选择,点击这里进入下载界面)支持编程语言的开发。我们选择的浏览器是谷歌浏览器,需要下载谷歌浏览器的驱动。点击帮助--关于google chrom,可以看到google浏览器版本
将压缩包解压后,可以将ChromeDriver.exe放在固定路径下,然后将该路径放入到环境变量里即可。
根据下面的代码片段实现浏览器的无界面模式(不会看到浏览器打开)访问及关闭。
# 需要用pip install selenium安装selenium包
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
chrome_options=Options()
#设置chrome浏览器无界面模式,如果将这行代码去掉,会自动弹出浏览器
chrome_options.add_argument('--headless')
browser = webdriver.Chrome(options=chrome_options)
browser.get(url)
# TODO:将你想要执行的代码放在这里
# 关闭浏览器
browser.close()
# 关闭chreomedriver进程
browser.quit()
根据前面的教程,我们已经知道如何生成域名以及自动操作浏览器了,现在需要得到访问网页之后的反馈结果,访问的域名是注册还是没有注册,也就是看搜索域名后,这个域名是available还是unavailable,前面已经有available了,现在,我们来看下unavailable的案例:
我们希望从箭头所指的地方读取英文单词,根据available还是unavailable就可以判断域名是否被注册,我们在谷歌浏览器中右击页面,点击检查,点击箭头所指符号:
将鼠标悬停到目标位置(这里是unavailable单词处)然后点击该处。
然后右边元素代码会高亮:
然后我们右击该处,选择copy,选择Copy XPath。
你就会得到如下值://*[@id="root"]/div/main/div[2]/a/div[1]/div。然后输出几个常见的eth后缀的域名,我们发现这个位置就对应available或unavailable。我们可以通过find_element()函数,利用XPATH定位元素的方法,获取到这个元素的值,这样我们就知道了域名是否已经注册。
chrome_options=Options()
#设置chrome浏览器无界面模式
chrome_options.add_argument('--headless')
browser = webdriver.Chrome(options=chrome_options)
browser.get(url)
while 1:
try:
# global ens_dict
# res = browser.find_element_by_xpath('//*[@id="root"]/div/main/div[2]/a/div[1]/div')
ens_status = browser.find_element(by=By.XPATH, value='//*[@id="root"]/div/main/div[2]/a/div[1]/div')
ens_name = browser.find_element(by=By.XPATH, value='//*[@id="root"]/div/main/div[2]/a/h2')
ens_dict[ens_name.text[:3]] = ens_status.text
if ens_status.text == "Available":
tf = open(ens_name.text[:3]+".json", "w")
json.dump(ens_dict, tf)
tf.close()
break
except:
pass
# 关闭浏览器
browser.close()
# 关闭chreomedriver进程
browser.quit()
由于python中的GIL的原因,我们选用多进程库multiprocessing去运行函数。num_workers根据自己的实际需求进行设置,我的CPU为16核心32线程,我就随便选了个数字8。
# 设置并行数
num_workers = 8
pool = multiprocessing.Pool(processes=num_workers)
pool_outputs = pool.map(test_ens_name, req_urls)
pool.close()
pool.join()
就在我用完这个方法后,发现了有python库有这个功能,放在下一期吧:p,关注公众号机器视觉全栈er,后台回复ens即可获取单词的csv文件及项目源码。(浏览器驱动要和你自己的浏览器对应)
后面还有批量制作NFT
参考文献: