feat: initial project structure
- Add FastAPI app with paper browsing UI and REST API - Add crawler service and database models - Add scripts for DB init and manual crawl - Add docs (api-and-ui, data-model, services) - Add requirements and project config
This commit is contained in:
+66
@@ -0,0 +1,66 @@
|
||||
"""CLI 工具 — 手动抓取论文。"""
|
||||
|
||||
import asyncio
|
||||
import sys
|
||||
from datetime import date
|
||||
|
||||
import typer
|
||||
from dotenv import load_dotenv
|
||||
|
||||
# 在导入 app 模块前加载 .env
|
||||
load_dotenv()
|
||||
|
||||
cli_app = typer.Typer(help="HF Daily Papers 管理 CLI")
|
||||
|
||||
|
||||
@cli_app.command()
|
||||
def crawl(
|
||||
date_str: str = typer.Argument(
|
||||
None,
|
||||
help="抓取日期 (YYYY-MM-DD),默认今天",
|
||||
),
|
||||
top_n: int = typer.Option(None, "--top", "-n", help="取前 N 篇"),
|
||||
):
|
||||
"""手动抓取指定日期的 HuggingFace Daily Papers。"""
|
||||
from app.config import settings
|
||||
from app.database import SessionLocal, engine
|
||||
from app.models import init_db as _init
|
||||
from app.services.crawler import crawl_daily
|
||||
|
||||
target = date_str or date.today().isoformat()
|
||||
|
||||
# 确保数据库和表存在
|
||||
import os
|
||||
os.makedirs(settings.db_path.parent, exist_ok=True)
|
||||
_init(engine)
|
||||
typer.echo(f"📡 开始抓取 {target} ...")
|
||||
|
||||
db = SessionLocal()
|
||||
try:
|
||||
result = asyncio.run(crawl_daily(db, target, top_n))
|
||||
if result["status"] == "success":
|
||||
typer.echo(
|
||||
f"✅ 抓取完成:发现 {result['found']} 篇,新增 {result['new']} 篇"
|
||||
)
|
||||
else:
|
||||
typer.echo(f"❌ 抓取失败:{result['error']}", err=True)
|
||||
raise typer.Exit(code=1)
|
||||
finally:
|
||||
db.close()
|
||||
|
||||
|
||||
@cli_app.command()
|
||||
def init_db():
|
||||
"""初始化数据库表。"""
|
||||
from app.config import settings
|
||||
from app.database import engine
|
||||
from app.models import init_db as _init
|
||||
|
||||
import os
|
||||
os.makedirs(settings.db_path.parent, exist_ok=True)
|
||||
_init(engine)
|
||||
typer.echo(f"✅ 数据库已初始化:{settings.db_path}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
cli_app()
|
||||
Reference in New Issue
Block a user