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

pyETT调用get_leaderboard拉取大量数据连接超时问题咨询

问题原因

你遇到的连接报错不是本地数据库连接丢失,是pyETT依赖的远端服务接口有两层限制:

  1. 单请求拉取数量限制:官方接口单批次最多允许返回500条排行榜数据,超过这个阈值的请求会因为服务端处理超时被断开。
  2. 请求频率限制:短时间内发起大量高频请求会触发服务端的限流规则,直接拒绝新的连接请求,也就是你报错里的Max retries exceeded、连接超时问题。
可行解决方案

方案1:分页分批拉取排行榜(最优)

利用排行榜的分页参数,每次拉取500条,分10次拉满5000条,再合并构造Cohort对象即可调用describe()方法,同时增加请求间隔避免触发限流,参考代码如下:

from pyETT import ett
import pandas as pd
import time

# 复用同一个ETT实例,减少连接开销
ett_client = ett.ETT()
all_players = []
# 每次拉500条,拉10次,page参数对应页码
for page in range(1, 11):
    try:
        print(f"正在拉取第{page}页数据")
        # 按页拉取,每次500条,若get_leaderboard的分页参数名不是page可调整为对应参数,比如offset
        current_page = ett_client.get_leaderboard(num_players=500, page=page)
        all_players.extend(current_page)
        # 每次请求后等待1.5秒,避免触发限流,可根据实际情况调整间隔时间
        time.sleep(1.5)
    except Exception as e:
        print(f"第{page}页拉取失败,错误信息:{e},等待3秒后重试")
        time.sleep(3)
        # 失败重试一次
        current_page = ett_client.get_leaderboard(num_players=500, page=page)
        all_players.extend(current_page)

# 用合并后的全部玩家列表构造Cohort对象
lb_cohort = ett.Cohort(all_players)
print(f"总玩家数:{lb_cohort.size}")
# 调用describe方法获取明细
print(lb_cohort.describe())
# 导出Excel
df = lb_cohort.players_dataframe()
df.to_excel('export_file.xlsx', index=False)
print('导出成功')

方案2:现有拉取数据转Cohort

如果你已经通过循环拉取到了完整的用户数据,可以将拿到的用户数据转换为Cohort接受的Player对象列表,再构造Cohort即可,参考改造代码如下:

from pyETT import ett
import pandas as pd
import time

ett_parser = ett.ett_parser
df_master = pd.DataFrame()
# 调整循环逻辑,增加间隔和重试,避免触发限流
for i in range(1, 5001):
    try:
        if i % 100 == 0:
            print(f"已拉取{i}条数据,等待1秒")
            time.sleep(1)
        user_data = ett_parser.get_user(i)
        temp_df = pd.DataFrame(user_data, index=[i])
        df_master = pd.concat([df_master, temp_df], ignore_index=True)
        time.sleep(0.2)
    except Exception as e:
        print(f"用户ID{i}拉取失败:{e}")
        continue

# 将DataFrame中的用户数据转换为Player对象列表(根据pyETT的Player结构调整字段映射)
player_list = []
for _, row in df_master.iterrows():
    # 此处字段名需和pyETT的Player构造参数匹配,可根据实际返回字段调整
    player = ett.Player(**row.to_dict())
    player_list.append(player)

# 构造Cohort对象
lb_cohort = ett.Cohort(player_list)
print(lb_cohort.describe())
额外优化建议
  • 不要一次性拉取超过50万条全量数据,不仅效率极低,还极容易被服务端封禁IP,按需拉取所需的5000条即可。
  • 中途拉取到的数据可临时存入csv文件,避免程序崩溃导致数据全部丢失。
  • 如遇连续报错,可适当拉长请求间隔时间,或更换网络环境再尝试。

内容的提问来源于stack exchange,提问作者cmccall95

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 18:36:06