AI新闻总结工作流教程
前言
本教程适合有一定Python基础的小白用户。如果你还不熟悉Python,建议先学习基础知识(如变量、函数和模块)。通过本项目,你将学会如何使用Python自动抓取新闻、生成AI摘要,并搭建一个简单的网页展示结果。项目完成后,你每天都能看到全球新闻的智能总结!
项目目标
- 功能:每天自动从新闻网站抓取最新内容,使用AI生成摘要,并通过网页展示。
- 工具:Python、
feedparser
、newspaper3k
、openai
、flask
和schedule
。 - 成果:一个运行在你电脑或云服务器上的新闻摘要网站。
第一步:环境准备
在开始编写代码之前,你需要准备好项目运行所需的软件和工具。以下是详细的步骤指南,确保你能顺利完成环境设置。
1. 安装Python
- 下载Python:访问 Python官网,下载适用于你操作系统的Python 3.9+版本(推荐使用最新版)。
- Windows用户:下载“Windows installer”,运行安装程序时,务必勾选“Add Python to PATH”,这样系统才能自动识别Python命令。
- Mac用户:下载“macOS installer”,安装时按照提示操作即可。
- Linux用户:大多数Linux发行版已预装Python,如未安装,可使用包管理器(如
apt
或yum
)安装,例如运行sudo apt install python3
。
- 验证安装:安装完成后,打开命令行:
- Windows用户:按
Win + R
,输入cmd
并回车。 - Mac/Linux用户:打开终端。
- 输入以下命令:如果看到版本号(如
1
python --version
Python 3.11.0
),说明安装成功。你还可以输入python
进入Python交互模式,看到提示符>>>
即为成功,按Ctrl + D
(或Windows上Ctrl + Z
)退出。
- Windows用户:按
2. 安装所需库
项目依赖一些Python库,你需要通过pip
(Python的包管理工具)安装它们。
- 打开命令行:
- Windows用户:按
Win + R
,输入cmd
回车。 - Mac/Linux用户:打开终端。
- Windows用户:按
- 安装库:在命令行中运行以下命令:
1
pip install feedparser newspaper3k openai flask schedule
- 注意:如果遇到权限错误(如
Permission denied
),Windows用户请以管理员身份运行CMD(右键CMD图标,选择“以管理员身份运行”),Mac/Linux用户在命令前加sudo
(如sudo pip install ...
)。
- 注意:如果遇到权限错误(如
- 库解释:
feedparser
:用于解析新闻网站的RSS提要,获取新闻标题和链接。newspaper3k
:从新闻链接中提取文章的正文内容。openai
:调用OpenAI API生成新闻摘要。flask
:搭建一个简单的网页应用,展示新闻摘要。schedule
:设置定时任务,每天自动更新新闻。
3. 获取OpenAI API密钥
项目使用OpenAI的GPT-3模型生成摘要,你需要注册OpenAI账号并获取API密钥。
- 注册账号:
- 访问 OpenAI官网,点击“Sign Up”注册账号(或“Log In”登录已有账号)。
- 完成注册后,登录你的OpenAI账户。
- 生成API密钥:
- 登录后,点击右上角的账户名,选择“View API keys”。
- 在API Keys页面,点击“Create new secret key”生成新密钥。
- 复制并保存密钥:密钥只会显示一次,请务必复制并保存在安全的地方(建议记在记事本中),后面会用到。
- 注意:API密钥是访问OpenAI服务的凭证,请勿泄露给他人。
4. 创建项目文件夹
- 新建文件夹:在你的电脑上创建一个新文件夹,建议命名为
news_summary
,并放在易于访问的位置,如桌面或文档文件夹。- 例如:Windows用户可在
C:\Users\YourName\Documents\
下创建,Mac用户可在/Users/YourName/Documents/
下创建。
- 例如:Windows用户可在
- 打开文本编辑器:推荐使用 Visual Studio Code(VS Code),它对Python支持良好且易于使用。
- 下载并安装VS Code后,打开软件,选择“File” > “Open Folder”,选中你刚创建的
news_summary
文件夹。 - 或者,你也可以使用PyCharm、Notepad++等其他编辑器,但VS Code更为轻便且功能强大。
- 下载并安装VS Code后,打开软件,选择“File” > “Open Folder”,选中你刚创建的
- 小贴士:在VS Code中,你可以安装“Python”扩展(点击左侧“Extensions”图标,搜索“Python”并安装),以获得更好的代码提示和调试支持。
环境准备小结:
- 你已经安装了Python并验证成功。
- 项目所需的所有Python库都已安装。
- 获取并保存了OpenAI API密钥。
- 创建了项目文件夹并用文本编辑器打开。
完成以上步骤后,你已经为项目开发做好了准备!接下来,你可以开始编写代码,抓取新闻并生成摘要。
第二步:抓取RSS新闻
在这一步中,我们将使用RSS提要从新闻网站获取最新的文章。RSS(Really Simple Syndication,简易信息聚合)是一种标准格式,许多新闻网站用它来发布内容的更新,例如新闻标题、链接和发布时间等。通过RSS抓取新闻比直接爬取网页更简单和稳定,因为RSS通常不会受到网站反爬虫机制的限制。
什么是RSS?
RSS是一种基于XML的文件格式,新闻网站通过它提供内容的“提要”。每个提要包含多个“条目”(entries),每个条目通常包括:
- 标题(title):新闻的标题。
- 链接(link):指向完整文章的URL。
- 发布时间(published):文章发布的时间。
- 描述(description):新闻的简短摘要(可选)。
使用RSS的好处是它的结构统一,易于解析,而且大多数主流新闻网站(如CNN、BBC)都提供RSS提要,方便我们自动化抓取新闻。
准备工作
在开始之前,确保你已经安装了必要的工具:
- Python环境:确保你的电脑已安装Python(建议3.6或以上版本)。
- feedparser库:这是一个专门用于解析RSS提要的Python库。你可以通过以下命令安装:在命令行中输入上述命令,安装完成后即可使用。
1
pip install feedparser
代码实现
在你的项目文件夹中创建一个文件 news_fetcher.py
,然后输入以下代码:
1 | import feedparser |
代码逐行解释
import feedparser
:导入feedparser
库,用于解析RSS提要。news_sources
:一个列表,包含我们要抓取的RSS提要URL。这里预设了CNN和BBC的地址,你可以根据需要添加更多。fetch_all_news()
函数:- 创建一个空列表
all_news
用于存储新闻。 - 遍历
news_sources
中的每个URL,使用feedparser.parse(url)
解析提要。 - 从提要的
entries
(条目列表)中提取前10条新闻([:10]
),以控制抓取数量。 - 对于每个条目,提取
title
(标题)和link
(链接),并将它们作为元组(title, link)
添加到all_news
。 - 最后返回
all_news
列表。
- 创建一个空列表
if __name__ == "__main__":
:测试代码块,调用fetch_all_news()
并打印前5条新闻的标题和链接。
运行与测试
- 运行代码:
- 打开命令行(Windows用户用CMD,Mac/Linux用户用终端)。
- 进入项目文件夹,例如:
1
cd C:\Users\YourName\Documents\news_summary
- 输入以下命令运行脚本:
1
python news_fetcher.py
- 预期输出:
如果一切正常,你会看到类似以下的输出:1
2
3
4
5
6标题: Example News Title 1
链接: https://www.example.com/news1
标题: Example News Title 2
链接: https://www.example.com/news2
... - 故障排除:
- 没有输出:检查你的网络连接是否正常。
- RSS地址失效:如果某个URL无法访问(例如网站更改了RSS地址),
feedparser.parse(url)
会返回空提要,程序会自动跳过它,不会崩溃。 - 手动验证:在浏览器中打开RSS URL,确认它是否有效(你应该看到XML格式的内容)。
如何选择更多新闻源?
你可以在 news_sources
列表中添加其他新闻网站的RSS提要URL。以下是一些获取方法和示例:
- 查找方法:访问新闻网站,搜索“RSS”或“Feed”链接,通常在网站底部或导航栏中。
- 更多示例:
- 路透社:
http://feeds.reuters.com/reuters/topNews
- 纽约时报:
https://rss.nytimes.com/services/xml/rss/nyt/HomePage.xml
- 路透社:
- 搜索技巧:在谷歌中输入“新闻网站 RSS”或“[网站名] RSS feed”,可以找到更多可用源。
小贴士
- 扩展新闻源:根据你的兴趣或需求,添加更多RSS地址,例如科技、体育或本地新闻。
- 处理失效RSS:如果某个RSS URL失效,程序会自动跳过,不会影响其他源的抓取。
- 调整抓取数量:在代码中,
[:10]
限制了每个源抓取10条新闻。你可以改为[:5]
或[:20]
,但抓取过多可能会增加后续处理时间。
小结
通过这一步,你已经学会了如何:
- 使用
feedparser
从RSS提要中抓取新闻标题和链接。 - 测试代码并验证抓取是否成功。
- 根据需要扩展新闻源,获取更多内容。
完成这一步后,你已经掌握了自动化抓取新闻的基础。接下来,你可以利用这些标题和链接,进一步提取文章内容并生成摘要。
第三步:提取文章内容并生成摘要
在这一步,我们将从新闻链接中提取文章的全文内容,并使用OpenAI的GPT-3模型生成简洁的摘要。以下是详细的实现步骤和说明,确保即使是初学者也能轻松完成。
准备工作
在开始之前,请确保完成以下准备:
安装必要的库:
newspaper3k
:用于从新闻链接提取文章内容。openai
:用于调用OpenAI API生成摘要。
在命令行中运行以下命令安装:
1
pip install newspaper3k openai
获取OpenAI API密钥:
- 访问OpenAI官网,注册账号并生成API密钥。
- 将密钥保存好,稍后会在代码中使用。
项目文件夹:
- 创建一个项目文件夹(例如
news_summary
),并确保在此文件夹中操作。
- 创建一个项目文件夹(例如
代码实现
在项目文件夹中创建一个新文件summarizer.py
,并将以下代码复制到文件中:
1 | from newspaper import Article |
代码解释
导入库:
newspaper.Article
:用于解析新闻链接并提取内容。openai
:用于调用OpenAI API。
设置API密钥:
- 将
"YOUR_OPENAI_API_KEY"
替换为你在OpenAI官网获取的实际密钥。
- 将
提取文章内容:
fetch_article_content(url)
函数接收一个新闻链接,下载并解析文章,返回全文文本。如果失败,返回None
并打印错误信息。
生成摘要:
summarize_article(text)
函数接收文章文本,通过OpenAI API生成摘要。- 使用
text-davinci-003
引擎,提示要求将文本总结为3-4句话。 max_tokens=150
限制摘要长度,temperature=0.7
控制生成文本的创造性。
测试代码:
- 使用一个测试URL提取内容,并将前2000个字符传入摘要函数(避免API输入超限),然后打印摘要。
运行与测试
替换API密钥:
- 在代码中找到
openai.api_key = "YOUR_OPENAI_API_KEY"
,替换为你的实际密钥。
- 在代码中找到
替换测试URL:
- 将
test_url
替换为一个真实的新闻链接,例如:1
test_url = "https://www.bbc.com/news/world-12345678"
- 将
运行代码:
- 打开命令行,进入项目文件夹,运行:
1
python summarizer.py
- 如果成功,你会在命令行看到生成的摘要。
- 打开命令行,进入项目文件夹,运行:
故障排除:
- API密钥错误:如果提示密钥无效,检查是否正确输入。
- 网络问题:确保能访问新闻网站和OpenAI API。
- 提取失败:可能是链接失效或网站阻止爬取,尝试其他链接。
- 摘要失败:检查API密钥是否有效,或账户是否有足够配额。
注意事项
OpenAI API费用:
- API按使用量收费,每次调用消耗tokens。测试时建议只处理少量文章,避免高额费用。
文章长度限制:
- API有输入长度限制,代码中用
content[:2000]
限制文本。如果文章太长,摘要可能不完整,可调整max_tokens
增加长度,但注意费用。
- API有输入长度限制,代码中用
摘要质量:
- 如果摘要不够理想,可调整
prompt
(例如改为“简要总结”)、max_tokens
或temperature
(0到1之间,值越高越有创造性)。
- 如果摘要不够理想,可调整
小结
通过以上步骤,你已经学会如何:
- 使用
newspaper3k
提取新闻文章内容。 - 使用OpenAI API生成简洁摘要。
- 测试并验证代码功能。
完成这一步后,你可以将此功能集成到更大的项目中,实现自动化新闻摘要生成。
第四步:存储和展示新闻摘要
在这一步中,我们将抓取的新闻摘要存储到数据库中,并使用 Flask 框架搭建一个简单的网页应用来展示这些摘要。本节将详细讲解代码实现、运行步骤以及测试方法,确保你能轻松完成这一步。
代码实现
1. 创建并配置 app.py
我们将使用 SQLite 数据库存储新闻数据,并通过 Flask 创建一个网页应用。以下是完整的 app.py
文件内容:
1 | from flask import Flask, render_template |
代码说明:
- 导入模块:导入 Flask、SQLite、日期处理模块以及之前实现的
news_fetcher
和summarizer
模块。 init_database()
:创建 SQLite 数据库news.db
和表news
,包含字段:id
(主键)、title
(标题)、summary
(摘要)、url
(链接)、date
(日期)。store_summarized_news()
:调用fetch_all_news()
获取新闻列表,提取内容并生成摘要,然后存入数据库。限制处理前 5 条新闻以减少资源消耗。get_todays_news()
:查询当天新闻数据并返回。- Flask 路由:
@app.route('/')
定义首页路由,渲染index.html
模板并传入新闻数据。
2. 创建 HTML 模板 index.html
Flask 使用 HTML 模板渲染网页。我们需要在项目文件夹中创建一个 templates
文件夹,并在其中创建 index.html
文件:
1 |
|
模板说明:
- 使用 Jinja2 语法
{% for ... %}
循环展示新闻。 - 每条新闻显示标题(加粗)、摘要和来源链接(在新窗口打开)。
- 内置简单 CSS 样式,美化页面布局。
运行与测试
按照以下步骤运行并测试你的应用:
准备工作:
- 确保已安装 Flask:在命令行运行
pip install flask
。 - 确认
news_fetcher.py
和summarizer.py
文件与app.py
在同一文件夹中,且它们能正常工作。 - 创建
templates
文件夹,并将index.html
文件放入其中。
- 确保已安装 Flask:在命令行运行
运行应用:
- 打开命令行,进入项目文件夹。
- 输入以下命令运行程序:
1
python app.py
- 程序启动后,
store_summarized_news()
会抓取新闻并存入数据库,然后 Flask 服务器启动。
访问网页:
- 打开浏览器,输入
http://127.0.0.1:5000
。 - 你将看到一个网页,标题为“今日全球新闻摘要”,下方列出当天的新闻标题、摘要和来源链接。
- 打开浏览器,输入
故障排除:
- 数据库问题:如果
news.db
文件未创建,检查文件夹权限是否允许写入。 - API 错误:确保
summarizer.py
中的 API 配置正确,且网络连接正常。 - 网页空白:确认
templates/index.html
文件路径正确。
- 数据库问题:如果
注意事项
- 数据库文件:
news.db
会保存在项目文件夹中,确保有足够磁盘空间和写权限。 - 资源限制:代码限制处理 5 条新闻并截取 2000 字符内容,以减少 API 调用和计算开销。
- 扩展性:当前代码只展示当天新闻,可根据需要修改
get_todays_news()
获取更多数据。
小结
通过以上步骤,你已经成功:
- 使用 SQLite 存储了新闻摘要。
- 使用 Flask 搭建了网页应用。
- 在网页上展示了当天的新闻摘要。
这是一个简单但功能完整的新闻摘要展示系统。如果需要进一步优化(如添加自动更新或改进页面样式),可以根据需求调整代码。
第五步:设置每日自动运行
在这一步中,我们将使用 schedule
库实现每天定时自动更新新闻摘要的功能。通过以下代码和步骤,你的新闻摘要系统将能够在每天的固定时间(例如早上9点)自动抓取最新新闻、生成摘要并存储到数据库中,无需手动操作。
准备工作
在开始之前,请确保完成以下准备:
安装
schedule
库:- 如果尚未安装,可以在命令行运行以下命令:
1
pip install schedule
- 如果尚未安装,可以在命令行运行以下命令:
项目文件:
- 确保你的项目中已有
app.py
文件,并且之前的功能(如新闻抓取、摘要生成和数据库存储)能够正常运行。
- 确保你的项目中已有
代码实现
我们需要修改 app.py
文件,添加定时任务功能。以下是具体的实现步骤:
1. 导入必要的模块
在 app.py
文件开头添加以下导入语句:
1 | import schedule |
schedule
:用于设置定时任务。time
:用于控制任务执行的间隔。threading
:用于在后台运行定时任务,避免阻塞 Flask 服务器。
2. 定义定时任务函数
添加一个 job()
函数,用于执行新闻更新任务:
1 | def job(): |
job()
:这个函数会在定时任务触发时调用store_summarized_news()
,完成新闻抓取、摘要生成和存储。
3. 设置定时任务
定义一个 run_schedule()
函数,用于设置和运行定时任务:
1 | def run_schedule(): |
schedule.every().day.at("09:00").do(job)
:设置任务每天早上9点执行。你可以根据需要调整时间,例如"15:30"
表示下午3点30分。while True: schedule.run_pending(); time.sleep(60)
:每隔60秒检查一次是否有待执行的任务,并运行。
4. 在后台运行定时任务
在 app.py
的主程序块中启动定时任务:
1 | if __name__ == "__main__": |
threading.Thread(target=run_schedule, daemon=True).start()
:将定时任务放入后台线程运行,确保不会干扰 Flask 服务器。daemon=True
:设置为守护线程,当主程序退出时,线程也会停止。
运行
完成代码修改后,按照以下步骤运行程序:
本地运行:
- 在命令行中进入项目文件夹,运行:
1
python app.py
- 程序启动后,Flask 服务器将运行在
http://127.0.0.1:5000
,定时任务会在每天9点自动更新新闻。
- 在命令行中进入项目文件夹,运行:
测试定时任务:
- 为快速验证功能,可以临时修改
run_schedule()
,将任务设置为每分钟运行:1
schedule.every(1).minutes.do(job) # 每分钟执行一次
- 运行后,每分钟会在命令行看到“正在更新新闻…”的提示,同时数据库会更新。测试完成后,改回每天9点:
1
schedule.every().day.at("09:00").do(job)
- 为快速验证功能,可以临时修改
部署到云服务器:
- 若需持续运行,可以将项目部署到云服务器(如 Heroku、AWS 或 DigitalOcean)。
- 部署时,确保服务器时间正确,并根据云平台特性调整定时任务实现(例如使用 Heroku Scheduler 或 cron 任务)。
注意事项
时区设置:
schedule
使用本地时间,确保服务器或电脑的时区正确,否则任务可能在预期外的时间运行。
错误处理:
- 为提高稳定性,建议在
job()
中添加异常处理:1
2
3
4
5
6def job():
try:
print("正在更新新闻...")
store_summarized_news()
except Exception as e:
print(f"更新新闻失败: {e}")
- 为提高稳定性,建议在
资源管理:
- 定时任务会调用外部 API(如新闻源或摘要生成服务),注意监控使用量和成本,避免超出预算。
小结
通过以上步骤,你的新闻摘要系统已实现每日自动更新功能:
- 使用
schedule
库设置了每天9点的定时任务。 - 通过线程实现后台运行,不影响 Flask 服务器。
- 支持本地测试和云端部署。
现在,系统可以在每天指定时间自动为你提供最新新闻摘要。如果需要调整时间或优化功能,只需修改相关代码即可!
以下是针对您查询的完整回答,我将根据您的需求对“注意事项”、“扩展建议”和“资源链接”部分进行详细说明,确保内容全面且易于理解。
注意事项
在完成项目后,以下是需要特别注意的几个方面:
法律合规
- 版权问题:虽然网页中已标注新闻来源,但为避免潜在的版权争议,建议在使用前仔细阅读并遵守各新闻网站的使用条款(Terms of Service)。有些网站可能禁止或限制自动抓取内容。
- 建议:在展示新闻摘要时,始终提供指向原文的链接,并注明“内容来源于[网站名]”,以示尊重并确保合规。
错误处理
- 抓取失败:如果某个新闻链接无法访问或内容提取失败,程序会跳过该条新闻并在控制台打印错误信息,不会影响其他新闻的处理。
- API调用失败:如果OpenAI API调用失败(例如网络问题或配额不足),程序会记录错误并继续处理其他新闻。
- 建议:定期检查控制台日志,确保系统稳定运行。
成本控制
- OpenAI API费用:API按token使用量计费,每次生成摘要都会消耗tokens。为控制成本,建议每天限制处理的文章数量(如5篇)。
- 监控使用:在OpenAI账户中设置使用限额或预算提醒,避免意外高额费用。
- 优化:可以根据实际需求调整摘要的长度(通过
max_tokens
参数)或选择更经济的API模型。
扩展建议
项目完成后,您可以根据兴趣和需求进行以下扩展:
界面优化
- CSS美化:为
index.html
添加更多CSS样式,例如调整字体、颜色和布局,使网页更具吸引力。 - Bootstrap框架:使用Bootstrap快速搭建响应式网页,提升用户体验。
- CSS美化:为
更多功能
- 新闻分类:根据新闻主题(如科技、体育)进行分类展示。您可以使用新闻网站的RSS分类源或AI模型进行主题识别。
- 搜索功能:在网页中添加搜索框,允许用户按关键词查找历史新闻。
- 历史数据:修改数据库查询,展示过去几天的新闻摘要,提供归档功能。
部署
- 云服务器:将项目部署到云平台(如Heroku、AWS或DigitalOcean),确保系统持续运行。
- Heroku教程:参考Heroku Python入门指南,学习如何将Flask应用部署到Heroku。
- 注意:在云端部署时,可能需要调整定时任务的实现方式,例如使用Heroku Scheduler或cron任务。
资源链接
以下是项目开发中可能用到的官方文档和教程链接,供您参考和深入学习:
- Python官方文档:Python语言的详细参考手册,适合查阅语法和标准库用法。
- Feedparser文档:
feedparser
库的官方文档,讲解如何解析RSS和Atom提要。 - Newspaper3k GitHub:
newspaper3k
库的GitHub页面,包含安装和使用说明。 - OpenAI API文档:OpenAI API的官方文档,涵盖API调用、模型选择和费用说明。
- Flask教程:Flask框架的官方教程,适合学习如何构建Web应用。
- Stack Overflow:一个流行的编程问答社区,遇到问题时可以在这里搜索或提问。
结语
通过本教程,您已经学会了如何构建一个自动化的AI新闻摘要系统,从环境准备到代码实现,再到定时任务和网页展示,每一步都为您提供了详细的指导。希望这个项目能帮助您更好地理解Python编程、Web开发和AI应用。
如果您在项目开发过程中遇到任何问题,欢迎随时提问或在Stack Overflow上寻求帮助。祝您项目顺利,享受编程的乐趣!