Python请求遇ConnectionResetError,求t.me与Fragment检测脚本修复
修复方案:解决ConnectionResetError及脚本逻辑问题
问题概述
运行脚本时反复出现ConnectionResetError(10054)错误,调整超时、延迟后仍未解决;脚本需同时检测t.me与Fragment平台的用户名状态,当前逻辑存在多处缺陷。
原代码核心问题
- 重试逻辑未生效:定义了
retry_limit但未实现循环重试,仅捕获一次异常后直接继续循环,无法应对多次连接失败 - 请求频率过高:
time.sleep(0.01)几乎无延迟,触发服务器反爬机制,导致连接被强制关闭 - 异常捕获范围过窄:仅处理
ConnectionResetError,忽略了超时、HTTP错误等其他网络异常 - 字符串处理逻辑混乱:错误判断
words_array类型(循环变量为word),且列表元素去空格的操作无意义(用户名不允许空格) - Fragment请求无异常防护:该平台请求未做异常处理,失败会直接中断脚本
修复后的完整代码
import time import requests from bs4 import BeautifulSoup # 假设以下变量已提前定义:words, progress_bar, bar, headers, checked_words for word in words: if progress_bar: bar.next() # 统一清理用户名中的空白字符,跳过空值 cleaned_word = word.strip().replace("\n", "") if not cleaned_word: continue # 验证用户名是否仅包含合法字符(小写字母、数字、下划线) valid_chars = set('abcdefghijklmnopqrstuvwxyz1234567890_') if not all(char in valid_chars for char in cleaned_word.lower()): continue retry_limit = 5 initial_delay = 2.0 current_delay = initial_delay request_success = False # 循环实现重试机制 for attempt in range(retry_limit): try: # 使用Session复用连接,减少TCP握手开销 with requests.Session() as session: # 请求t.me验证用户名是否存在 telegram_resp = session.get( f'https://t.me/{cleaned_word.lower()}', headers=headers, timeout=10 ) telegram_resp.raise_for_status() # 触发HTTP状态码错误(如403、500) soup_tg = BeautifulSoup(telegram_resp.text, 'html.parser') # t.me中存在的用户名会有tgme_page_extra元素 has_tg_user = bool(soup_tg.find_all("div", {"class": "tgme_page_extra"})) if not has_tg_user: # 延迟1秒后请求Fragment平台 time.sleep(1.0) fragment_resp = session.get( f'https://fragment.com/username/{cleaned_word.lower()}', headers=headers, timeout=10 ) fragment_resp.raise_for_status() soup_frag = BeautifulSoup(fragment_resp.text, 'html.parser') # 检查Fragment上的状态:可售/已售 is_avail = bool(soup_frag.find_all("tr", {"class": "tm-section-header-status tm-status-avail"})) is_sold = bool(soup_frag.find_all("tr", {"class": "tm-section-header-status tm-status-unavail"})) # 既不可售也未售,说明用户名在两个平台都未被占用 if not is_avail and not is_sold: checked_words.append(cleaned_word) request_success = True break except (ConnectionResetError, requests.exceptions.RequestException) as e: print(f"[{cleaned_word}] 第{attempt+1}次请求失败: {str(e)}") if attempt < retry_limit - 1: time.sleep(current_delay) current_delay *= 1.5 # 指数退避,延迟逐步增加 else: print(f"[{cleaned_word}] 重试{retry_limit}次仍失败,跳过") # 每个用户名检测后增加全局延迟,降低整体请求频率 time.sleep(1.0) if progress_bar: bar.finish()
关键修复点说明
- 完善重试机制:实现基于
retry_limit的循环重试,捕获所有请求相关异常,采用指数退避延迟策略,避免频繁重试触发反爬 - 降低请求频率:将微秒级延迟改为1-2秒的合理间隔,每个用户名检测后额外增加1秒全局延迟
- 优化字符验证:用集合替代列表存储合法字符,
all()函数简化判断逻辑,提升验证效率 - 修正字符串处理:统一清理空白字符,跳过空值,避免无效请求
- 复用HTTP连接:使用
requests.Session()保持连接,减少TCP握手次数,降低被服务器强制关闭连接的概率 - 全面异常防护:覆盖所有请求类异常,包括Fragment平台的请求,避免单个请求失败中断整个脚本
- 明确状态判断:用
bool()直接转换搜索结果,使逻辑更清晰可读
内容的提问来源于stack exchange,提问作者KEEP BUSY
相关产品推荐
相关产品推荐

