使用Python requests查询eToro交易员组合返回512状态码问题排查
看起来你遇到的512错误是eToro的反爬机制在拦截你的请求——这个状态码并非标准HTTP状态码,是eToro自定义的错误标识,通常意味着你的请求没通过平台的验证。下面是你可能遗漏的关键点和对应的解决方案:
1. 缺少必要的会话Cookie
从你提供的响应头里能看到Set-Cookie字段,说明eToro要求请求携带有效的会话Cookie才能访问API。你直接发起API请求时,没有带上之前访问用户页面时生成的Cookie(比如__cfduid、eToro的会话ID等),服务器会判定这是非法请求。
解决方法:用requests.Session()维持会话,先访问目标用户的portfolio页面获取Cookie,再用同一个会话请求API,Cookie会自动被携带。
2. 动态请求参数的有效性问题
你硬编码的client_request_id是一次性UUID,eToro可能会验证这个参数的有效性(比如是否和当前会话关联、是否为新生成的),重复使用同一个ID很容易被识别为爬虫。
解决方法:每次请求API时生成新的UUID作为client_request_id;另外建议从用户页面的HTML源码中提取cid(用户ID),而非硬编码,避免用户ID变更导致请求失效。
3. Cloudflare反爬验证
eToro用Cloudflare保护站点,除了Cookie验证外,还会检查请求的行为模式(比如是否先加载页面再发起API请求、是否有JS渲染痕迹)。纯requests库的请求可能无法通过Cloudflare的人机验证。
解决方法:如果调整Cookie和动态参数后仍失败,可尝试用Selenium等工具模拟真实浏览器操作——先打开用户页面,等待加载完成后再触发API请求,这样能绕过大部分基于JS的反爬验证。
修改后的代码示例
import requests import uuid # 初始化会话,维持Cookie session = requests.Session() user_portfolio_url = "https://www.etoro.com/people/jaynemesis/portfolio" base_headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0', 'Host': 'www.etoro.com' } # 先访问用户页面获取会话Cookie session.get(user_portfolio_url, headers=base_headers) # 生成新的client_request_id new_client_id = str(uuid.uuid4()) api_url = f"https://www.etoro.com/sapi/trade-data-real/live/public/portfolios?cid=3378352&client_request_id={new_client_id}" # 构造API请求头,带上Referer api_headers = base_headers.copy() api_headers['Referer'] = 'https://www.etoro.com/people/jaynemesis/portfolio/history' # 发起API请求 response = session.get(api_url, headers=api_headers) print("状态码:", response.status_code) print("响应内容:", response.text)
额外提示
如果上述方法仍无法解决问题,大概率是Cloudflare触发了人机验证(比如弹出CAPTCHA),这时纯代码请求很难绕过,你可以考虑:
- 查看eToro是否有公开的官方API,避免爬取非公开接口(注意遵守平台条款)
- 使用支持Cloudflare绕过的合规第三方工具(需谨慎评估合法性)
内容的提问来源于stack exchange,提问作者lazarea

