*python新手,如果有不好的地方欢迎指出,谢谢。***
1、功能
实现批量查询域名的IP地址,循环执行。加入循环是为了解析结果能尽量全。
可使用自定义DNS(默认为本机DNS),自定义循环次数(默认3次)。
结果:
2、说明
同一目录下建立domain.txt文件,存放需要查询的域名
file = './domain.txt' # 域名文件,可自定义文件
输出文件配置,输入为csv格式
dst_file = './domain_result.csv'
3、完整代码
# BY KinFang
import os
import csv
import subprocess
file = './domain.txt'
# dst_file = 'd:/domain_result.txt'
dst_file = './domain_result.csv'
# 去重
def DeDuplication(old_list):
new_list = [list(t) for t in set(tuple(_) for _ in old_list)] # 将源列表转换成集合,去重
# print(new_list)
sorted_list = sorted(new_list)
with open(dst_file, 'w', encoding='utf-8', newline='') as f:
csvwrite = csv.writer(f)
csvwrite.writerows(sorted_list)
def find_domain(domain, result_list):
if dns == '':
ret = subprocess.getoutput(f'nslookup {domain}')
else:
ret = subprocess.getoutput(f'nslookup {domain} {dns}')
lst = ret.split('\n') # str转为list
# print(lst)
for item in lst[6:]: # 从第7个元素开始循环
if item.startswith('Aliases'): # 循环到列表中的Aliases开头就停止循环
break
else:
if item.startswith('Address') or item.startswith('\t'): # 匹配ip地址,有以address开头,有以\t开头
if 'Address' in item:
newline = item.split(': ')[1].strip()
else:
newline = item.split(': ')[0].strip()
result_list.append([domain] + [newline])
def readconfig(result_list):
with open(file, 'r', encoding='utf-8') as f:
for line in f:
if line.startswith('#'):
continue
new_line = line.strip()
find_domain(new_line, result_list)
def main():
result_list = []
# 读取域名文件
print('-' * 30)
print(f'每个域名将执行{num}遍')
print('-'*30)
for i in range(1, num + 1):
print(f'第{i}遍开始执行...')
readconfig(result_list)
# print(result_list)
print('-' * 30)
print('结果处理中...')
print('-' * 30)
# 对数据进行去重
DeDuplication(result_list)
if __name__ == '__main__':
if not os.path.exists(file):
print('domain.txt文件不存在,请先创建文件')
os.system('pause')
exit()
for i in range(3):
try:
dns = input('请输入DNS地址(不输入将采用本机默认DNS):').strip()
num = input('输入需要循环几次(默认3次):').strip()
if num == '':
num = 3
else:
num = int(num)
main()
print('执行完成!!!')
print()
break
except:
print('输入有误,请重输!')
os.system('pause')
exit()
|