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

Python for循环递增IP段遇活跃IP时计数器不暂停如何解决

问题修复方案

核心问题原因

  • Python的for number1 in range(1,254)是基于迭代器的遍历,运行时会提前生成好1-253的序列,每次循环自动取下一个值,手动修改number1的数值不会影响下一次循环的取值,所以尝试给number1减1的操作不会生效。
  • 原代码将IP列表遍历放在网段循环内部,遇到活跃IP时仅做等待,没有阻止网段计数器自动递增,自然会出现网段跳变的情况。
  • 原有代码还存在log函数未正确关闭文件、每次循环重复读取IP活跃文件效率极低、IP匹配时未去除换行符导致匹配错误等附加问题。

修复后完整代码

#!/usr/bin/env python3
import requests
import time

headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0',
    'Accept-Encoding': 'gzip, deflate',
    'Upgrade-Insecure-Requests': '1',
    'Accept-Language': 'en-US,en;q=0.5'
}

def log(ip):  
    with open("ip_active.txt","a+", encoding="utf-8") as f:
        f.write(ip + "\n")

def start_ip():
    # 提前读取所有可用IP到列表,避免每次循环读文件
    with open('ip_list.txt', 'r', encoding="utf-8") as f:
        ip_list = [ip.strip() for ip in f.readlines() if ip.strip()]
    number1 = 1
    while number1 < 254:
        start_ip = f'192.168.{number1}.1'
        end_ip = f'192.168.{number1}.254'
        # 提前读取活跃IP到集合,判断效率更高
        with open('ip_active.txt', 'r', encoding="utf-8") as f:
            active_ips = set([ip.strip() for ip in f.readlines() if ip.strip()])
        
        current_segment_success = False
        for ip in ip_list:
            if ip in active_ips:
                print(f'ip {ip} already active')
                time.sleep(2)
                # 活跃IP不处理,保持number1不变,跳出当前网段循环重试
                current_segment_success = False
                break
            try:
                log(ip)
                print(f'Running task: {ip} task.exe%20{start_ip}%20{end_ip}')
                target = ip.strip() + f'task.exe%20{start_ip}%20{end_ip}'
                r = requests.get(target, allow_redirects=True, verify=False, headers=headers, timeout=1)
                current_segment_success = True
            except requests.exceptions.RequestException:
                print('Timeout')
                continue
        # 只有当前网段所有IP都处理成功,才递增到下一个网段
        if current_segment_success:
            number1 += 1
              
def main():
    start_ip()
    
if __name__ == "__main__":
    main()

关键改动说明

  • 用while循环控制网段计数器number1的递增,只有当前网段任务全部执行成功才会+1进入下一个网段,遇到活跃IP时number1保持不变,会重新尝试当前网段。
  • 提前读取IP列表和活跃IP列表到内存,避免每次循环重复读文件,大幅提升运行效率。
  • 修复log函数的文件关闭问题,改用with上下文管理自动处理文件关闭,避免写入异常。
  • 明确捕获requests请求异常,避免裸except吞掉所有不可预知的错误。
  • 所有IP读取时都做了strip处理,去除换行符、空格等空白字符,避免匹配错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:45:04