调用新闻API,输入关键词(比如AI创业),自动抓取最新的行业新闻,生成每日新闻简报。

48 阅读9分钟

这是一个非常棒的项目构想,它完美地将技术、信息获取和商业决策结合起来。下面我将为您提供一个完整的、基于Python的“AI行业每日新闻简报”程序。

项目概览:NewsFlash - AI行业每日新闻简报生成器

核心功能:用户只需输入一个关键词(如“AI创业”、“生成式AI”),程序便会自动从全球知名科技媒体网站抓取最新相关新闻,利用AI进行内容摘要,并整合成一份格式优美、适合在晨会或内部群分享的每日简报。

  1. 实际应用场景与痛点
  • 目标用户:AI创业者、投资人、产品经理、技术负责人、市场分析师。
  • 场景描述:作为一名AI创业公司的CEO,您需要在每天早晨快速了解行业的最新动态,包括竞品发布、融资新闻、技术突破和政策变化,以便及时调整公司战略。
  • 传统痛点:
    1. 信息过载:每天有海量的新闻产生,人工筛选耗时费力。
    2. 来源分散:需要频繁访问TechCrunch, The Verge, Wired等多个网站,效率低下。
    3. 语言障碍:许多顶尖资讯源是英文的,阅读和理解需要额外的时间。
    4. 缺乏洞察:仅仅罗列新闻标题是不够的,更重要的是快速抓住核心要点。
  1. 核心逻辑讲解

本项目的核心是构建一个自动化的新闻情报流水线,其工作流程如下:

  1. 输入与请求:用户输入关键词,程序调用NewsAPI(一个聚合全球新闻源的API服务)来获取最新的相关新闻列表。

  2. 内容筛选与过滤:程序会对API返回的新闻进行初步处理,例如去除重复内容、过滤掉非核心内容(如赞助文章)。

  3. AI摘要生成:这是本项目的技术核心。我们将每篇新闻的全文或摘要传递给大型语言模型(LLM),使用精心设计的Prompt指令,让它为我们提炼出文章的“核心要点”(Bullet Points)。

  4. 内容整合与格式化:将所有新闻及其AI生成的摘要整合到一个Markdown文件中。程序会自动添加日期、标题、分割线,并对来源网站进行标注,使其看起来专业且易于阅读。

  5. 输出与分发:程序将最终的Markdown文件保存到本地,用户可以直接打开查看,也可以方便地复制到邮件、Slack或Notion中分享给团队。

  6. 代码模块化实现

我们将代码分为四个清晰的模块。

"config.py" (配置文件)

存放敏感信息和常量。

config.py

import os

--- NewsAPI 配置 ---

请前往 newsapi.org/ 注册并获取免费的API Key

NEWS_API_KEY = "YOUR_NEWSAPI_KEY"

--- LLM 配置 (以OpenRouter为例,它提供了众多顶级开源模型) ---

请前往 openrouter.ai/ 注册并获取API Key

OPENROUTER_API_KEY = "YOUR_OPENROUTER_API_KEY" LLM_MODEL = "mistralai/mistral-7b-instruct" # 一个性价比很高的开源模型

--- 通用配置 ---

MAX_ARTICLES_TO_PROCESS = 5 # 限制处理的新闻数量,避免API费用过高 OUTPUT_DIR = "./daily_briefings" os.makedirs(OUTPUT_DIR, exist_ok=True)

"news_fetcher.py" (新闻获取模块)

负责与NewsAPI交互,获取新闻列表。

news_fetcher.py

import requests import datetime from config import NEWS_API_KEY, MAX_ARTICLES_TO_PROCESS

class NewsFetcher: def init(self): self.api_key = NEWS_API_KEY self.base_url = "newsapi.org/v2/everythi…" # 使用英文源,质量通常更高 self.language = "en"

def fetch_latest_news(self, query, from_date=None, to_date=None, sort_by="publishedAt"):
    """
    根据关键词抓取最新新闻。
    
    Args:
        query (str): 搜索关键词。
        from_date (str): 起始日期 YYYY-MM-DD。
        to_date (str): 截止日期 YYYY-MM-DD。
        sort_by (str): 排序方式 ('relevancy', 'popularity', 'publishedAt')。
        
    Returns:
        list: 包含新闻信息的字典列表。
    """
    if not self.api_key:
        print("[ERROR] NewsAPI Key未配置。请在config.py中设置。")
        return []

    # 如果没有指定日期,默认为过去24小时
    if not from_date:
        yesterday = datetime.datetime.now() - datetime.timedelta(days=1)
        from_date = yesterday.strftime('%Y-%m-%d')
    if not to_date:
        today = datetime.datetime.now()
        to_date = today.strftime('%Y-%m-%d')

    params = {
        'q': query,
        'from': from_date,
        'to': to_date,
        'sortBy': sort_by,
        'language': self.language,
        'pageSize': MAX_ARTICLES_TO_PROCESS * 2, # 获取多一些,以防有些文章无法获取全文
        'apiKey': self.api_key
    }

    try:
        response = requests.get(self.base_url, params=params)
        response.raise_for_status()
        articles = response.json().get('articles', [])
        print(f"[INFO] 成功获取到 {len(articles)} 条相关新闻。")
        return articles
    except requests.exceptions.RequestException as e:
        print(f"[ERROR] 请求NewsAPI失败: {e}")
        return []

