金融新闻分析笔记:基于文本理解的实时舆情

168 阅读4分钟

爬虫代理

近几年,财经信息传播速度呈爆炸式增长,很多投资者、分析师、研究员都发现一个问题——真正有用的资讯,总是比人手更快一步。尤其是在突发事件频出的行情波动中,信息滞后甚至会成为潜在风险。

本文记录的是一次“自动化处理财经资讯文本”的实践,从网页数据提取、板块归类、文本情绪评估,到最终整理为结构化表格,形成一套基础性的预警机制工具。


一、问题起点:为什么要搭建这类信息分析方案?

手动阅读资讯早已无法满足实时决策场景,例如:

  • 一条政策新闻刚发布,市场几秒内就出现波动;
  • 板块联动强,事件一旦影响某类资产,相关主题同步反应;
  • 人力处理不具备规模性,尤其面对多渠道、多个页面的碎片内容。

因此,目标是:模拟信息处理者的日常行为,提取网页内容,进行文本分析,并按照内容倾向进行归档,以此完成结构化分析输入。


二、环境准备(工具 & 库)

基础环境

  • Python 3.9 或以上

依赖组件安装

pip install requests beautifulsoup4 fake_useragent pandas openpyxl
pip install snownlp

说明
本文使用的是 SnowNLP 作为中文文本的情绪倾向评估工具,同时结合 UA 模拟与 Cookie 持久参数应对目标站点内容加载策略。


三、步骤详解

步骤一:配置请求参数(模拟浏览器行为)

#爬虫代理设置(参考亿牛云代理 www.16yun.cn)
proxy_host = "proxy.16yun.cn"
proxy_port = "3100"
proxy_user = "16YUN"
proxy_pass = "16IP"

proxies = {
    "http": f"http://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}",
    "https": f"http://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}"
}

构造访问头信息:

from fake_useragent import UserAgent

headers = {
    "User-Agent": UserAgent().random,
    "Cookie": "你的cookie字符串"
}

步骤二:提取资讯标题、链接与摘要

import requests
from bs4 import BeautifulSoup

url = "https://wallstreetcn.com/news/global"
response = requests.get(url, headers=headers, proxies=proxies, timeout=10)
soup = BeautifulSoup(response.text, 'html.parser')

articles = soup.select('div.article-item__content')

news_data = []

for article in articles:
    title = article.select_one('h4').get_text(strip=True)
    link = "https://wallstreetcn.com" + article.select_one('a')['href']
    summary = article.select_one('p').get_text(strip=True)
    news_data.append({
        "标题": title,
        "链接": link,
        "摘要": summary
    })

步骤三:文本情绪判断

from snownlp import SnowNLP

for item in news_data:
    s = SnowNLP(item["摘要"])
    item["情感得分"] = round(s.sentiments, 3)

步骤四:关键词分类映射

板块关键词 = {
    "美联储": "宏观",
    "美元": "汇率",
    "黄金": "商品",
    "特斯拉": "美股",
    "A股": "A股",
    "人民币": "货币"
}

def 分板块(summary):
    for keyword, section in 板块关键词.items():
        if keyword in summary:
            return section
    return "未分类"

for item in news_data:
    item["所属板块"] = 分板块(item["摘要"])

四、整合后的示例脚本

import requests
from bs4 import BeautifulSoup
from snownlp import SnowNLP
from fake_useragent import UserAgent
import pandas as pd

# 模拟访问接口配置 参考亿牛云代理 www.16yun.cn)
proxy_host = "proxy.16yun.cn"
proxy_port = "3100"
proxy_user = "16YUN"
proxy_pass = "16IP"
proxies = {
    "http": f"http://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}",
    "https": f"http://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}"
}

headers = {
    "User-Agent": UserAgent().random,
    "Cookie": "你的cookie字符串"
}

# 网页请求与结构分析
url = "https://wallstreetcn.com/news/global"
response = requests.get(url, headers=headers, proxies=proxies, timeout=10)
soup = BeautifulSoup(response.text, 'html.parser')
articles = soup.select('div.article-item__content')

news_data = []
for article in articles:
    title = article.select_one('h4').get_text(strip=True)
    link = "https://wallstreetcn.com" + article.select_one('a')['href']
    summary = article.select_one('p').get_text(strip=True)
    sentiment = round(SnowNLP(summary).sentiments, 3)
    news_data.append({
        "标题": title,
        "链接": link,
        "摘要": summary,
        "情感得分": sentiment
    })

板块关键词 = {
    "美联储": "宏观",
    "美元": "汇率",
    "黄金": "商品",
    "特斯拉": "美股",
    "A股": "A股",
    "人民币": "货币"
}

def 分板块(summary):
    for keyword, section in 板块关键词.items():
        if keyword in summary:
            return section
    return "未分类"

for item in news_data:
    item["所属板块"] = 分板块(item["摘要"])

# 存档为表格
df = pd.DataFrame(news_data)
df.to_excel("news_sentiment_classified.xlsx", index=False)

五、常见问题整理

问题说明处理建议
无法获取页面内容访问行为受限检查代理接口是否可用,cookie 是否更新
情绪分数接近0.5句子结构过短或无明显倾向可联合标题与摘要做分析
分类结果为“未分类”较多关键词不够丰富可根据实际扩展关键词表

六、小结与建议方向

通过本次实践,我们完成了一个基本的财经资讯文本处理框架,具备自动分拣、情绪预警的初步能力。