增加提取期号区间的方法

This commit is contained in:
2026-09-12 06:41:12 +08:00
parent 87b110e562
commit 0c642bbb32
3 changed files with 22 additions and 5 deletions

View File

@@ -37,6 +37,7 @@ python3 $S # 扫描 feed → 新期存 html/ + 登记 manifes
python3 $S --check # 输出 NEW:533,532 或 NONE python3 $S --check # 输出 NEW:533,532 或 NONE
python3 $S --extract pending # 提取所有未处理期 python3 $S --extract pending # 提取所有未处理期
python3 $S --extract 533 # 指定期 / latest / all(已提取的需 --force 覆盖) python3 $S --extract 533 # 指定期 / latest / all(已提取的需 --force 覆盖)
python3 $S --extract 433..464 # 期号区间(缺失的期告警跳过)
python3 $S --status # 状态表(期号/日期/HTML/提取/文章数) python3 $S --status # 状态表(期号/日期/HTML/提取/文章数)
# 可选: --feed URL / --dir PATH / --force(数据目录默认 ~/Workspace/nexus/sreweekly/) # 可选: --feed URL / --dir PATH / --force(数据目录默认 ~/Workspace/nexus/sreweekly/)
``` ```

View File

@@ -48,6 +48,7 @@ python3 sreweekly.py --check
# 提取指定期文章为 markdown(默认联网抓正文) # 提取指定期文章为 markdown(默认联网抓正文)
python3 sreweekly.py --extract 533 python3 sreweekly.py --extract 533
python3 sreweekly.py --extract 433..464 # 期号区间(缺失的期告警跳过,不阻断)
python3 sreweekly.py --extract latest # 最新一期 python3 sreweekly.py --extract latest # 最新一期
python3 sreweekly.py --extract pending # 所有未提取的期(n8n 每日推荐) python3 sreweekly.py --extract pending # 所有未提取的期(n8n 每日推荐)
python3 sreweekly.py --extract all # 全部(配合 --force 覆盖) python3 sreweekly.py --extract all # 全部(配合 --force 覆盖)
@@ -62,6 +63,8 @@ python3 sreweekly.py --backfill 1..533 # 全站回溯(500+ 期,约 12-
python3 sreweekly.py --backfill 450 # 只抓单期 python3 sreweekly.py --backfill 450 # 只抓单期
# 回溯完再走标准提取流程: # 回溯完再走标准提取流程:
python3 sreweekly.py --extract pending python3 sreweekly.py --extract pending
# 或只提取回溯的那段区间:
python3 sreweekly.py --extract 430..533
``` ```
## 选项 ## 选项

View File

