pyETT调用get_leaderboard拉取大量数据连接超时问题咨询
问题原因
你遇到的连接报错不是本地数据库连接丢失,是pyETT依赖的远端服务接口有两层限制:
- 单请求拉取数量限制:官方接口单批次最多允许返回500条排行榜数据,超过这个阈值的请求会因为服务端处理超时被断开。
- 请求频率限制:短时间内发起大量高频请求会触发服务端的限流规则,直接拒绝新的连接请求,也就是你报错里的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
相关产品推荐
相关产品推荐

