Python股票论坛舆情监控脚本:自动抓取、情感分析与报告生成
36
0
0
0
想知道最近大家都在聊哪些股票?想了解股民们对特定股票的情绪是乐观还是悲观?与其每天泡在论坛里,不如写个Python脚本帮你自动监控!本文将带你一步步构建一个能够自动抓取股票论坛帖子,提取股票代码提及量和情感倾向,并生成每日股票讨论热度和情感分析报告的Python脚本。
1. 整体框架设计
这个脚本主要分为以下几个模块:
- 数据抓取模块: 从指定的股票论坛抓取帖子数据。
- 数据清洗模块: 清洗抓取到的数据,去除HTML标签、特殊字符等。
- 股票代码识别模块: 从清洗后的文本中识别股票代码。
- 情感分析模块: 分析帖子的情感倾向(正面、负面、中性)。
- 数据汇总模块: 汇总每日的股票代码提及量和情感倾向。
- 报告生成模块: 生成每日的股票讨论热度和情感分析报告。
2. 数据抓取模块
这里以某股票论坛为例,使用requests
库获取网页内容,BeautifulSoup4
库解析HTML。你需要分析目标论坛的网页结构,找到帖子列表和帖子内容的URL规律。
import requests from bs4 import BeautifulSoup def fetch_forum_posts(forum_url, page_num): """从指定论坛页面抓取帖子数据""" url = f'{forum_url}?page={page_num}' # 构建翻页URL try: response = requests.get(url, timeout=10) # 设置超时时间 response.raise_for_status() # 检查请求是否成功 soup = BeautifulSoup(response.content, 'html.parser') # TODO: 根据论坛的HTML结构,定位到帖子列表 post_list = soup.find_all('div', class_='post') # 假设帖子都在class为'post'的div中 return post_list except requests.exceptions.RequestException as e: print(f"抓取页面失败: {e}") return []
注意:
- 不同的论坛HTML结构不同,你需要根据实际情况修改
soup.find_all()
中的参数。 - 一些论坛可能会有反爬虫机制,你需要设置合适的
User-Agent
,甚至使用代理IP。 - 要尊重网站的robots.txt协议,避免过度抓取。
3. 数据清洗模块
抓取到的帖子数据通常包含HTML标签、特殊字符等,需要进行清洗。
import re def clean_text(text): """清洗文本数据,去除HTML标签和特殊字符""" text = re.sub(r'<[^>]+>', '', text) # 去除HTML标签 text = re.sub(r'&[^;]+;', '', text) # 去除HTML实体 text = re.sub(r'[\n\r\t]', '', text) # 去除换行符和制表符 text = re.sub(r'[^\w\s]', '', text) # 去除非字母数字字符 return text.strip()
4. 股票代码识别模块
使用正则表达式从文本中识别股票代码。中国A股的股票代码通常是6位数字,以600、601、000、002、300开头。
import re def extract_stock_codes(text): """从文本中提取股票代码""" pattern = r'(60[01]\d{3}|00[02]\d{3}|300\d{3})' # 匹配A股股票代码 stock_codes = re.findall(pattern, text) return list(set(stock_codes)) # 去重
5. 情感分析模块
情感分析可以使用现成的库,例如SnowNLP
或TextBlob
。这里以SnowNLP
为例,它是一个简单的中文情感分析库。
from snownlp import SnowNLP def analyze_sentiment(text): """分析文本的情感倾向""" s = SnowNLP(text) sentiment_score = s.sentiments # 返回情感得分,范围是0-1,越接近1表示越积极 if sentiment_score > 0.6: return 'positive' elif sentiment_score < 0.4: return 'negative' else: return 'neutral'
注意:
- 情感分析的准确率取决于训练数据的质量。如果需要更高的准确率,可以考虑使用更复杂的模型,或者自定义训练数据。
- 可以根据实际情况调整情感得分的阈值。
6. 数据汇总模块
将每天抓取到的数据进行汇总,统计每个股票代码的提及次数和情感倾向。
from collections import defaultdict def summarize_data(post_list): """汇总帖子数据,统计股票代码提及次数和情感倾向""" stock_code_counts = defaultdict(int) stock_code_sentiments = defaultdict(lambda: {'positive': 0, 'negative': 0, 'neutral': 0}) for post in post_list: cleaned_text = clean_text(post.get_text()) stock_codes = extract_stock_codes(cleaned_text) sentiment = analyze_sentiment(cleaned_text) for code in stock_codes: stock_code_counts[code] += 1 stock_code_sentiments[code][sentiment] += 1 return stock_code_counts, stock_code_sentiments
7. 报告生成模块
将汇总后的数据生成每日报告,报告可以保存为CSV文件或Excel文件。
import csv import datetime def generate_report(stock_code_counts, stock_code_sentiments, filename=None): """生成每日股票讨论热度和情感分析报告""" if filename is None: today = datetime.date.today() filename = f'stock_report_{today}.csv' with open(filename, 'w', newline='', encoding='utf-8') as csvfile: fieldnames = ['股票代码', '帖子数量', '正面情感比例', '负面情感比例', '中性情感比例'] writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() for code, count in stock_code_counts.items(): sentiments = stock_code_sentiments[code] total_sentiment = sum(sentiments.values()) if total_sentiment == 0: positive_ratio = negative_ratio = neutral_ratio = 0 else: positive_ratio = sentiments['positive'] / total_sentiment negative_ratio = sentiments['negative'] / total_sentiment neutral_ratio = sentiments['neutral'] / total_sentiment writer.writerow({ '股票代码': code, '帖子数量': count, '正面情感比例': f'{positive_ratio:.2f}', '负面情感比例': f'{negative_ratio:.2f}', '中性情感比例': f'{neutral_ratio:.2f}' }) print(f'报告已生成: {filename}')
8. 主程序
将各个模块组合起来,实现完整的股票论坛舆情监控功能。
if __name__ == '__main__': forum_url = 'http://example.com/forum' # 替换成你的目标论坛URL all_posts = [] for page in range(1, 6): # 抓取前5页的数据 posts = fetch_forum_posts(forum_url, page) if not posts: break # 如果抓取失败,则停止 all_posts.extend(posts) stock_code_counts, stock_code_sentiments = summarize_data(all_posts) generate_report(stock_code_counts, stock_code_sentiments)
9. 总结与展望
通过以上步骤,我们实现了一个简单的股票论坛舆情监控脚本。这个脚本可以帮助你快速了解股民们对特定股票的讨论热度和情感倾向。当然,这个脚本还有很多可以改进的地方:
- 更强大的数据抓取功能: 支持更多类型的论坛,例如使用Selenium模拟浏览器行为,抓取动态加载的数据。
- 更准确的情感分析: 使用更复杂的模型,例如深度学习模型,或者自定义训练数据。
- 更丰富的数据可视化: 将报告数据可视化,例如生成股票讨论热度曲线图、情感倾向饼图等。
- 定时任务: 使用定时任务工具,例如
cron
,定时运行脚本,自动生成每日报告。
希望这篇文章能帮助你入门股票论坛舆情监控,祝你投资顺利!记住,股市有风险,投资需谨慎哦!别光听论坛里瞎忽悠,自己也要好好研究!