增加提取期号区间的方法
This commit is contained in:
@@ -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/)
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -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
|
||||||
```
|
```
|
||||||
|
|
||||||
## 选项
|
## 选项
|
||||||
|
|||||||
@@ -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="列出已登记的所有期")
|
||||||
|
|||||||
Reference in New Issue
Block a user