# 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 后第一次点刷新会自行爬取。