You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python固定端口IP段扫描脚本运行过慢,如何实现并发请求提速?

Python IP段扫描脚本并发改造方案

核心优化点

  • 采用线程池实现IO密集型请求并发,默认并发数设置为25,可自行调整至20~30区间
  • 新增请求超时配置,避免无响应IP长时间阻塞任务
  • 修复原代码IP段扫描遗漏问题:第三段IP递增后,第四段IP会从0开始扫描而非保持初始输入的起始值
  • 新增线程锁保证多线程场景下文件写入安全,不会出现内容错乱
  • 移除原代码中未定义的print_look上下文逻辑(原代码遗留错误会直接导致运行报错)

完整改造后代码

import requests
import colorama
import threading
from concurrent.futures import ThreadPoolExecutor
from colorama import Fore, Back, Style
colorama.init(autoreset=True)

# 配置参数
MAX_WORKERS = 25  # 并发请求数,可自行调整为20~30之间
REQUEST_TIMEOUT = 5  # 单个请求超时时间,单位秒
OUTPUT_FILE = r"D:\prueba.txt"

# 全局文件锁,避免多线程写文件冲突
file_lock = threading.Lock()

# 登录请求参数
payload = {
    'username': 'username',
    'password': 'password',
    "login_button": 'Login'
}

def scan_url(enlace):
    """单个IP扫描逻辑"""
    try:
        with requests.Session() as s:
            peticion = s.get(enlace, timeout=REQUEST_TIMEOUT)
            if peticion.status_code == 200:
                s.post(enlace, data=payload, timeout=REQUEST_TIMEOUT)
                # 加锁保证打印和写文件安全
                with file_lock:
                    print(enlace + Fore.GREEN + " Respuesta:" + Fore.GREEN + "EXITO")
                    with open(OUTPUT_FILE, "a+", encoding="utf8") as panel:
                        panel.write(enlace + "\n")
    except Exception:
        pass

if __name__ == "__main__":
    ip = input("Ingrese ip a escanear: ")
    puerto = input("Ingrese puerto: ")

    parte = ip.split(".")
    parts_0 = parte[0]
    parts_1 = parte[1]
    parts_2 = int(parte[2])
    parts_3 = int(parte[3])

    # 生成所有待扫描的URL
    url_list = []
    for n in range(parts_2, 256):
        # 第三段IP为起始值时,第四段从输入的起始值开始,否则从0开始
        start_x = parts_3 if n == parts_2 else 0
        for x in range(start_x, 256):
            enlace = f"http://{parts_0}.{parts_1}.{n}.{x}:{puerto}/login.php"
            url_list.append(enlace)

    # 先清空输出文件
    with open(OUTPUT_FILE, "w") as f:
        pass

    # 启动线程池并发扫描
    print(f"开始扫描,总任务数:{len(url_list)},并发数:{MAX_WORKERS}")
    with ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor:
        executor.map(scan_url, url_list)
    
    print("扫描完成")

调整说明

  • 如需修改并发数,直接调整MAX_WORKERS参数即可
  • 如网络环境较差,可适当调高REQUEST_TIMEOUT的数值
  • 原逻辑保持不变:仅GET请求状态码为200的IP会发送登录请求,符合条件的IP写入指定本地文件

内容的提问来源于stack exchange,提问作者nicolas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 11:54:08