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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 05:50:11