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

法兰克福证券交易所API数据爬取失败,寻求技术协助

法兰克福证券交易所API调用问题排查与修正建议

问题梳理

尝试通过/v1/search/equity_search端点获取指数数据,当前调用失败,怀疑URL组成有误,且现有参考资料无法适配当前场景。

关键修正点

  • 请求URL错误:你定义了urlString但请求时使用了未定义的url变量;该接口为POST请求,无需在URL拼接查询参数,参数应放在请求体中,正确基础URL为https://api.boerse-frankfurt.de/v1/search/equity_search。
  • 签名生成的URL参数错误:生成X-Client-TraceId时,应使用不带查询参数的基础URL,而非拼接了参数的完整URL,POST接口的签名计算通常基于基础路径。
  • 变量一致性问题:代码中变量名不统一,需确保请求时使用正确的URL变量。
  • 补充必要请求头:添加User-Agent模拟浏览器请求,降低被反爬拦截的概率。

修正后的完整代码

import datetime
import hashlib
import json
import requests
from pprint import pprint

def generate_headers(base_url):
    salt = "w4ivc1ATTGta6njAZzMbkL3kJwxMfEAKDa3MNr"
    current_time = datetime.datetime.now(tz=datetime.timezone.utc)
    client_date = (current_time
        .isoformat(timespec="milliseconds")
        .replace("+00:00", "Z")
    )
    # 使用基础URL生成签名,而非带参数的URL
    client_traceid = hashlib.md5(
        (client_date + base_url + salt).encode("utf-8")
    )
    security = hashlib.md5(
        current_time.strftime("%Y%m%d%H%M").encode("utf-8")
    )

    return {
        "Client-Date": client_date,
        "X-Client-TraceId": client_traceid.hexdigest(),
        "X-Security": security.hexdigest()
    }

payload = {
    "indices": ["DE0007203275"],
    "lang": "de",
    "offset": 0,
    "limit": 50,
    "sorting": "TURNOVER",
    "sortOrder": "DESC"
}

# 基础URL,无需拼接参数
url = "https://api.boerse-frankfurt.de/v1/search/equity_search"
header_data = generate_headers(url)

headers = {
    "Host": "api.boerse-frankfurt.de",
    "Referer": "https://www.boerse-frankfurt.de/",
    "Content-Type": "application/json; charset=utf-8",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36",
    "Client-Date": header_data["Client-Date"],
    "X-Client-TraceId": header_data["X-Client-TraceId"],
    "X-Security": header_data["X-Security"]
}

try:
    response = requests.post(url, headers=headers, json=payload)
    response.raise_for_status()  # 抛出HTTP状态码错误
    result = json.loads(response.content)
    pprint(result)
except requests.exceptions.RequestException as e:
    print(f"请求错误: {e}")
    print(f"响应内容: {response.text if 'response' in locals() else '无响应'}")

额外说明

若仍无法成功调用,建议对比浏览器中实际发送的请求头和参数,确认签名算法细节(如salt是否更新、时间格式是否完全匹配);同时注意交易所API的频率限制,避免短时间内多次请求导致被封禁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 08:30:17