# Python-2-多源新闻聚合Agent **Repository Path**: sanxiadaer/python-2 ## Basic Information - **Project Name**: Python-2-多源新闻聚合Agent - **Description**: No description available - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-10 - **Last Updated**: 2026-08-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 新闻爬虫 + AI 深挖平台 > 多源新闻聚合 + AI 增强:自动爬取「新浪 / 网易 / 今日头条 / 百度」新闻,Vue 3 前端展示,支持用户登录、浏览记录、基于关键词的兴趣推荐、新闻正文抓取、AI 摘要(80 字内)和基于正文的 AI 对话深挖。 ## 技术栈 | 层 | 技术 | |---|---| | 后端 | Python 3.10+ · FastAPI · SQLite · requests / BeautifulSoup · openai SDK(DeepSeek 兼容格式) | | 前端 | Vue 3 · Vite · TypeScript · Element Plus · 原生 fetch | | 大模型 | DeepSeek(`deepseek-chat`) | | 认证 | 纯标准库实现 JWT 类令牌(PBKDF2-HMAC-SHA256 加盐哈希 + HMAC-SHA256 签名) | ## 项目结构 ``` python-2/ ├── README.md ├── ARCHITECTURE.md ├── .gitignore │ ├── back-end1/ # 后端 │ ├── run.py # 启动入口(端口 8001) │ ├── requirements.txt # Python 依赖 │ ├── .env.example # 环境变量模板(复制为 .env 填入 Key) │ ├── data/ # SQLite 数据库目录(news.db 首次运行自动生成) │ └── app/ │ ├── __init__.py │ ├── main.py # FastAPI 路由(全部 API 接口) │ ├── config.py # 全局配置(数据源、分类关键词、认证、LLM 等) │ ├── database.py # SQLite 数据访问层(新闻 / 用户 / 浏览记录 / 推荐算法) │ ├── auth.py # 用户认证(密码哈希 + 令牌签发/验证) │ ├── schemas.py # Pydantic 数据模型(请求/响应结构定义) │ ├── content_extractor.py # 新闻正文 & 图片提取 │ ├── llm.py # DeepSeek 封装(摘要生成 + 对话) │ └── crawlers/ # 爬虫模块 │ ├── __init__.py # 爬虫注册表 │ ├── base.py # 爬虫基类(统一请求/去重/字段归一化) │ ├── sina.py # 新浪新闻爬虫 │ ├── netease.py # 网易新闻爬虫 │ ├── toutiao.py # 今日头条爬虫 │ └── baidu.py # 百度新闻爬虫 │ └── front-end1/ # 前端 ├── index.html ├── package.json ├── vite.config.ts # dev 端口 5173,/api /crawl 代理到 8001 ├── tsconfig.json └── src/ ├── main.ts # Vue 应用入口(注册 Element Plus) ├── App.vue # 单页全逻辑(登录页 / 新闻列表 / 详情 / AI 对话 / 浏览记录面板) └── assets/ # 全局样式 ``` --- ## 快速开始 ### 1. 安装依赖 **后端:** ```powershell cd back-end1 # 推荐创建虚拟环境: # py -3 -m venv .venv # .venv\Scripts\Activate.ps1 pip install -r requirements.txt ``` **前端(另开一个终端):** ```powershell cd front-end1 npm install ``` ### 2. 配置 DeepSeek API Key AI 摘要和 AI 对话功能需要大模型 Key。不配置也能用,会自动降级为规则摘要。 ```powershell cd back-end1 copy .env.example .env # 用编辑器打开 .env,填入你的 DEEPSEEK_API_KEY ``` > 申请地址: → API Keys → 创建 ### 3. 启动后端(端口 8001) ```powershell cd back-end1 python run.py ``` 看到 `Uvicorn running on http://0.0.0.0:8001` 即启动成功。访问 可查看 Swagger 文档。 ### 4. 启动前端(端口 5173) ```powershell cd front-end1 npm run dev ``` 看到 `Local: http://localhost:5173/` 即成功。浏览器打开 **http://localhost:5173/**,点击右上角「刷新」按钮等待 5~10 秒爬取四个源的新闻,即可开始使用。 --- ## 功能说明 | 功能 | 位置 | 说明 | |---|---|---| | 登录 / 注册 | 入口页 | 支持账号注册与登录,也可选择游客模式进入(游客不保存浏览记录) | | 新闻列表 | 主区域 | 切换数据源、搜索关键词、按分类过滤;每次加载 8 条,点「加载更多」翻页 | | 新闻详情 | 点击标题进入 | 标题 + 来源 + 正文 HTML + 图片,可跳转原文 | | AI 摘要 | 列表项 / 详情页按钮 | 后端抓取正文 → 调 DeepSeek → 生成 80 字内摘要 | | AI 深挖对话 | 左侧栏 | 通用聊天;进入新闻详情后自动切换为「深挖模式」,AI 基于该新闻正文回答 | | 深挖快捷问题 | 左侧输入框下方 | 核心观点 / 背景分析 / 影响分析 / 清空对话 | | 浏览记录 | 「浏览记录」按钮下方弹出 | 按日期分组展示(今天/昨天/具体日期),支持搜索、单条删除、清空 | | 兴趣推荐 | 右侧栏 | 已登录用户基于浏览记录关键词推荐同分类新闻;未登录或无记录时随机推荐 | --- ## REST 接口一览 | Method | Path | 认证 | 说明 | |---|---|---|---| | GET | `/` | - | 服务信息与支持的数据源 | | GET | `/sources` | - | 各数据源已入库条数统计 | | POST | `/crawl?source=` | - | 触发爬取(不传 source 爬全部四个源) | | GET | `/news?source=&keyword=&start=&end=&page=&page_size=` | - | 分页查询新闻(原始接口) | | GET | `/api/news?source=&keyword=&category=&page=` | - | 前端新闻列表(source 传中文名) | | GET | `/api/news/detail?url=` | - | 按 URL 查询单条新闻元信息 | | GET | `/api/news/content?url=` | - | 抓取并解析新闻正文段落与图片 | | POST | `/api/ai-summary` | - | AI 摘要(传 `{"url":"..."}` 或 `{"title":"...","desc":"..."}`) | | POST | `/api/chat` | - | AI 对话(传 `{"messages":[...]}`,可选 `news_url` 注入正文上下文) | | GET | `/api/recommend?source=` | 可选 | 兴趣推荐(已登录走关键词匹配,未登录随机) | | POST | `/api/cache/clear` | - | 前端刷新时调用(后端无缓存,返回成功) | | POST | `/api/auth/register` | - | 用户注册(`{"username":"...","password":"..."}`) | | POST | `/api/auth/login` | - | 用户登录(`{"username":"...","password":"..."}`) | | GET | `/api/auth/me` | **令牌** | 获取当前登录用户信息 | | POST | `/api/history` | **令牌** | 记录一条浏览历史 | | GET | `/api/history?page=` | **令牌** | 分页查询浏览记录(近三个月) | | DELETE | `/api/history` | **令牌** | 清空所有浏览记录 | | DELETE | `/api/history/{id}` | **令牌** | 删除单条浏览记录 | --- ## 常见问题 **Q: 打开页面新闻列表是空的?** A: 首次运行数据库为空,点击右上角「刷新」按钮(调用 `/crawl` 爬取四个源,5~10 秒后自动刷新列表)。 **Q: 点 AI 摘要显示「大模型未配置或调用失败」?** A: 检查 `back-end1/.env` 是否存在并填了正确的 `DEEPSEEK_API_KEY`,然后重启后端(Python 进程不会热加载 .env)。 **Q: 今日头条 / 百度详情页正文不全?** A: 今日头条部分文章为 JS 渲染,已通过 `m.toutiao.com/i/info/` 移动端 JSON 拉取正文;百度热搜 URL 是搜索结果页,会解析关键词 → 资讯搜索 → 搜狗搜索 fallback 到真实外链。降级提示时可直接点「查看原文」访问来源站。 **Q: 兴趣推荐和浏览记录不相关?** A: 推荐算法会从浏览记录标题中提取关键词,优先推荐命中关键词的新闻;若匹配不足,会回退到同分类关键词扩展匹配,最后才用随机补充。确保登录后浏览了几条新闻,刷新页面即可看到个性化推荐。 **Q: 端口被占用?** ```powershell # 8001 被占 Stop-Process -Id (Get-NetTCPConnection -LocalPort 8001).OwningProcess -Force # 5173 被占 Stop-Process -Id (Get-NetTCPConnection -LocalPort 5173).OwningProcess -Force ``` 或修改 `back-end1/run.py` 端口号,同步修改 `front-end1/vite.config.ts` 的 proxy target。 **Q: 别人 clone 后能看到我爬好的新闻吗?** A: 不能。`data/news.db` 在 `.gitignore` 中,不会随仓库提交。clone 后第一次点刷新会自行爬取。