"llm_summarizer.py" (AI摘要模块)

负责调用LLM API为新闻生成摘要。

llm_summarizer.py

import requests import json from config import OPENROUTER_API_KEY, LLM_MODEL

class LLMSummarizer: def init(self): self.api_key = OPENROUTER_API_KEY self.api_url = "openrouter.ai/api/v1/chat…"

def summarize_article(self, article_content, max_points=3):
    """
    使用LLM为单篇文章生成核心要点摘要。
    
    Args:
        article_content (str): 文章的正文或描述。
        max_points (int): 生成的最大要点数。
        
    Returns:
        str: 包含要点的Markdown格式字符串,如果失败则返回None。
    """
    if not self.api_key:
        print("[ERROR] OpenRouter API Key未配置。")
        return None

    # --- Prompt Engineering (提示词工程) ---
    prompt = f"""
    You are an expert business analyst. Your task is to read a piece of news and provide a concise summary of its key takeaways.
    Please present the summary as a bulleted list. Be objective and focus on facts, business impact, and technological significance.
    Do not add any introductory or concluding sentences. Just provide the list.

    Here is the news content:
    ---
    {article_content}
    ---

    Please provide {max_points} key bullet points.
    """

    headers = {
        "Authorization": f"Bearer {self.api_key}",
        "Content-Type": "application/json",
    }
    payload = {
        "model": LLM_MODEL,
        "messages": [{"role": "user", "content": prompt}],
        "max_tokens": 300,
        "temperature": 0.2,
    }

    try:
        response = requests.post(self.api_url, headers=headers, data=json.dumps(payload))
        response.raise_for_status()
        summary = response.json()['choices'][0]['message']['content']
        return summary.strip()
    except requests.exceptions.RequestException as e:
        print(f"[ERROR] 请求LLM API失败: {e}")
        return None

"briefing_generator.py" (简报生成模块)

整合所有模块,生成最终的Markdown简报。

briefing_generator.py

import datetime import os from news_fetcher import NewsFetcher from llm_summarizer import LLMSummarizer

class BriefingGenerator: def init(self): self.fetcher = NewsFetcher() self.summarizer = LLMSummarizer()

def generate_briefing(self, keyword):
    """
    生成完整的每日新闻简报。
    
    Args:
        keyword (str): 搜索关键词。
        
    Returns:
        str: 生成的Markdown文件路径。
    """
    print(f"\n--- 开始为关键词 '{keyword}' 生成简报 ---")
    
    articles = self.fetcher.fetch_latest_news(query=keyword)
    if not articles:
        print("[INFO] 未找到相关新闻,无法生成简报。")
        return None

    today_str = datetime.date.today().strftime("%Y-%m-%d")
    filename = os.path.join(os.path.dirname(__file__), "..", "daily_briefings", f"{today_str}_briefing_{keyword.replace(' ', '_')}.md")

    with open(filename, "w", encoding="utf-8") as f:
        # 写入文件头
        f.write(f"# 📰 AI行业每日简报 - {today_str}\n\n")
        f.write(f"**关键词:** `{keyword}`\n\n")
        f.write("---\n\n")

        processed_count = 0
        for article in articles:
            title = article.get('title', '无标题')
            url = article.get('url', '#')
            source_name = article.get('source', {}).get('name', '未知来源')
            description = article.get('description', '')
            content = article.get('content', '') # 有时API会提供全文片段

            # 优先使用content,如果没有则用description
            text_to_summarize = content if content else description
            if not text_to_summarize:
                continue

            print(f"[INFO] 正在处理文章: {title}")
            
            summary = self.summarizer.summarize_article(text_to_summarize)
            
            if summary:
                processed_count += 1
                f.write(f"### [{title}]({url})\n\n")
                f.write(f"> **来源:** {source_name}\n\n")
                f.write(summary)
                f.write("\n\n---\n\n")

            if processed_count >= MAX_ARTICLES_TO_PROCESS:
                break

    print(f"[SUCCESS] 简报已生成: {filename}")
    return filename

"main.py" (主程序入口)

main.py

import sys import os

Add project root to path for imports

