为何for循环中途终止?网站Logo无法全部下载问题排查
解决Logo下载不稳定的问题
你的代码存在几个关键问题,导致下载结果不稳定,无法批量获取全部Logo:
核心问题分析
- 循环逻辑错误:
get_client_png函数里的for i in range(len(clients[i]))完全不符合需求——它是取单个客户端名称的字符长度来循环,而不是遍历整个客户端列表。这会导致每次只处理1个客户端,且循环次数等于该客户端名称的字符数,后续索引混乱,下载数量随机。 - 未处理请求失败:没有判断请求是否成功,若Clearbit不存在对应Logo(返回404等状态码),会把错误页面内容写入文件,甚至可能导致程序中途崩溃。
- 参数调用错误:调用
get_client_png(i)时,i未定义,属于全局变量缺失问题,运行时会报错(你能偶尔下载成功可能是之前运行遗留的临时变量导致)。
修复后的代码
import pandas as pd import requests # 读取客户端列表 df = pd.read_csv('devclients.csv') clients = df['Clients'].tolist() def clean_list(clients): cleaned = [] for client in clients: # 统一清理客户端名称格式 cleaned_client = client.lower().replace(" ", "").replace(".com", "").replace("&", "") cleaned.append(cleaned_client) return cleaned # 获取格式化后的客户端列表 cleaned_clients = clean_list(clients) def download_logos(clients_list): for client in clients_list: url = f"https://logo.clearbit.com/{client}.com" try: # 添加超时避免请求挂起 response = requests.get(url, timeout=10) # 检查请求是否成功,失败则抛出异常 response.raise_for_status() # 使用with语句确保文件正确关闭 with open(f"{client}.png", "wb") as f: f.write(response.content) print(f"✅ 成功下载:{client}") except requests.exceptions.RequestException as e: # 捕获所有请求异常,打印失败原因 print(f"❌ 下载失败 {client}:{str(e)}") # 执行批量下载 download_logos(cleaned_clients)
修复说明
- 重构清理逻辑:
clean_list返回新的清理列表,避免修改原列表,逻辑更清晰。 - 修正循环逻辑:直接遍历客户端列表,每个客户端单独处理,确保遍历所有条目。
- 异常处理:捕获请求超时、HTTP错误等异常,程序不会中途崩溃,同时能看到失败原因。
- 文件安全写入:用
with open管理文件,避免资源泄漏或文件损坏。 - 状态检查:通过
response.raise_for_status()确保只有成功的请求才会写入文件。
内容的提问来源于stack exchange,提问作者Christy Esmee
相关产品推荐
相关产品推荐

