Doiiars

MindSpider: 平台参数输入错误时给出相似候选项提示

@@ -8,6 +8,8 @@ MindSpider - AI爬虫项目主程序 @@ -8,6 +8,8 @@ MindSpider - AI爬虫项目主程序
8 import os 8 import os
9 import sys 9 import sys
10 import argparse 10 import argparse
  11 +import difflib
  12 +import re
11 from datetime import date, datetime 13 from datetime import date, datetime
12 from pathlib import Path 14 from pathlib import Path
13 import subprocess 15 import subprocess
@@ -437,9 +439,42 @@ class MindSpider: @@ -437,9 +439,42 @@ class MindSpider:
437 logger.info("MindSpider项目初始化完成!") 439 logger.info("MindSpider项目初始化完成!")
438 return True 440 return True
439 441
  442 +PLATFORM_CHOICES = ['xhs', 'dy', 'ks', 'bili', 'wb', 'tieba', 'zhihu']
  443 +
  444 +PLATFORM_ALIASES = {
  445 + 'weibo': 'wb', 'webo': 'wb', '微博': 'wb',
  446 + 'douyin': 'dy', '抖音': 'dy',
  447 + 'kuaishou': 'ks', '快手': 'ks',
  448 + 'bilibili': 'bili', 'b站': 'bili', 'bstation': 'bili',
  449 + 'xiaohongshu': 'xhs', '小红书': 'xhs', 'redbook': 'xhs',
  450 + 'zhihu': 'zhihu', '知乎': 'zhihu',
  451 + 'tieba': 'tieba', '贴吧': 'tieba',
  452 +}
  453 +
  454 +class SuggestiveArgumentParser(argparse.ArgumentParser):
  455 + """在参数错误时给出相似候选项提示"""
  456 +
  457 + def error(self, message: str):
  458 + match = re.search(r"invalid choice: '([^']+)'", message)
  459 + if match:
  460 + bad = match.group(1)
  461 + alias = PLATFORM_ALIASES.get(bad.lower())
  462 + suggestions = difflib.get_close_matches(bad, PLATFORM_CHOICES, n=3, cutoff=0.3)
  463 + if alias:
  464 + print(f"错误: '{bad}' 不是合法的平台代码。您是否想输入 '{alias}'?", file=sys.stderr)
  465 + elif suggestions:
  466 + print(f"错误: '{bad}' 不是合法的平台代码。最接近的选项: {suggestions}", file=sys.stderr)
  467 + else:
  468 + print(f"错误: '{bad}' 不是合法的平台代码。合法平台: {PLATFORM_CHOICES}", file=sys.stderr)
  469 + print(f"完整错误: {message}", file=sys.stderr)
  470 + else:
  471 + print(f"错误: {message}", file=sys.stderr)
  472 + self.print_usage(sys.stderr)
  473 + sys.exit(2)
  474 +
440 def main(): 475 def main():
441 """命令行入口""" 476 """命令行入口"""
442 - parser = argparse.ArgumentParser(description="MindSpider - AI爬虫项目主程序") 477 + parser = SuggestiveArgumentParser(description="MindSpider - AI爬虫项目主程序")
443 478
444 # 基本操作 479 # 基本操作
445 parser.add_argument("--setup", action="store_true", help="初始化项目设置") 480 parser.add_argument("--setup", action="store_true", help="初始化项目设置")
@@ -454,7 +489,7 @@ def main(): @@ -454,7 +489,7 @@ def main():
454 # 参数配置 489 # 参数配置
455 parser.add_argument("--date", type=str, help="目标日期 (YYYY-MM-DD),默认为今天") 490 parser.add_argument("--date", type=str, help="目标日期 (YYYY-MM-DD),默认为今天")
456 parser.add_argument("--platforms", type=str, nargs='+', 491 parser.add_argument("--platforms", type=str, nargs='+',
457 - choices=['xhs', 'dy', 'ks', 'bili', 'wb', 'tieba', 'zhihu'], 492 + choices=PLATFORM_CHOICES,
458 help="指定爬取平台") 493 help="指定爬取平台")
459 parser.add_argument("--keywords-count", type=int, default=100, help="话题提取的关键词数量") 494 parser.add_argument("--keywords-count", type=int, default=100, help="话题提取的关键词数量")
460 parser.add_argument("--max-keywords", type=int, default=50, help="每个平台最大关键词数量") 495 parser.add_argument("--max-keywords", type=int, default=50, help="每个平台最大关键词数量")