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
相关产品推荐
相关产品推荐

