#!/usr/bin/env python # -*- coding:utf-8 -*- """ Date: 2025/10/30 17:00 Desc: 查询期货合约当前时刻的详情 https://finance.sina.com.cn/futures/quotes/V2101.shtml """ from io import StringIO import pandas as pd import requests from bs4 import BeautifulSoup def futures_contract_detail(symbol: str = "AP2101") -> pd.DataFrame: """ 查询期货合约详情 https://finance.sina.com.cn/futures/quotes/V2101.shtml :param symbol: 合约 :type symbol: str :return: 期货合约详情 :rtype: pandas.DataFrame """ url = f"https://finance.sina.com.cn/futures/quotes/{symbol}.shtml" r = requests.get(url) r.encoding = "gb2312" temp_df = pd.read_html(StringIO(r.text))[6] data_one = temp_df.iloc[:, :2] data_one.columns = ["item", "value"] data_two = temp_df.iloc[:, 2:4] data_two.columns = ["item", "value"] data_three = temp_df.iloc[:, 4:] data_three.columns = ["item", "value"] temp_df = pd.concat( objs=[data_one, data_two, data_three], axis=0, ignore_index=True ) return temp_df def futures_contract_detail_em(symbol: str = "v2602F") -> pd.DataFrame: """ 查询期货合约详情 https://quote.eastmoney.com/qihuo/v2602F.html :param symbol: 合约 :type symbol: str :return: 期货合约详情 :rtype: pandas.DataFrame """ url = f"https://quote.eastmoney.com/qihuo/{symbol}.html" r = requests.get(url) soup = BeautifulSoup(r.text, features="lxml") url_text = ( soup.find(name="div", attrs={"class": "sidertabbox_tsplit"}) .find(name="div", attrs={"class": "onet"}) .find("a")["href"] ) inner_symbol = url_text.split("#")[-1].strip("futures_") url = f"https://futsse-static.eastmoney.com/redis?msgid={inner_symbol}_info" r = requests.get(url) data_json = r.json() temp_df = pd.DataFrame.from_dict(data_json, orient="index") column_mapping = { "vname": "交易品种", "vcode": "交易代码", "jydw": "交易单位", "bjdw": "报价单位", "market": "上市交易所", "zxbddw": "最小变动价格", "zdtbfd": "跌涨停板幅度", "hyjgyf": "合约交割月份", "jysj": "交易时间", "zhjyr": "最后交易日", "zhjgr": "最后交割日", "jgpj": "交割品级", "zcjybzj": "最初交易保证金", "jgfs": "交割方式", } temp_df.rename(index=column_mapping, inplace=True) temp_df.reset_index(drop=False, inplace=True) temp_df.columns = ["item", "value"] return temp_df if __name__ == "__main__": futures_contract_detail_df = futures_contract_detail(symbol="V2101") print(futures_contract_detail_df) futures_contract_detail_em_df = futures_contract_detail_em(symbol="l2602F") print(futures_contract_detail_em_df)