Python如何在while循环外使用变量且避免日志重复记录
问题根因
- 原始代码存在缩进错误:
while True是死循环,你把判断逻辑放在循环体外的话,代码会永远卡在循环里反复请求接口,永远执行不到后面的判断代码,这就是放在循环外完全不运行的原因。 - 当你把判断逻辑移到循环内后,循环会反复请求接口,只要接口返回的最新模型没有更新,每次都会触发打印/写入逻辑,自然就会出现重复日志。
解决思路
新增一个变量存储上一次已经记录过的模型AssetId,每次请求接口后先对比当前返回的AssetId和上一次存储的是否一致,只有不一致且符合过滤规则的时候,才执行打印和写日志操作,同时更新存储的AssetId。
修正后可运行代码
import os import requests import sys from colorama import Fore import time # 新增:避免请求太频繁被接口限制 os.system('cls') # 初始化存储上一次已记录的模型ID,避免重复 last_asset_id = None while True: # 请求接口加异常捕获,避免接口报错直接导致脚本崩溃 try: info = requests.get("https://search.roblox.com/catalog/json?CatalogContect=2&Category=6&SortType=3&ResultsPerPage=1", timeout=10).json() current_asset = info[0] current_id = current_asset['AssetId'] current_name = current_asset['Name'] except Exception as e: print(f"[{Fore.RED}!{Fore.RESET}] 请求接口出错: {str(e)}") time.sleep(2) continue # 过滤规则 + 去重判断:只有ID和上一次不一样且不是要过滤的名称时才记录 if current_id != last_asset_id and current_name not in ["DreamGrim", ".gg/Fgj3VRGapz"]: log_content = f"[+] Logged model: {current_name} | https://www.roblox.com/library/{current_id}/{current_name}" # 打印带颜色的输出 print(f"[{Fore.LIGHTGREEN_EX}+{Fore.RESET}] Logged model: {current_name} | https://www.roblox.com/library/{current_id}/{current_name}") # 写入日志 with open('logs.txt', 'a', encoding='utf-8') as f: f.write(f"\n{log_content}") # 更新上一次记录的ID last_asset_id = current_id # 每次请求后加间隔,避免请求频率太高被封禁,可根据需要调整间隔时长 time.sleep(2)
额外优化说明
- 新增了接口请求异常捕获,避免接口临时故障导致脚本直接退出
- 新增了请求间隔,避免短时间大量请求触发平台的反爬限制
- 统一了字符串拼接写法,用f-string更简洁易读
- 写文件指定了utf-8编码,避免特殊名称导致写入报错
内容的提问来源于stack exchange,提问作者Vasiok Tankist
相关产品推荐
相关产品推荐

