#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""fix_heshan_retry2.py —— 末尾整轮重试（不动原有 try 结构）"""
import ast, os, re, shutil, subprocess, textwrap, time
D = "/root/gov_crawler/"; f = "crawl_heshan_gkmlpt.py"; p = D + f
src = open(p, encoding="utf-8").read()
print("=== 原 L22-58（原样，看 try 结构）===")
for i, ln in enumerate(src.split("\n")[21:58], 22):
    print("  L%-3d|%s" % (i, ln))
m = re.search(r'(?m)^if __name__ == ["\']__main__["\']:[ \t]*\n((?:[ \t]+.*\n?)+)', src)
if not m:
    print("\n⚠️ 未找到 __main__ 块"); raise SystemExit
body = m.group(1)
wrapper = ('if __name__ == "__main__":\n'
           '    # QC20260926 整轮重试：源站偶发连接失败(search_api 无 try)曾直接崩掉整轮\n'
           '    for _attempt in range(3):\n'
           '        try:\n'
           + textwrap.indent(body.rstrip("\n"), "            ") + '\n'
           '            break\n'
           '        except SystemExit:\n'
           '            raise\n'
           '        except Exception as _e:\n'
           '            print("[RETRY %d/3] %s" % (_attempt + 1, _e), flush=True)\n'
           '            time.sleep(10)\n'
           '    else:\n'
           '        print("[FATAL] 连续 3 次失败", flush=True)\n'
           '        raise SystemExit(1)\n')
new = src[:m.start()] + wrapper
try: ast.parse(new)
except SyntaxError as e: raise SystemExit("语法错（未落盘）: %s" % e)
b = D + "Archive/" + f + ".bak_20260926_retry2"
if not os.path.exists(b): shutil.copy2(p, b)
open(p, "w", encoding="utf-8").write(new)
print("\n✅ 已落盘整轮重试（备份 %s）" % os.path.basename(b))
t0 = time.time()
try:
    r = subprocess.run(["python3", p, "龙口镇"], capture_output=True, text=True, timeout=115, cwd=D)
    print("EXIT=%d 耗时=%.0fs" % (r.returncode, time.time() - t0))
    for x in [y for y in (r.stdout or "").split("\n") if y.strip()][:6]:
        print("   out:", x[:105])
except subprocess.TimeoutExpired:
    print("⏱ >115s（在正常爬，属预期：8 页 786 条）")
