4. 舆情数据采集

金融舆情风险告警的上游是数据。采集环节决定了后续分类、评分与告警的“原料质量”。本节围绕多源采集、爬虫与API、清洗去重、存储方案四个环节展开,目标是让学员能独立设计一条可运行、可扩展、可审计的金融舆情数据管道。

一、核心原理:多源采集的“三源四层”模型

金融舆情的数据源可归纳为三类:公开媒体源(财经门户、新闻网站、监管公告)、社交与社区源(微博、股吧、雪球、微信公众号)、专业数据源(交易所公告、Wind/同花顺接口、企业预警通)。采集架构通常分为四层:接入层负责协议适配,解析层负责结构化抽取,治理层负责清洗去重,存储层负责持久化与检索。

关键原则:采集不是“抓得越多越好”,而是“抓得准、抓得稳、抓得合规”。金融领域尤其要关注信源权威性、时效性与版权边界。
金融舆情多源采集四层架构 接入层 HTTP/HTTPS · RSS · WebSocket · 交易所API · 公众号接口 解析层 HTML解析 · JSON抽取 · 正文识别 · 时间/作者/标题字段映射 治理层 清洗 · 去重 · 实体识别 · 情感预判 · 质量打分 存储层 MySQL · Elasticsearch · MongoDB · 对象存储 · 消息队列

二、方法流程:爬虫与API的协同采集

实际项目中,爬虫与API并非二选一,而是互补。API适合结构化、授权明确、频率可控的数据;爬虫适合无API或API受限的网页数据。推荐流程如下:

  1. 源清单管理:为每个源登记名称、类型、URL、频率、字段、合规状态。
  2. 调度与限速:使用Scrapy-Redis或Airflow调度,设置并发与延迟,避免封禁。
  3. 增量抓取:基于时间戳、ID或游标,只抓新增内容。
  4. 解析与落库:统一输出JSON,写入消息队列缓冲。
  5. 监控告警:对失败率、延迟、字段缺失率设置阈值。
# 示例:基于 requests + BeautifulSoup 的财经新闻增量采集
import requests, hashlib, time
from bs4 import BeautifulSoup

HEADERS = {"User-Agent": "Mozilla/5.0 (compatible; FinSentimentBot/1.0)"}
BASE = "https://example-finance.com/news?page="

def fetch_page(page):
    resp = requests.get(BASE + str(page), headers=HEADERS, timeout=10)
    resp.raise_for_status()
    soup = BeautifulSoup(resp.text, "html.parser")
    items = []
    for node in soup.select(".news-item"):
        title = node.select_one(".title").get_text(strip=True)
        url = node.select_one("a")["href"]
        pub_time = node.select_one(".time").get_text(strip=True)
        uid = hashlib.md5((title + url).encode("utf-8")).hexdigest()
        items.append({"uid": uid, "title": title, "url": url, "pub_time": pub_time})
    return items

for p in range(1, 4):
    for item in fetch_page(p):
        print(item)
    time.sleep(2)  # 限速,尊重目标站点
API采集示例:交易所公告接口通常返回JSON,可直接映射字段。务必保存原始响应,便于回溯与审计。

三、数据清洗、去重与存储方案

清洗的目标是让每条记录具备可分析性。常见操作包括:去除HTML标签与广告、统一时间格式、补全缺失字段、过滤非金融相关噪声。去重分为精确去重(URL或内容哈希)与近似去重(SimHash/MinHash),后者用于识别转载与洗稿。

环节 常用方法 金融场景要点
清洗 正则、HTML解析、时间标准化 保留股票代码、公司全称、监管文号
精确去重 MD5/SHA1 内容哈希 同一公告多站转载只留一条
近似去重 SimHash + 汉明距离 识别标题微改的重复舆情
存储 MySQL + ES + MongoDB 结构化字段入MySQL,全文检索入ES
# 示例:SimHash 近似去重(simhash 库)
from simhash import Simhash

def is_near_duplicate(text_a, text_b, threshold=3):
    ha = Simhash(text_a)
    hb = Simhash(text_b)
    return ha.distance(hb) <= threshold

print(is_near_duplicate("某银行被罚200万", "某银行遭罚200万元"))  # True

存储方案建议采用“冷热分层”:热数据(近7天)放Elasticsearch供实时检索与告警;温数据放MySQL做关联分析;冷数据归档至对象存储。消息队列(Kafka/RabbitMQ)用于削峰填谷,避免采集波动压垮下游。

四、误区与复盘

  • 误区一:只抓不存原始数据。解析失败时无法回溯,建议原始HTML/JSON先落对象存储。
  • 误区二:忽略合规与频率。金融数据版权敏感,需遵守robots协议与授权范围。
  • 误区三:去重只看URL。同一内容多URL转载会导致告警重复,必须结合内容哈希。
  • 误区四:清洗过度。把股票代码、金额等关键实体误删,直接影响风险评分。
复盘要点:采集管道的核心指标是“完整率、及时率、准确率、重复率”。建议每日生成数据质量报告,异常时自动暂停对应源并通知负责人。

综上,多源采集不是单点技术,而是一条从接入、解析、治理到存储的完整链路。掌握爬虫与API协同、清洗去重策略和分层存储方案,才能为后续的金融舆情风险分类与告警提供稳定、干净、可追溯的数据底座。