sys.path.insert(0, os.path.abspath(os.path.dirname(file)))

from briefing_generator import BriefingGenerator

def main(): print("="*50) print(" Welcome to NewsFlash - Daily Briefing Generator ") print("="*50)

keyword = input("\n请输入您感兴趣的AI行业关键词 (例如: generative ai, startup funding): ").strip()

if not keyword:
    print("[EXIT] 关键词不能为空。")
    return

generator = BriefingGenerator()
filepath = generator.generate_briefing(keyword)

if filepath:
    print("\n您可以打开下面的文件查看简报:")
    print(filepath)
    print("\n简报已准备就绪,祝工作顺利!")
else:
    print("\n[FAIL] 简报生成失败,请检查配置或网络。")

if name == "main": main()

  1. README.md 与使用说明

创建一个名为 "README.md" 的文件在项目根目录。

NewsFlash - AI行业每日新闻简报生成器

🚀 简介

NewsFlash是一个自动化的信息收集与处理工具,旨在为AI领域的从业者和爱好者提供每日行业动态简报。它利用AI技术,将分散、海量的信息转化为结构化、有洞察的每日必读内容,是您的信息中枢和决策助手。

🛠️ 安装与环境配置

  1. 克隆仓库

bash

git clone "github.com/your_userna…" (github.com/your_userna…)

cd NewsFlash

  1. 创建虚拟环境 (推荐)

bash

python -m venv venv

source venv/bin/activate # On Windows: venv\Scripts\activate

  1. 安装依赖

bash

pip install -r requirements.txt

requirements.txt 内容:

requests

  1. 配置API密钥
  • NewsAPI 注册并获取免费的API Key。
  • OpenRouter 注册并获取免费的API Key(推荐使用开源模型以降低成本)。
  • 编辑 config.py 文件,填入您的密钥。

🏃 如何使用

  1. 确保已正确配置 config.py
  2. 在终端运行主程序:

bash

python main.py

  1. 输入您关心的行业关键词(如 AI startup, LLM regulation, robotics)。
  2. 程序会自动运行,并在 ./daily_briefings/ 目录下生成一份当天的Markdown简报文件。

📝 核心知识点卡片

1. Prompt Engineering (提示词工程)

是什么:是一门研究如何设计与AI模型沟通的指令的艺术和科学。 本项目中的应用:我们通过精心设计Prompt,指示LLM扮演商业分析师的角色,并要求它以要点列表的形式输出摘要。一个高质量的Prompt是AI能否正确理解并执行任务的关键。

2. API Orchestration (API编排)

是什么:指将多个独立的API服务组合起来,形成一个更复杂、更有价值的业务流程的过程。 本项目中的应用:本项目不是一个单一的API调用,而是一个API编排的例子。它首先将NewsAPI的输出作为输入传递给LLM API,再将两者的结果整合到一个文件中。这体现了系统集成的思维。

3. Automation & Workflow (自动化与工作流)

是什么:利用技术手段,将重复性的、有规律的业务流程自动执行。 本项目中的应用:整个新闻抓取、筛选、摘要、生成的过程是完全自动化的。这为创业者节省了大量时间和精力,使他们能够将注意力集中在更重要的战略决策上,这正是自动化带来的核心价值。

4. Lean Startup (精益创业)

是什么:一种通过构建最小可行产品(MVP)、进行快速迭代来验证商业假设的创业方法论。 本项目中的应用:NewsFlash本身就是一个典型的MVP。它没有一开始就追求完美的UI界面和庞大的功能,而是聚焦于最核心的价值主张——“自动化生成有价值的行业简报”。它可以作为一个独立的CLI工具运行,未来可以轻松地将其打包成一个Web应用或SaaS产品。

  1. 总结

这个项目是一个非常棒的实战演练,它将课堂上学习的理论知识与实际问题解决紧密结合。

  1. 技术整合能力:项目展示了如何通过Python脚本将外部世界的信息(API)转化为内部可用的知识(简报),这是现代软件开发的核心能力之一。
  2. AI赋能思维:它清晰地演示了AI如何作为一个强大的“副驾驶”(Copilot),帮助我们处理那些枯燥、重复的脑力劳动(如阅读大量新闻),从而释放我们的创造力。
  3. 商业价值导向:整个项目的出发点是为了解决一个真实的商业痛点。它不仅仅是一个技术Demo,更是一个具有明确用户价值和潜在商业模式的解决方案雏形。

通过这个项目,您不仅掌握了Python编程和API调用的具体技能,更重要的是,您学习了如何从零开始构思、设计并实现一个完整的、面向市场的产品。这就是人工智能与创业智慧的完美结合。祝您在未来的学习和创业道路上取得成功! 如果你觉得这个工具好用,欢迎关注我!