2. 金融新闻数据基础

做金融新闻主题聚类与热点发现,第一步不是调模型,而是把“数据底座”打牢。金融新闻具有时效强、来源杂、格式多、噪声大、合规要求高等特点。如果数据基础不牢,后续的向量化、聚类、热点打分都会失真。本节围绕五个核心问题展开:新闻从哪里来、以什么格式存在、有哪些关键字段、如何采集、以及采集过程中必须注意的合规边界。

一、核心原理:金融新闻数据的“三源四态”

金融新闻的来源可以归纳为“三源”:官方披露源(交易所公告、监管文件、上市公司公告)、专业媒体源(财经门户、通讯社、行业垂直媒体)、社交与聚合源(财经社区、自媒体、RSS聚合、搜索接口)。这三类源在权威性、时效性、结构化程度上差异明显。

数据在采集链路上会经历“四态”:原始态(HTML/PDF/图片)、解析态(正文、标题、时间抽取后的结构化记录)、清洗态(去重、去广告、去模板)、特征态(分词、实体、向量)。理解这四态,才能判断每个环节该用什么工具、该保留哪些字段。

金融新闻数据来源与形态流转 官方披露源 公告 / 监管 / 交易所 专业媒体源 门户 / 通讯社 / 垂直 社交与聚合源 社区 / 自媒体 / RSS 原始态:HTML / PDF / 图片 / JSON / XML 采集入口:网页、接口、文件、推送 解析态 → 清洗态 → 特征态 标题 / 正文 / 时间 / 来源 / 实体 / 向量 下游:主题聚类 · 热点发现 · 事件追踪 · 舆情预警

二、常见字段与数据格式

无论来源如何,最终都应统一到一张“新闻主表”。核心字段包括:唯一标识(news_id)、标题(title)、正文(content)、发布时间(publish_time)、来源(source)、作者/机构(author)、URL、分类标签(category)、关联实体(股票代码、公司名、行业)、情感倾向(sentiment)、采集时间(crawl_time)。其中 publish_time 和 source 是聚类时区分“同一事件不同报道”的关键。

字段名 类型 说明 聚类中的用途
news_idstring全局唯一ID去重、追踪
titlestring新闻标题向量化主输入
contenttext正文全文语义补充、实体抽取
publish_timedatetime发布时间时间窗口切分
sourcestring媒体/机构名来源权重、去重
entitieslist公司/股票/行业主题标签、热点归因
sentimentfloat情感得分热点强度辅助

数据格式上,常见有 JSON、CSV、XML、HTML 和 PDF。JSON 最适合接口与存储,CSV 适合批量分析,XML 多见于交易所公告,HTML/PDF 需要额外解析。建议统一落库为 JSON Lines 或 Parquet,便于后续批流处理。

三、采集方式与流程

采集方式主要有四类:API 接口(最稳定,如新闻聚合接口、交易所数据接口)、RSS 订阅(轻量、结构化好)、网页爬取(灵活但需处理反爬与解析)、文件/推送(公告 PDF、邮件、消息队列)。实际项目中通常组合使用。

一个可落地的采集流程如下:

  1. 确定源清单与优先级,标注权威性与更新频率。
  2. 按源选择采集器:API 用 requests,RSS 用 feedparser,网页用 scrapy/playwright。
  3. 统一解析为中间结构,抽取标题、正文、时间、来源。
  4. 写入原始层(raw),保留原始 HTML/JSON 以便回溯。
  5. 清洗去重后写入标准层(standard),供聚类使用。
# 示例:RSS 采集并统一字段
import feedparser, hashlib, json
from datetime import datetime

def fetch_rss(url, source_name):
    feed = feedparser.parse(url)
    records = []
    for entry in feed.entries:
        title = entry.get("title", "").strip()
        content = entry.get("summary", "")
        pub = entry.get("published", "")
        news_id = hashlib.md5((title + pub).encode()).hexdigest()
        records.append({
            "news_id": news_id,
            "title": title,
            "content": content,
            "publish_time": pub,
            "source": source_name,
            "crawl_time": datetime.now().isoformat()
        })
    return records

if __name__ == "__main__":
    data = fetch_rss("https://example.com/finance/rss", "财经示例源")
    with open("news_raw.jsonl", "a", encoding="utf-8") as f:
        for r in data:
            f.write(json.dumps(r, ensure_ascii=False) + "\n")
采集频率要与源更新频率匹配。高频源可 1~5 分钟一次,低频公告源可 15~30 分钟一次。过度频繁请求既浪费资源,也容易触发封禁。

四、合规注意事项与常见误区

金融新闻采集涉及版权、数据安全与监管要求,必须守住底线。核心合规点包括:遵守 robots.txt 与网站服务条款;不采集非公开或付费墙内内容;不绕过登录、验证码等访问控制;控制请求频率,避免对目标站点造成压力;对个人信息与敏感数据做脱敏;转载与二次分发需获得授权。用于内部研究、模型训练时,也应关注数据来源的授权范围。

常见误区一:认为“公开网页就能随便爬”。公开可访问不等于可自由复制和再分发,版权与数据库权利依然存在。误区二:只存解析后正文,丢弃原始页面。一旦解析规则变化或需要回溯,原始层是唯一证据。误区三:忽略时间字段的时区与格式差异,导致聚类时间窗口错乱。误区四:不做去重,同一新闻被多家转载后会被误判为多个热点。

复盘建议:建立“源—字段—合规”三张清单,每次新增来源时同步更新;对采集任务设置监控告警(成功率、延迟、字段缺失率);定期抽样人工校验解析质量。只有数据基础扎实,后续的主题聚类与热点发现才有可靠前提。