资讯动态

Python金融数据挖掘全流程:从Selenium爬虫到评分入库的实战源码解析

发布时间:2026/10/14 15:51:16 来源:尧图企业网站定制
简介这是一份面向金融数据分析学习者与从业者的Python实战资源包系统覆盖金融大数据挖掘全流程从爬虫采集、数据清洗与评分系统到可视化、数据库管理和综合案例分析适合希望用Python解决金融问题的初中级读者。压缩包共32个文件以25个Python源码为主辅以3个Excel数据集及说明文档整体仅118KB代码轻量便于直接研读。已有2252人学习。核心价值在于提供完整可运行的代码链条涵盖主流财经网站数据抓取、信用评分与新闻打分、Tushare金融数据接口、相关性分析与可视化等典型任务并配套数据文件和2份分析报告便于对照输出理解思路。从爬虫基础到数据库实战目录结构清晰是一份理论与实践衔接紧凑的入门进阶资料。1. 数据挖掘在金融场景落地这套 Python 全流程源码能帮你省掉三个月的弯路做金融数据分析的人多半都有过这种体验数据源不稳定、清洗规则散落在各处、评分口径三天两头变等数据终于能看了业务的答案已经不需要了。这套《数据挖掘Python金融大数据挖掘与分析全流程详解案例源码》踩的正是这些点——它从数据采集端开始把爬虫、清洗、评分、可视化、入库五个环节串成一条完整的链路全部以可运行的源码呈现而不是零散的知识点。在数据挖掘的学习路径里金融领域尤其吃“全流程”这一套。因为单看一个模型或一个算法你很难感知真实业务里数据从哪来、脏到什么程度、评分该用什么口径。这套源码包适合已经会一点 Python、想直接上手金融数据业务的开发者也适合刚学完 Pandas 和 Selenium、正愁找不到综合项目的入门者。它不是教科书式的理论推演而是把“从新闻到分数、从分数到图表、从图表到数据库”这一整套动作直接摆在你面前照着跑一遍就能理解每个环节的衔接逻辑。2. 数据获取层Selenium 爬虫脚本的写法与四个落点2.1 为什么金融数据采集优先选 Selenium 而不是 Requests金融类站点的反爬逻辑普遍比资讯类站点更敏感很多目标页面的数据是动态渲染的用 Requests 直接请求拿不到完整内容。常见的做法是先用 Selenium 驱动浏览器模拟真实访问等页面渲染完成后再抽取 DOM 节点。这套资源里的案例实战 2 部分给出了四个独立爬虫脚本Eastmoney_selenium.py、Wenshu_selenium.py、Juchao_selenium.py、SinaShares_selenium.py。它们分别对应不同金融数据源的采集但写法上有共通的结构初始化浏览器选项、设置隐性等待、定位目标容器、翻页或滚动加载、最后解析并落盘。以下是一个和脚本同思路的采集框架示例用于说明 Selenium 处理动态页面的基本盘from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 配置无头模式降低资源占用 opts Options() opts.add_argument(--headless) opts.add_argument(--disable-gpu) opts.add_argument(--no-sandbox) driver webdriver.Chrome(optionsopts) driver.get(https://example-finance-site.com/list) wait WebDriverWait(driver, 10) # 等待列表容器出现后再获取数据避免空 DOM 报错 container wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, div.news-list)) ) items container.find_elements(By.CSS_SELECTOR, div.news-item) for it in items: title it.find_element(By.CSS_SELECTOR, a.title).text link it.find_element(By.CSS_SELECTOR, a.title).get_attribute(href) print(title, link) driver.quit()这段代码的核心在于WebDriverWait的使用。金融页面的数据加载通常不是一次性的先出现框架再异步填充内容如果没有等待机制你拿到的可能是一堆空节点。这里把等待时间设为 10 秒超时后抛出异常至少能让问题暴露得早一些。参数说明--headless适合部署在服务器上但会丢失部分反爬特征本地调试时可以去掉--disable-gpu在 Linux 环境下能避免大部分渲染异常--no-sandbox是容器环境常见的保命参数。真实脚本里还需要考虑 Cookie 保持和请求间隔后面避坑章节会展开。2.2 新闻采集脚本的结构单页与批量之间的逻辑切换案例实战 1 里有几个专门针对新闻源的脚本sogouNews.py、baidu_news.py、news_pageBytime.py、news_piliang.py其中news_pageBytime.py处理的是按时间维度翻页news_piliang.py显然是批量采集版本。这两类脚本的区别很典型按时间翻页需要在 URL 上拼时间参数或者点击日历控件批量采集则往往走循环。import time from selenium import webdriver from selenium.webdriver.common.by import By driver webdriver.Chrome() base_url https://example-news-site.com/search?keyword金融page{} for page in range(1, 6): driver.get(base_url.format(page)) time.sleep(2) # 控制请求频率降低被封概率 articles driver.find_elements(By.CSS_SELECTOR, div.result) for a in articles: title a.find_element(By.TAG_NAME, h3).text date a.find_element(By.CLASS_NAME, date).text print(f第{page}页 | {date} | {title}) driver.quit()time.sleep(2)是这套脚本里比较重要的参数设太短会被识别成机器行为设太长采集效率太低。批量场景下我一般会在每次翻页前检查当前页是否和前一次重复防止某些站点在最后一页无限循环。3. 数据清洗与评分系统把新闻文本变成可用的数字分数3.1 标题评分和正文评分的差异为什么不能只用一个入口资源包里有三个评分相关文件ScoringBY_TEXT.py、ScoringBY_Title.py、daily_Scoring.py。拆开看前两个分别对正文和标题打分第三个做每日综合评分。这个设计思路值得注意——金融舆情分析里标题和正文的信息密度完全不同。标题通常高度凝练包含核心情绪词比如“暴跌”“超预期”“风险警示”这些词的权重远高于正文里的泛泛描述。而正文里有大量背景信息和转折结构可能需要用实体级别的规则去匹配。只做标题评分会丢失深度信息只做正文评分会被噪音句子干扰。合理的做法是算两个分再赋权融合。import jieba import re # 情绪词典正向和负向词的权重可以按业务调整 positive_words {增长: 1.5, 突破: 1.2, 利好: 2.0, 超预期: 2.5} negative_words {暴跌: -2.5, 亏损: -2.0, 违规: -1.8, 风险: -1.2} def score_by_title(title: str) - float: score 0.0 for word in jieba.cut(title): if word in positive_words: score positive_words[word] elif word in negative_words: score negative_words[word] return round(score, 2) def score_by_text(text: str) - float: score 0.0 # 正文按句切分避免长文本的情绪稀释 sentences re.split(r[。], text) for sent in sentences: for word in jieba.cut(sent): if word in positive_words: score positive_words[word] * 0.6 # 正文权重低于标题 elif word in negative_words: score negative_words[word] * 0.6 return round(score / max(len(sentences), 1), 2) title_score score_by_title(某公司业绩超预期 股价突破历史高位) text_score score_by_text(该公司发布财报业绩增长明显但行业竞争加剧存在一定风险。) print(标题分:, title_score, 正文分:, text_score)这段代码演示了混合评分的逻辑。ScoringBY_TITLE和ScoringBY_TEXT本质上就是这个思路的扩展版差异在于各自的词典规模和切分粒度。需要注意jieba.cut的输出是迭代器每轮循环都会重新分词文本量大时可以考虑先分词再查词表性能差异在万级文本上会比较明显。3.2 每日评分与数据归档时间维度的价值daily_Scoring.py的存在说明这套系统不是一次性评分而是按天维度滚动计算。金融舆情分析最有价值的不是单条新闻的分数而是分数的时间序列变化——某公司连续三天负面评分走高这种趋势信号比绝对值更有意义。import pandas as pd from datetime import datetime def daily_aggregate(df: pd.DataFrame) - pd.DataFrame: df 需要包含列: date, title_score, text_score 返回每日加权综合分 df[date] pd.to_datetime(df[date]) # 权重: 标题 0.6, 正文 0.4, 理由见上文 df[combined] df[title_score] * 0.6 df[text_score] * 0.4 daily df.groupby(df[date].dt.date).agg( avg_score(combined, mean), max_score(combined, max), min_score(combined, min), news_count(combined, count) ).reset_index() # 超过 2 天的数据可以算环比这里输出趋势方向 daily[trend] daily[avg_score].diff().fillna(0) return dailygroupby按日期聚合的意义在于去除单条新闻的偶然性。某些负面新闻当天可能被标题党推高分数但聚合到一天后如果整体平均值并没有明显下行说明市场情绪其实是稳定的。参数上标题 0.6 / 正文 0.4这个权重并不是固定值你可以根据回测结果调整——如果某类新闻标题和正文方向经常不一致说明权重设置有问题。3.3 评分结果落盘为什么要加 score_arange.py 这一步score_arange.py从命名上猜功能是把评分结果按区间归组。这在风控场景里相当实用——原始分数是连续值但业务决策需要离散等级比如 A/B/C/D 四档。def arange_score(score: float) - str: if score 3.0: return A # 强正面 elif score 0.5: return B # 温和正面 elif score -0.5: return C # 中性 else: return D # 负面不要小看这个“分箱”逻辑。在很多实际项目里决策方要的不是精确到小数点后两位的分数而是可以直接路由的等级标签。把连续分数映射成离散等级配合后续入库查询和统计都会高效很多。4. 数据可视化与 Tushare 数据源从静态图到趋势观察4.1 Tushare 接口的接入方式与 Token 管理Tushare_get.py和TSdata_plot.py的出现说明这套源码不止依赖爬虫还接入了标准化的金融数据接口。Tushare 在国内金融数据获取里算是常用选择稳定性和字段完整度比爬虫高一个量级适合做对标数据或者验证爬虫抓下来的数据是否准确。import tushare as ts import pandas as pd # 初始化接口token 在个人主页获取 ts.set_token(your_tushare_token_here) pro ts.pro_api() # 获取某只股票近一年的日线数据 df pro.daily( ts_code000001.SZ, start_date20240101, end_date20241231 ) # 按日期升序排列便于画图 df df.sort_values(trade_date).reset_index(dropTrue) print(df.head())使用 Tushare 有两点值得注意。第一每个账号有积分权限限制不同接口要求的积分门槛不同daily这类基础接口一般注册就能用但高频或另类数据可能需要更高权限。第二pro 接口返回的字段都是大写命名和本地习惯的驼峰命名不一致建议在读取后马上做统一 rename不然后续写清洗逻辑时会频繁踩 KeyError。TSdata_plot.py大概率是把 Tushare 拿到的行情数据和前面算好的新闻评分画在同一张图上观察二者是否相关。这种“行情 情绪”双轴图在金融舆情项目里是标配输出。4.2 画图脚本的常规套路双轴图与相关性检查TSdata_plot.py加上correlation_eg.py一个管可视化一个管相关性计算组合起来就是“股价跌了是不是因为新闻负面”这类问题的验证工具。先画图再算相关系数顺序不能反——直接算相关性数字容易被离群点误导图能让你先看到整体形态。import matplotlib.pyplot as plt import pandas as pd # 假设 df_price 有 trade_date 和 close 列df_score 有 date 和 avg_score 列 df_price[trade_date] pd.to_datetime(df_price[trade_date]) df_score[date] pd.to_datetime(df_score[date]) merged pd.merge( df_price, df_score, left_ontrade_date, right_ondate, howinner ) fig, ax1 plt.subplots(figsize(12, 6)) ax1.plot(merged[trade_date], merged[close], colorsteelblue, label收盘价) ax1.set_ylabel(收盘价) ax2 ax1.twinx() ax2.plot(merged[trade_date], merged[avg_score], colorcoral, label舆情评分) ax2.set_ylabel(评分) plt.title(股价与舆情评分走势对比) plt.show() # 计算评分与收盘价的相关系数 corr merged[avg_score].corr(merged[close]) print(f相关系数: {corr:.3f})twinx()生成双轴是这里的核心动作。两套数据的量纲完全不同股价可能几十块评分可能只有正负几直接画在同一坐标系会吞掉评分曲线。双轴让趋势对比成为可能。相关性计算放在画图之后双重确认。4.3 数据文件的管理习惯share.xlsx 与 data.xlsx 的定位资源包里出现share.xlsx和data.xlsx说明这套流程有明确的中间产物分层。data.xlsx大概率是爬虫抓到的原始数据share.xlsx可能是清洗后或用于共享的数据版本。这个习惯建议保留——原始数据和加工数据混在一起是数据分析项目里最常见的乱源。5. 数据库实战从 Excel 到 SQL 的存储升级避坑5.1 为什么要从文件存储切到数据库爬虫脚本越来越多、评分任务变成每日跑批之后Excel 的瓶颈就出现了打开慢、并发读写冲突、没有事务保障、无法增量更新。资源包里的SQL_python.py和baiduNews_sql.py正好覆盖了两个层次——前者是 Python 操作 SQLite 的基础演示后者是把百度新闻爬取结果直接写入数据库的实战脚本。SQLite 是金融数据分析入门阶段最合适的选择不需要单独装服务一个 .db 文件就能跑迁移成本也低。等数据量大到单文件扛不住再换 MySQL 或 PostgreSQL模型基本不用改。import sqlite3 # 建立数据库连接不存在则自动创建 conn sqlite3.connect(finance_news.db) cursor conn.cursor() # 建表语句字段类型尽量严格避免后续数据格式混乱 cursor.execute( CREATE TABLE IF NOT EXISTS news_scores ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, source TEXT, publish_date TEXT, title_score REAL, text_score REAL, combined_score REAL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ) # 用 executemany 批量插入参数化写法防止 SQL 注入 data [ (某公司三季度业绩超预期, baidu, 2024-11-20, 2.5, 1.8, 2.22), (行业监管新规落地, sogou, 2024-11-20, -0.8, -0.5, -0.68), ] cursor.executemany( INSERT INTO news_scores (title, source, publish_date, title_score, text_score, combined_score) VALUES (?, ?, ?, ?, ?, ?), data ) conn.commit() conn.close()5.2 数据库实战的常见问题字段顺序、重复数据和事务管理SQL_python.py这类脚本看起来简单但实际跑批时会遇到的问题不少集中在下面几点。这段代码里用executemany而不是逐条execute在数据量几百条以上的时候性能差异明显。参数化查询不只是安全考虑也是可维护性的关键——直接拼接 SQL 字符串在字段值里出现单引号时会直接报错。5.3 数据入库后的查询习惯不要在 Python 里过滤交给 SQL我在看过很多半成品项目后发现一个通病开发者喜欢用pd.read_sql全量读进 DataFrame然后在 Pandas 里做筛选。数据量小没问题但新闻表日积月累到了几十万行每次全量读就是灾难。正确的做法是把过滤条件写到 SQL 里只取需要的行。例如要查某一天的负面新闻import sqlite3 import pandas as pd conn sqlite3.connect(finance_news.db) query SELECT title, source, combined_score, publish_date FROM news_scores WHERE publish_date ? AND combined_score 0 ORDER BY combined_score ASC LIMIT 20 df pd.read_sql_query(query, conn, params(2024-11-20,)) conn.close() print(df)注意params的传法SQLite 的?占位符对应一个 Python 值多个条件就传元组。LIMIT 20是另一个容易被忽略的细节——查询结果用于人工复核时你不需要全部数据只需要最极端的前 N 条。6. 综合分析与报告输出把打分结果变成可读的决策依据6.1 多页数据挖掘报告爬虫采集后的文本分析流程资源包里出现了多页数据挖掘报告.txt、数据挖掘报告.txt这两个文本文件值得重视。它们不是代码而是分析报告的输出样例。很多人在做金融数据挖掘时会陷入一个误区代码跑完了、图表画出来了但不知道怎么写结论。这两个 txt 样例给出了一个不错的框架。报告的核心不是罗列数据而是回答三个问题采集了什么、发现了什么、建议什么。比如爬了某公司近一个月的新闻发现负面评分在某个时间点附近急剧升高而股价也在同一时间窗口内下跌——这个“相关但不一定因果”的观察就是报告里最有价值的部分。综合分析的输出可以作为 API 被调用也可以作为日报的一部分自动生成。整个过程形成闭环之后你会发现数据挖掘项目的价值不在于用了多少高级算法而在于链路是否通畅——从采集到清洗到评分到入库到报告每一步都有人能看懂、能复现。6.2 自动化日报脚本的习惯固定路径、固定格式、定时执行项目进行到后期我养成了一个习惯让评分和报告流程固定下来用同一套命名规则、同一套输出目录。每天收盘后跑一遍脚本第二天早上直接看结果文件。中间某个环节出了问题看日志定位到具体是哪个脚本报错比在一次性的 Jupyter Notebook 里翻找哪个单元格出了问题要快得多。这也许就是这套源码包给我最大的启发——全流程的源码不是一个一个的孤岛而是被巧妙地串联了起来。希望这份拆解能让你在复现时少走几步弯路。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