@@ -23,6 +23,7 @@ SRE Weekly 抓取与文章提取脚本
python3 sreweekly.py # 扫描 feed,新增期保存为 HTML 并登记 manifest python3 sreweekly.py # 扫描 feed,新增期保存为 HTML 并登记 manifest
python3 sreweekly.py --check # 只检查有无新期,输出 NEW:533,532 或 NONE(供 n8n 分支) python3 sreweekly.py --check # 只检查有无新期,输出 NEW:533,532 或 NONE(供 n8n 分支)
python3 sreweekly.py --extract ID # 提取指定期(如 533)的文章 → markdown(默认抓正文) python3 sreweekly.py --extract ID # 提取指定期(如 533)的文章 → markdown(默认抓正文)
python3 sreweekly.py --extract 433..464 # 提取期号区间(只处理 manifest 中已登记的期)
python3 sreweekly.py --extract latest # 提取最新一期 python3 sreweekly.py --extract latest # 提取最新一期
python3 sreweekly.py --extract pending # 提取所有尚未提取的期(n8n 每日流程推荐) python3 sreweekly.py --extract pending # 提取所有尚未提取的期(n8n 每日流程推荐)
python3 sreweekly.py --extract all # 提取全部(含已提取的,需配合 --force 覆盖) python3 sreweekly.py --extract all # 提取全部(含已提取的,需配合 --force 覆盖)
@@ -145,11 +146,11 @@ MONTHS = {m: i for i, m in enumerate(
["January","February","March","April","May","June", ["January","February","March","April","May","June",
"July","August","September","October","November","December"], 1)} "July","August","September","October","November","December"], 1)}
def parse_backfill_range(spec): def parse_id_range(spec, flag_name="--backfill"):
"""'400..500' → (400, 500);'450' → (450, 450)。""" """'400..500' → (400, 500);'450' → (450, 450)。"""
m = re.match(r"^\s*(\d+)\s*(?:\.\.\s*(\d+))?\s*$", spec or "") m = re.match(r"^\s*(\d+)\s*(?:\.\.\s*(\d+))?\s*$", spec or "")
if not m: if not m:
sys.exit(f"❌ --backfill 参数格式错误(示例 400..500 或 450): {spec}") sys.exit(f"❌ {flag_name} 参数格式错误(示例 400..500 或 450): {spec}")
lo = int(m.group(1)); hi = int(m.group(2) or m.group(1)) lo = int(m.group(1)); hi = int(m.group(2) or m.group(1))
if lo > hi: lo, hi = hi, lo if lo > hi: lo, hi = hi, lo
return lo, hi return lo, hi
@@ -179,7 +180,7 @@ def extract_title_from_page(html_text, iid):
return t or f"SRE Weekly Issue #{iid}" return t or f"SRE Weekly Issue #{iid}"
def cmd_backfill(args, manifest, base_dir): def cmd_backfill(args, manifest, base_dir):
lo, hi = parse_backfill_range(args.backfill) lo, hi = parse_id_range(args.backfill, "--backfill")
html_dir = os.path.join(base_dir, "html") html_dir = os.path.join(base_dir, "html")
page_cache_dir = os.path.join(base_dir, "pages") # 存整页 HTML 作缓存 page_cache_dir = os.path.join(base_dir, "pages") # 存整页 HTML 作缓存
os.makedirs(html_dir, exist_ok=True) os.makedirs(html_dir, exist_ok=True)
@@ -515,7 +516,7 @@ def render_markdown(article, entry, body_md=None, fetch_error=None):
return "\n".join(out) + "\n" return "\n".join(out) + "\n"
def resolve_targets(target, manifest): def resolve_targets(target, manifest):
"""解析 --extract 的目标: ID / latest / pending / all → 期号列表。""" """解析 --extract 的目标: ID / FROM..TO / latest / pending / all → 期号列表。"""
issues = manifest["issues"] issues = manifest["issues"]
if target == "latest": if target == "latest":
ids = sorted(issues.keys(), key=lambda x: (isinstance(x, str), x)) ids = sorted(issues.keys(), key=lambda x: (isinstance(x, str), x))
@@ -527,6 +528,18 @@ def resolve_targets(target, manifest):
if target == "all": if target == "all":
return list(issues.keys()) return list(issues.keys())
t = str(target) t = str(target)
if ".." in t:
lo, hi = parse_id_range(t, "--extract")
ids, missing = [], []
for n in range(lo, hi + 1):
iid = str(n)
(ids if iid in issues else missing).append(iid)
if missing:
preview = ",".join(missing[:10]) + ("..." if len(missing) > 10 else "")
print(f"⚠️ 范围 {lo}..{hi} 中 {len(missing)} 期不在 manifest(跳过): {preview}", file=sys.stderr)
if not ids:
sys.exit(f"❌ 范围 {lo}..{hi} 中没有已登记的期,请先 --backfill 或扫描")
return ids
if t not in issues: if t not in issues:
sys.exit(f"❌ 期 #{t} 不在 manifest 中,请先扫描") sys.exit(f"❌ 期 #{t} 不在 manifest 中,请先扫描")
return [t] return [t]
@@ -574,7 +587,7 @@ def main():
ap.add_argument("--feed", default=DEFAULT_FEED, help=f"RSS 地址(默认 {DEFAULT_FEED})") ap.add_argument("--feed", default=DEFAULT_FEED, help=f"RSS 地址(默认 {DEFAULT_FEED})")
ap.add_argument("--dir", default=DEFAULT_DIR, help=f"工作目录(默认 {DEFAULT_DIR})") ap.add_argument("--dir", default=DEFAULT_DIR, help=f"工作目录(默认 {DEFAULT_DIR})")
ap.add_argument("--check", action="store_true", help="只检查有无新期,输出 NEW:id,id 或 NONE") ap.add_argument("--check", action="store_true", help="只检查有无新期,输出 NEW:id,id 或 NONE")
ap.add_argument("--extract", metavar="ID|latest|pending|all", help="提取文章 → markdown") ap.add_argument("--extract", metavar="ID|FROM..TO|latest|pending|all", help="提取文章 → markdown(支持区间如 433..464)")
ap.add_argument("--backfill", metavar="FROM..TO", help="回溯抓取指定期号区间(绕过 RSS 限制,例:--backfill 400..500)") ap.add_argument("--backfill", metavar="FROM..TO", help="回溯抓取指定期号区间(绕过 RSS 限制,例:--backfill 400..500)")
ap.add_argument("--status", action="store_true", help="打印 manifest 状态表") ap.add_argument("--status", action="store_true", help="打印 manifest 状态表")
ap.add_argument("--issues", action="store_true", help="列出已登记的所有期") ap.add_argument("--issues", action="store_true", help="列出已登记的所有期")