法兰克福证券交易所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
相关产品推荐
相关产品推荐

