IP域名提取小工具

N 人看过

在这里插入图片描述

       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) 进行许可。