IP域名提取小工具
IP域名提取工具,之前用HTML+js写了个,后来发现大文件复制粘贴之后直接卡死,之前也写过,比较短,零零碎碎的要么只有IP,要么只有域名,还没有多线程,索性就再用python 脚本写一个,权当练手,大佬轻喷。
一、流程设计
这个没啥好说的,直接上图。从文件类型匹配,到大文件分割,最终返回要读取的文件列表,使用多线程读取文件并进行IP域名匹配,最终写入文件,下图只是初步设计的思路,可能跟最终代码某些部分不是很匹配。
二、实现功能
本来以为可以简单写下,一码码了几百行,主要是因为分的情况有点多,端口、协议、去重、读文件、读目录、从文件分割、多线程读取。
repo:https://github.com/SevenC-base/Gadgets/
1、大文件分割
# 打开分割的大文件
with open (file_name, "r", encoding="utf-8") as f0:
buf = f0.readlines ()
all_line_num = len (buf)
counter = all_line_num // LINE_NUM
print ("------------------------------------------分割总数: %s-------------------" % counter)
tail_counter = all_line_num % LINE_NUM
# print ("tail_counter-> ", tail_counter)
# 行数不够直接跳出,前去匹配
if all_line_num <= LINE_NUM:
print ("行数不够", all_line_num)
else:
while n < counter + 2:
# 在data目录下构造需要分割的大文件的每一个小文件文件名,eg:abc.txt -> abc-split-1.txt
filename_write_path = file_path1 + "\\data---split\\" + filename0 + "-split-%s" % n + ".txt"
# 分割后的小文件名
# filename_split = filename0 + "-split-%s" % n + file_suffix
# 分割后小文件存储列表
filename_split_list.append (filename_write_path)
# 最后不满2000000行的直接从末尾计算
if n == counter + 1:
with open (filename_write_path, "w") as f1:
for b in buf[-tail_counter:]:
f1.write (b)
else:
with open (filename_write_path, "w") as f2:
for b1 in buf[(n * LINE_NUM):((n + 1) * LINE_NUM)]:
f2.write (b1)
n = n + 1
2、多线程读文件
if len (files_list_all) > 10:
# list_num分割后单个列表长度
list_num = len (files_list_all) // 10
# 线程池
threads = []
# 列表存储结果
result = {'r1': [], 'r2': [], 'r3': [], 'r4': []}
# 按照10个线程拆分读取的文件列表
for i in range (10):
list_f = files_list_all[i * (list_num + 1):(i + 1) * (list_num + 1)]
if len (list_f) != 0:
thread1 = MyThread (func=test.read_file_list, args=(files_list_all, args, pattern0))
thread1.start ()
threads.append (thread1)
# 阻塞主线程,获取每个线程执行结果
for j in threads:
j.join ()
ree = j.get_result ()
# print (ree)
# 判断key键是否存在
for k, v in ree.items ():
if k in result.keys ():
result[k] = ree[k] + result[k]
else:
pass
三、效果展示
本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 (CC BY-NC-ND 4.0) 进行许可。