fa45d8aa5f
- health_checklist.json: 192.168.1.122→node122
- ocr_client.py: docstring IP→node122
- docs/market-data-requirements.md: IP→node122
- 所有API调用通过ProxyHandler({})绕过系统代理
Privoxy对node122:18003返回500,直连正常
168 lines
7.0 KiB
Python
168 lines
7.0 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding:utf-8 -*-
|
|
"""
|
|
Date: 2025/12/22 17:00
|
|
Desc: 天天基金-基金档案
|
|
https://fundf10.eastmoney.com/jjfl_015641.html
|
|
"""
|
|
|
|
import re
|
|
from io import StringIO
|
|
|
|
import pandas as pd
|
|
import requests
|
|
from bs4 import BeautifulSoup
|
|
|
|
|
|
def fund_fee_em(symbol: str = "015641", indicator: str = "认购费率") -> pd.DataFrame:
|
|
"""
|
|
天天基金-基金档案-购买信息
|
|
https://fundf10.eastmoney.com/jjfl_015641.html
|
|
:param symbol: 基金代码
|
|
:type symbol: str
|
|
:param indicator: choice of {"交易状态", "申购与赎回金额", "交易确认日", "运作费用", "认购费率(前端)", "认购费率(后端)","申购费率(前端)", "赎回费率"}
|
|
:type indicator: str
|
|
:return: 交易规则
|
|
:rtype: pandas.DataFrame
|
|
"""
|
|
url = f"https://fundf10.eastmoney.com/jjfl_{symbol}.html"
|
|
r = requests.get(url)
|
|
soup = BeautifulSoup(r.text, features="html.parser")
|
|
tables_dict = {}
|
|
title_elements = soup.find_all(name="h4", class_="t")
|
|
for title_elem in title_elements:
|
|
title_text = title_elem.get_text(strip=True)
|
|
title_text = re.sub(r"\s+", " ", title_text).strip()
|
|
if title_text == "申购与赎回金额":
|
|
next_table = title_elem.find_all_next("table")[0]
|
|
next_next_table = title_elem.find_all_next("table")[1]
|
|
table_html = str(next_table)
|
|
next_table_html = str(next_next_table)
|
|
df_1 = pd.read_html(StringIO(table_html))[0]
|
|
df_2 = pd.read_html(StringIO(next_table_html))[0]
|
|
df = pd.concat(objs=[df_1, df_2], ignore_index=True)
|
|
tables_dict[title_text] = df
|
|
continue
|
|
else:
|
|
next_table = title_elem.find_next("table")
|
|
|
|
if next_table:
|
|
try:
|
|
# 将表格转换为HTML字符串,然后使用pd.read_html读取
|
|
table_html = str(next_table)
|
|
df = pd.read_html(StringIO(table_html))[0]
|
|
tables_dict[title_text] = df
|
|
except Exception as e:
|
|
print("Error:", e)
|
|
continue
|
|
|
|
if indicator == "交易状态":
|
|
temp_df = tables_dict[indicator]
|
|
elif indicator == "申购与赎回金额":
|
|
temp_df = tables_dict[indicator]
|
|
elif indicator == "交易确认日":
|
|
temp_df = tables_dict[indicator]
|
|
elif indicator == "运作费用":
|
|
temp_df = tables_dict[indicator]
|
|
elif indicator == "认购费率(后端)":
|
|
temp_df = tables_dict[indicator]
|
|
elif indicator == "认购费率(前端)":
|
|
temp_df = tables_dict[indicator]
|
|
temp_df[["原费率", "天天基金优惠费率"]] = temp_df[
|
|
"原费率|天天基金优惠费率"
|
|
].str.split("|", expand=True)
|
|
del temp_df["原费率|天天基金优惠费率"]
|
|
temp_df.loc[3, "天天基金优惠费率"] = temp_df.loc[3, "原费率"]
|
|
temp_df["原费率"] = temp_df["原费率"].str.strip()
|
|
temp_df["天天基金优惠费率"] = temp_df["天天基金优惠费率"].str.strip()
|
|
elif indicator == "申购费率(前端)":
|
|
temp_df = tables_dict[indicator]
|
|
if "原费率|天天基金优惠费率 银行卡购买|活期宝购买" not in temp_df.columns:
|
|
# assert temp_df.columns.tolist() == ["适用金额", "适用期限", "费率"]
|
|
return temp_df
|
|
splited = temp_df["原费率|天天基金优惠费率 银行卡购买|活期宝购买"].str.split(
|
|
"|", expand=True
|
|
)
|
|
if splited.shape[1] == 1:
|
|
temp_df.rename(
|
|
columns={"原费率|天天基金优惠费率 银行卡购买|活期宝购买": "原费率"},
|
|
inplace=True,
|
|
)
|
|
temp_df["天天基金优惠费率-银行卡购买"] = temp_df["原费率"]
|
|
temp_df["天天基金优惠费率-活期宝购买"] = temp_df["原费率"]
|
|
else:
|
|
temp_df[
|
|
["原费率", "天天基金优惠费率-银行卡购买", "天天基金优惠费率-活期宝购买"]
|
|
] = splited
|
|
temp_df["天天基金优惠费率-银行卡购买"] = temp_df[
|
|
"天天基金优惠费率-银行卡购买"
|
|
].fillna(temp_df["原费率"])
|
|
temp_df["天天基金优惠费率-活期宝购买"] = temp_df[
|
|
"天天基金优惠费率-活期宝购买"
|
|
].fillna(temp_df["原费率"])
|
|
del temp_df["原费率|天天基金优惠费率 银行卡购买|活期宝购买"]
|
|
temp_df["原费率"] = temp_df["原费率"].str.strip()
|
|
temp_df["天天基金优惠费率-银行卡购买"] = temp_df[
|
|
"天天基金优惠费率-银行卡购买"
|
|
].str.strip()
|
|
temp_df["天天基金优惠费率-活期宝购买"] = temp_df[
|
|
"天天基金优惠费率-活期宝购买"
|
|
].str.strip()
|
|
elif indicator in ("赎回费率", "赎回费率(前端)", "赎回费率(后端)"):
|
|
temp_df = tables_dict[indicator]
|
|
if "原费率|天天基金优惠费率" in temp_df.columns:
|
|
temp_df[["原费率", "天天基金优惠费率"]] = temp_df[
|
|
"原费率|天天基金优惠费率"
|
|
].str.split("|", expand=True)
|
|
del temp_df["原费率|天天基金优惠费率"]
|
|
else:
|
|
temp_df = pd.DataFrame([])
|
|
return temp_df
|
|
|
|
|
|
if __name__ == "__main__":
|
|
fund_fee_em_df = fund_fee_em(symbol="019005", indicator="交易状态")
|
|
print(fund_fee_em_df)
|
|
|
|
fund_fee_em_df = fund_fee_em(symbol="019005", indicator="申购与赎回金额")
|
|
print(fund_fee_em_df)
|
|
|
|
fund_fee_em_df = fund_fee_em(symbol="019005", indicator="交易确认日")
|
|
print(fund_fee_em_df)
|
|
|
|
fund_fee_em_df = fund_fee_em(symbol="019005", indicator="运作费用")
|
|
print(fund_fee_em_df)
|
|
|
|
fund_fee_em_df = fund_fee_em(symbol="019005", indicator="认购费率(前端)")
|
|
print(fund_fee_em_df)
|
|
|
|
fund_fee_em_df = fund_fee_em(symbol="019005", indicator="申购费率(前端)")
|
|
print(fund_fee_em_df)
|
|
|
|
fund_fee_em_df = fund_fee_em(symbol="000011", indicator="赎回费率")
|
|
print(fund_fee_em_df)
|
|
|
|
fund_fee_em_df = fund_fee_em(symbol="018403", indicator="赎回费率")
|
|
print(fund_fee_em_df)
|
|
|
|
fund_fee_em_df = fund_fee_em(symbol="100035", indicator="赎回费率(前端)")
|
|
print(fund_fee_em_df)
|
|
|
|
fund_fee_em_df = fund_fee_em(symbol="022364", indicator="申购费率(前端)")
|
|
print(fund_fee_em_df)
|
|
|
|
fund_fee_em_df = fund_fee_em(symbol="022365", indicator="申购费率(前端)")
|
|
print(fund_fee_em_df)
|
|
|
|
fund_fee_em_df = fund_fee_em(symbol="006030", indicator="申购费率(前端)")
|
|
print(fund_fee_em_df)
|
|
|
|
fund_fee_em_df = fund_fee_em(symbol="022568", indicator="申购费率(前端)")
|
|
print(fund_fee_em_df)
|
|
|
|
fund_fee_em_df = fund_fee_em(symbol="960029", indicator="申购费率(前端)")
|
|
print(fund_fee_em_df)
|
|
|
|
fund_fee_em_df = fund_fee_em(symbol="000011", indicator="认购费率(后端)")
|
|
print(fund_fee_em_df)
|