简介这份资源是面向金融数据分析初学者与机器学习实践者的Python项目源码聚焦上市公司新闻文本的抓取、分析与分类预测帮助读者理解从数据采集到模型落地的完整链路。项目通过爬虫脚本从财经、每经网、金融界、中国证券网、证券时报网等平台获取历史新闻再经分词、停用词过滤与财经词典辅助完成文本预处理并提取词袋、TF-IDF等数值特征最终用SVM与随机森林训练分类器实现新闻自动归类。资源包共21个文件以17个Python源码为主覆盖爬虫、文本挖掘、特征工程与模型训练等模块另含3个txt词典与停用词文件及1个许可证文件压缩包约180KB结构清晰便于按模块阅读。目前已有350人学习下载适合想系统掌握文本挖掘与分类预测流程、并需要可复用代码框架的读者参考。1. 从一堆财经新闻里挖信号这套 Python 源码到底能跑出什么手里有一批上市公司新闻想按行业、按情绪、按事件类型自动打标签靠人工一条条读根本不现实。这套基于 Python 的上市公司新闻文本分析与分类预测源码解决的正是这个场景它把爬虫、中文分词、特征工程和分类器串成一条完整链路从财经、每经网、金融界、中国证券网、证券时报网等平台抓历史新闻再用 SVM、随机森林做训练和预测。适合两类人一类是想拿一个真实中文文本挖掘项目练手的 Python 学习者另一类是需要在金融舆情场景里快速搭原型的从业者。21 个文件、17 个 Python 源文件结构不复杂但麻雀虽小五脏俱全爬虫、预处理、特征提取、模型训练各模块独立改起来不牵一发动全身。下面按「这是什么 → 怎么跑 → 坑在哪」的顺序拆开讲。2. 拆开源码包目录结构与模块职责2.1 21 个文件怎么分工拿到压缩包解压后根目录下是几个run_crawler_*.py入口脚本加一个Crawler包、一个Text_Analysis包以及两个关键文本文件。这种「入口脚本 功能包」的布局是 Python 项目里比较常见的做法好处是每个爬虫可以单独跑不用一次全启动。路径类型职责run_crawler_cnstock.py入口脚本启动中国证券网爬虫run_crawler_tushare.py入口脚本启动 Tushare 数据抓取run_crawler_nbd.py入口脚本启动每经网爬虫run_crawler_stcn.py入口脚本启动证券时报网爬虫run_crawler_sina.py入口脚本启动新浪财经爬虫run_crawler_jrj.py入口脚本启动金融界爬虫Crawler/包各站点爬虫实现含crawler_cnstock.py、crawler_jrj.py、crawler_sina.py、crawler_nbd.py、crawler_stcn.py、crawler_tushare.pyText_Analysis/包text_mining.py、text_processing.py负责分词、特征提取、建模run_main.py入口脚本文本分析与分类预测主流程finance_dict.txt词典财经领域专业词汇辅助分词Chinese_Stop_Words.txt词典中文停用词表过滤无统计意义词readme.txt文档项目说明LICENSE许可证开源许可Crawler包里每个crawler_*.py对应一个新闻源彼此独立。Text_Analysis包则把文本处理和挖掘逻辑分开text_processing.py管清洗和分词text_mining.py管特征和模型。这种拆分让「换一个新闻源」和「换一个分类器」互不影响是这套源码在工程上比较舒服的地方。2.2 环境准备与依赖判断源码没有附带requirements.txt这是第一个要自己补的地方。从模块命名和功能推断核心依赖集中在几块网络请求用requestsHTML 解析用BeautifulSoup或lxml中文分词用jieba数值计算用numpy机器学习用scikit-learn。Tushare 那个爬虫还需要tushare包。# 建议在虚拟环境里装避免污染全局 python -m venv venv source venv/bin/activate # Windows 用 venv\Scripts\activate pip install requests beautifulsoup4 lxml jieba numpy scikit-learn pandas tushare这里有个判断如果run_crawler_tushare.py里 import 了 tushare就必须装如果只是预留入口没实际调用可以先跳过。装完先别急着跑爬虫用python -c import jieba, sklearn验证一下核心库能不能正常导入比跑到一半报 ModuleNotFoundError 要省事。提示Python 版本建议 3.8 到 3.10。部分财经站点对请求头校验较严后面爬虫章节会讲怎么处理。3. 爬虫模块多源新闻抓取与请求参数3.1 各站点爬虫的通用结构Crawler包里每个爬虫的骨架基本一致构造请求、解析列表页、翻页、提取正文、落盘。以新浪财经这类列表页结构为例常见写法是先用requests.get拿列表页 HTML再用解析库定位新闻链接逐条进入详情页抓正文。下面给一个贴近该源码风格的通用模板方便你对照理解每个crawler_*.py在干什么。import requests from bs4 import BeautifulSoup import time import random HEADERS { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36, Accept-Language: zh-CN,zh;q0.9, } def fetch_list(url): # 列表页请求超时设 10 秒避免单页卡死拖垮整轮 resp requests.get(url, headersHEADERS, timeout10) resp.encoding resp.apparent_encoding # 中文站点编码常需显式指定 soup BeautifulSoup(resp.text, lxml) # 选择器要按目标站点实际 DOM 调整这里是示意 links [a[href] for a in soup.select(a.news-link) if a.get(href)] return links def fetch_article(url): resp requests.get(url, headersHEADERS, timeout10) resp.encoding resp.apparent_encoding soup BeautifulSoup(resp.text, lxml) title soup.select_one(h1).get_text(stripTrue) if soup.select_one(h1) else body soup.select_one(div.article-content) content body.get_text(stripTrue) if body else # 随机休眠降低被限流的概率 time.sleep(random.uniform(1, 3)) return {url: url, title: title, content: content}逻辑说明fetch_list负责拿列表页并抽出详情链接fetch_article负责进详情页取标题和正文。两个函数都显式设置了encoding因为中文财经站点有的返回 GBK、有的返回 UTF-8不指定容易出现乱码。time.sleep加随机区间是爬虫的基本礼貌也是降低被封的关键。参数说明timeout10是单次请求上限网络差可以调到 15random.uniform(1, 3)是休眠秒数区间抓取量大时建议调到 2 到 5 秒。HEADERS里的User-Agent要换成较新的浏览器标识太老的 UA 容易被识别。3.2 翻页与增量抓取新闻站点列表页通常有分页参数常见形式是?page1、?p2或index_2.html。源码里各爬虫的翻页逻辑不统一因为每个站点规则不同。实操时我一般会先手动翻几页观察 URL 变化规律再写循环。def crawl_pages(base_url, max_page50): all_news [] for page in range(1, max_page 1): # 按站点实际分页格式拼接这里以 ?page 为例 url f{base_url}?page{page} try: links fetch_list(url) except Exception as e: print(f第 {page} 页列表抓取失败: {e}) continue if not links: print(f第 {page} 页无链接可能已到末页停止) break for link in links: try: all_news.append(fetch_article(link)) except Exception as e: print(f详情页失败 {link}: {e}) print(f第 {page} 页完成累计 {len(all_news)} 条) return all_news逻辑说明外层循环翻页内层循环抓详情。每层都套了try/except单页或单条失败不影响整体这是长时间抓取必须做的容错。if not links用来判断是否到末页比硬编码页数更稳。参数说明max_page是安全上限防止分页参数异常导致死循环。实际抓取时建议先设小一点试跑确认解析规则对了再放大。抓下来的数据建议存成 CSV 或 JSON字段至少保留url、title、content、date方便后续分析对齐。注意Tushare 那个爬虫走的是接口而非网页解析需要先在 Tushare 注册拿 token把 token 填进对应脚本再跑否则会直接报权限错误。4. 文本分析链路从停用词到 TF-IDF 特征4.1 分词与停用词过滤抓下来的新闻正文是长字符串第一步是分词。源码用jieba配合finance_dict.txt自定义词典让「上市公司」「市盈率」这类财经术语不被切碎。Chinese_Stop_Words.txt则用来过滤「的」「是」「在」这些高频但无区分度的词。import jieba import re # 加载自定义财经词典提升专业词切分准确率 jieba.load_userdict(finance_dict.txt) def load_stopwords(pathChinese_Stop_Words.txt): with open(path, r, encodingutf-8) as f: return set(line.strip() for line in f if line.strip()) STOPWORDS load_stopwords() def clean_and_cut(text): # 去掉 URL、数字编号、多余空白 text re.sub(rhttp\S, , text) text re.sub(r\s, , text) words jieba.lcut(text) # 过滤停用词和单字单字在新闻分类里噪声偏大 return [w for w in words if w not in STOPWORDS and len(w) 1]逻辑说明load_userdict必须在分词前调用否则自定义词不生效。clean_and_cut先做正则清洗再分词最后过滤停用词和长度为 1 的词。单字过滤是个经验值中文里单字歧义大做分类时保留往往拉低效果。参数说明len(w) 1这个阈值可以调。如果发现某些关键单字词如行业简称被误删可以放宽到 1或改用白名单。停用词表可以按需增删财经场景里「同比」「环比」这类词是否保留取决于你的分类目标。4.2 TF-IDF 特征提取与向量化分词结果是词列表机器学不了得转成数值向量。源码里用的是词袋和 TF-IDF 思路scikit-learn的TfidfVectorizer能直接吃分词后的字符串。from sklearn.feature_extraction.text import TfidfVectorizer # 把分词列表拼回空格分隔的字符串供向量化器使用 corpus [ .join(clean_and_cut(doc)) for doc in raw_documents] vectorizer TfidfVectorizer( max_features5000, # 保留区分度最高的 5000 个词 ngram_range(1, 2), # 同时考虑单字词和双词组合 min_df3, # 至少在 3 篇文档出现才保留过滤稀有词 max_df0.8, # 超过 80% 文档出现的词丢弃近似停用词 ) X vectorizer.fit_transform(corpus) print(特征矩阵形状:, X.shape)逻辑说明TfidfVectorizer把文本转成稀疏矩阵每行是一篇新闻每列是一个词的 TF-IDF 权重。ngram_range(1, 2)让「央行 降息」这种双词组合也能成为特征对新闻分类有帮助。参数说明max_features控制特征维度太大容易过拟合、太慢5000 是个常用起点。min_df和max_df是双向过滤前者去稀有词后者去过于普遍的词。这两个参数直接决定特征质量建议用交叉验证调。提示向量化器必须先在训练集上fit再用同一个向量化器transform测试集。如果测试集单独 fit特征空间对不上模型预测会全错这是新手最容易翻车的地方之一。5. 分类器训练与评估SVM 和随机森林怎么选5.1 两个模型的适用边界源码用了 SVM 和随机森林两种分类器。SVM 在高维稀疏文本上表现稳定尤其是线性核新闻分类这种特征维度动辄几千的场景很合适。随机森林是集成方法对特征缩放不敏感抗过拟合能力强但维度特别高时训练会慢。from sklearn.svm import LinearSVC from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report # 假设 labels 是每篇新闻的类别标签 X_train, X_test, y_train, y_test train_test_split( X, labels, test_size0.2, random_state42, stratifylabels ) svm_clf LinearSVC(C1.0, max_iter5000) svm_clf.fit(X_train, y_train) print(SVM 评估:) print(classification_report(y_test, svm_clf.predict(X_test))) rf_clf RandomForestClassifier(n_estimators200, random_state42, n_jobs-1) rf_clf.fit(X_train, y_train) print(随机森林评估:) print(classification_report(y_test, rf_clf.predict(X_test)))逻辑说明train_test_split里stratifylabels保证训练集和测试集类别比例一致类别不均衡时这一步很关键。两个模型用同一份数据训练和评估方便横向对比。参数说明LinearSVC的C是正则强度越大越拟合训练集容易过拟合从 1.0 起调。max_iter设大避免不收敛警告。随机森林的n_estimators是树的数量200 是常见起点n_jobs-1用满所有 CPU 核加速。5.2 评估指标与模型持久化新闻分类往往类别不均衡光看准确率会被多数类带偏所以classification_report里的 precision、recall、f1 都要看。训练完把模型和向量化器一起存下来下次预测直接加载不用重训。import joblib # 向量化器和模型必须成对保存预测时缺一不可 joblib.dump(vectorizer, tfidf_vectorizer.pkl) joblib.dump(svm_clf, svm_news_clf.pkl) # 预测新新闻 def predict_news(text): vec joblib.load(tfidf_vectorizer.pkl) clf joblib.load(svm_news_clf.pkl) features vec.transform([ .join(clean_and_cut(text))]) return clf.predict(features)[0]逻辑说明joblib比 pickle 更适合存 numpy 数组和 sklearn 模型速度快。预测函数里transform而不是fit_transform这是保证特征空间一致的关键。参数说明模型文件名随意但要成对管理建议加版本号或日期后缀避免新旧模型混用。预测时如果类别标签是数字记得维护一份标签到名称的映射表。6. 避坑与排查跑这套源码最容易翻车的五个地方6.1 爬虫返回空列表或乱码现象fetch_list返回空或者正文全是问号方块。原因目标站点改版导致 CSS 选择器失效或者响应编码没指定对。解决先用浏览器开发者工具确认当前 DOM 结构更新选择器编码统一用resp.apparent_encoding或手动指定resp.encoding utf-8。改版是常态选择器要定期维护。6.2 分词结果里财经术语被切碎现象「上市公司」被切成「上市」「公司」。原因jieba.load_userdict没调用或finance_dict.txt路径不对。解决确认词典文件在运行目录下用绝对路径加载词典格式是每行一个词别带多余空格。加载后可以打印几个测试句验证。6.3 训练集测试集特征维度不一致现象预测时报维度不匹配错误。原因测试集单独fit了向量化器或者两次分词规则不同。解决向量化器只在训练集 fit测试和预测一律用transform分词函数要统一别一处过滤单字一处不过滤。6.4 模型准确率虚高现象训练集准确率 99%测试集只有 60%。原因特征太多导致过拟合或者数据泄漏测试数据混进了训练。解决降低max_features加min_df过滤严格用train_test_split划分别在划分前做全局统计。6.5 Tushare 接口报权限错误现象run_crawler_tushare.py一跑就报 token 无效或积分不足。原因没填 token或账号权限不够。解决去 Tushare 官网注册拿 token 填进脚本部分接口需要积分先确认账号等级。这类接口类爬虫和网页爬虫的排查思路完全不同别混着找原因。7. 进阶技巧把分类结果接回业务场景跑通基础流程后真正有价值的是把预测结果用起来。我一般会做两件事一是给预测结果加时间维度按天统计各类新闻的数量变化做成舆情趋势二是把高置信度的预测结果反哺训练集做增量迭代。import pandas as pd # 假设 results 是 [{date, title, pred_label, prob}, ...] df pd.DataFrame(results) df[date] pd.to_datetime(df[date]) # 按天和类别聚合看趋势 trend df.groupby([df[date].dt.date, pred_label]).size().unstack(fill_value0) print(trend.tail(10)) # 只保留置信度高的样本加入下一轮训练 high_conf df[df[prob] 0.85] print(可用于增量训练的高置信样本数:, len(high_conf))逻辑说明groupby按日期和类别聚合unstack把类别转成列得到一张日期乘类别的趋势表。高置信样本筛选是半监督思路用模型自己的判断扩充训练数据但要设阈值别把错判也喂回去。参数说明prob 0.85这个阈值是经验值类别少可以调高到 0.9类别多可以降到 0.8。增量训练时新旧数据要混合别只用新数据否则会灾难性遗忘。验证模型有没有退化我习惯留一个固定的验证集每次迭代后跑一遍f1 掉了就回滚。这套源码的模块化结构让这种迭代比较顺手改text_mining.py里的训练逻辑就行不用动爬虫。从那以后我每次拿到这类文本分类项目都强制先跑一遍「小样本全流程」——抓 50 条、分好词、训一个模型、看评估报告确认链路通了再放大数据量。很多坑在小样本阶段就能暴露比抓了几万条才发现特征维度对不上要省太多时间。希望帮到你。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
WinPcap原始UDP发包:绕过协议栈的链路层精准控制 简介:本资源是一套基于WinPcap库开发的UDP发包程序源码包,面向网络编程初学者、协议学习者及底层网络工具开发者,用于实践UDP数据包构造与发送、理解无连接传输机制及WinPcap在内核级网络操作中的应用。压缩包共349个文件,涵盖3个… · 2026/9/23 14:25:22
焦虑症自愈机制源码解析:新手避坑指南与底层逻辑 焦虑症自愈机制源码解析:新手避坑指南与底层逻辑 01 版本升级后 API 全变了 刚接手项目,发现旧版 anxiety_api 报错 404 Not Found 。 别慌,这是大脑神经递质受体发生“版本迭代”,接口定义彻底重构。… · 2026/9/23 14:25:22
基于Python和OpenCV的手势数字识别:从图像处理到0-9判定 简介:这份资源是基于Python与OpenCV实现的数字图像处理手势数字识别项目源码,面向计算机相关专业正在准备期末大作业、课程设计的学生,以及需要项目实战练习的学习者,可帮助解决手势图像预处理、特征提取与数字分类识别的完整实现… · 2026/9/23 14:25:22
Tello+OpenCV轻量级二维码与数字识别工业落地方案 简介:本资源是一套基于Python与OpenCV实现的Tello无人机视觉应用实战项目,面向计算机视觉初学者、毕业设计及课程设计学生,解决无人机实时二维码扫描与数字图像识别两大核心问题。项目完整封装了图像采集、预处理、轮廓检测、透视变换、OCR识… · 2026/9/23 15:12:09
国产codex技术发展与应用场景探索 刚接触科研时,光是各种免费文献网站的推荐就让我眼花缭乱,每个都试一下,结果哪个都没用透,效率极低。直到我静下心来深度测试,才发现真正能称为“天花板”的网站,只需要四个。尤其是第一个,它能… · 2026/9/23 15:12:09
告别复制崩溃:位运算性能优化保姆级教程 告别复制崩溃:位运算性能优化保姆级教程 你是不是也遇到过这种抓狂时刻?从网上复制了一段位运算代码,觉得逻辑很巧妙,结果一跑就报错,或者跑通了但速度慢得让人想砸键盘。想调吧,连哪里卡住都不知道,看着满屏的 & , | , ^… · 2026/9/23 15:12:09
国产开源Java物联网平台:千万设备接入与百万并发实战 1. 项目概述:为什么一个“国产开源 Java 物联网平台”能扛住千万设备、百万并发?最近在几个工业客户现场做边缘网关联调时,有位做了十年 SCADA 系统的老工程师盯着我笔记本上跑着的控制台日志,突然问了一句:“你们这平… · 2026/9/23 15:12:09
无线投屏app图解原理:3步搞定环境配置避坑指南 无线投屏app图解原理:3步搞定环境配置避坑指南 配置环境就卡半天,是不是觉得无线投屏app的开发像拆炸弹?别急,咱们今天不整虚的,直接上 图解原理… · 2026/9/23 15:12:03
C#教学网站源码从解压到改造:完整实战指南 简介:这是一套基于C#与SQL Server 2008开发的计算机教学网站源码,采用VS2010搭建WebForm项目,并使用三层架构组织代码,适合.NET初学者、毕业设计者及需要快速搭建教学类门户的开发者。网站整合了视频上传浏览、文件上传下载、在线… · 2026/9/23 15:12:02
3招搞定手机怎么下载微信面试难题实战项目解析 3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29