fix: 恒指回填改https+分页(腾讯接口单次上限2000根,超限向前翻页拉更早历史)

This commit is contained in:
hmo
2026-08-14 17:28:42 +08:00
parent 3a764d587d
commit a7449332d9
+34 -7
View File
@@ -27,20 +27,47 @@ DB_PATH = Path(_MOFIN_ROOT) / "data" / "mofin.db"
UA = "Mozilla/5.0"
INDEX_CODE = "hkHSI"
PAGE_SIZE = 2000 # 腾讯接口单次上限(实测 count=2000 ok, 2500 报 param error
def fetch_hsi(count=3000):
"""从腾讯接口拉 hkHSI 日Kcount 根)"""
url = (f"http://ifzq.gtimg.cn/appstock/app/fqkline/get?"
f"param={INDEX_CODE},day,,,{count},qfq")
def _fetch_page(count, end_date=""):
"""拉一页:param=hkHSI,day,start,end,count,qfq。end_date 空=截至最新"""
url = (f"https://web.ifzq.gtimg.cn/appstock/app/fqkline/get?"
f"param={INDEX_CODE},day,,{end_date},{count},qfq")
req = urllib.request.Request(url, headers={"User-Agent": UA})
opener = urllib.request.build_opener(urllib.request.ProxyHandler({}))
with opener.open(req, timeout=30) as r:
text = r.read().decode("utf-8", errors="replace")
data = json.loads(text)
node = data.get("data", {}).get(INDEX_CODE, {})
bars = node.get("qfqday") or node.get("day") or []
return bars
node = (data.get("data") or {}).get(INDEX_CODE, {})
return node.get("qfqday") or node.get("day") or []
def fetch_hsi(count=3000):
"""分页拉取 hkHSI 日K(单次上限 2000,超过则向前翻页)"""
from datetime import datetime as _dt, timedelta as _td
import time as _t
uniq = {}
end_date = ""
while len(uniq) < count:
want = min(PAGE_SIZE, count - len(uniq) + 5)
page = _fetch_page(want, end_date)
if not page:
break
new_cnt = 0
for b in page:
if b[0] not in uniq:
uniq[b[0]] = b
new_cnt += 1
if new_cnt == 0:
break # 没有新数据,历史到头
# 向前翻页:以本页最早日期的前一天为 end
earliest = page[0][0]
end_date = (_dt.strptime(earliest, "%Y-%m-%d") - _td(days=1)).strftime("%Y-%m-%d")
if len(page) < 100: # 不足一页说明历史拉完
break
_t.sleep(1) # 翻页间隔,遵守访问频率
return [uniq[d] for d in sorted(uniq)]
def main():