VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > python数据分析 >
  • 词云图分析股吧舆情:抓取东方财富股吧评论并分析

第18章 股吧舆情分析实战
18.1 词云图分析股吧舆情:抓取东方财富股吧评论并分析
18.1.1 先讲个真实需求:老板要我分析白酒板块的舆情
上个月老板让我分析白酒板块的舆情,看看投资者对白酒板块的看法是乐观还是悲观,哪些股票是投资者关注的焦点。我之前只会用Excel做简单vb.net教程C#教程python教程SQL教程access 2010教程的舆情分析,完全不知道怎么抓取股吧评论并生成词云图。后来发现可以用Python的requests库抓取股吧评论,用jieba库进行中文分词,用wordcloud库生成词云图。今天我就把用词云图分析股吧舆情的方法讲清楚,帮你快速做出专业的股吧舆情分析。

18.1.2 核心技术:股吧评论抓取与词云图生成

  1. 股吧评论抓取
    东方财富股吧的评论数据可以通过API接口获取,不需要登录就可以抓取公开的评论数据。
  2. 中文分词
    中文分词是指将一段中文文本分割成一个个词语,方便后续的词频统计和词云图生成。常用的中文分词库有jieba。
  3. 词云图生成
    词云图是一种可视化工具,可以将文本中出现频率较高的词语用较大的字体显示,出现频率较低的词语用较小的字体显示,帮助我们更直观地分析文本的主题和情感。常用的词云图库有wordcloud。

18.1.3 实战:抓取东方财富股吧评论并生成词云图

  1. 实战代码:抓取东方财富股吧评论并生成词云图
    python
	# 1. 导入需要的库
	import requests
	import json
	import pandas as pd
	import jieba
	import jieba.analyse
	from wordcloud import WordCloud
	import matplotlib.pyplot as plt
	import re
	from datetime import datetime
	
	# 2. 配置参数
	# 东方财富股吧API接口
	url = ' https://guba.eastmoney.com/list ,600519.html'
	# 要抓取的股票代码
	stock_code = '600519' # 贵州茅台
	# 要抓取的评论页数
	page_count = 10
	# 词云图的背景图片路径(可选)
	mask_path = 'china_map.png'
	# 停用词路径
	stopwords_path = 'stopwords.txt'
	
	# 3. 抓取东方财富股吧评论
	def get_guba_comments(stock_code, page_count):
	comments = []
	for page in range(1, page_count + 1):
	# 构造API请求URL
	api_url = f' https://guba.eastmoney.com/list ,{stock_code},f_{page}.html'
	try:
	# 发送GET请求
	response = requests.get(api_url, headers={
	'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
	})
	response.encoding = 'utf-8'
	html = response.text
	
	# 解析HTML,提取评论内容
	# 使用正则表达式提取评论标题和内容
	title_pattern = re.compile(r'<span class="l3 a3"><a href=".*?" target="_blank">(.*?)</a></span>')
	content_pattern = re.compile(r'<div class="articleh normal_post">(.*?)</div>', re.S)
	author_pattern = re.compile(r'<span class="l4 a4"><a href=".*?" target="_blank">(.*?)</a></span>')
	time_pattern = re.compile(r'<span class="l5 a5">(.*?)</span>')
	
	titles = title_pattern.findall(html)
	contents = content_pattern.findall(html)
	authors = author_pattern.findall(html)
	times = time_pattern.findall(html)
	
	# 清理评论内容
	for i in range(len(titles)):
	title = titles[i].strip()
	content = re.sub(r'<.*?>', '', contents[i]).strip() # 去除HTML标签
	author = authors[i].strip()
	time = times[i].strip()
	comments.append({
	'title': title,
	'content': content,
	'author': author,
	'time': time
	})
	print(f'成功抓取第{page}页评论,共{len(titles)}条评论')
	except Exception as e:
	print(f'抓取第{page}页评论失败: {e}')
	return comments
	
	# 4. 保存评论数据
	comments = get_guba_comments(stock_code, page_count)
	comments_df = pd.DataFrame(comments)
	# 保存为CSV文件
	comments_df.to_csv(f'{stock_code}_股吧评论_{datetime.now().strftime("%Y%m%d")}.csv', index=False, encoding='utf-8-sig')
	print(f'评论数据已保存到{stock_code}_股吧评论_{datetime.now().strftime("%Y%m%d")}.csv')
	
	# 5. 中文分词和词频统计
	def get_word_frequency(comments_df, stopwords_path):
	# 加载停用词
	with open(stopwords_path, 'r', encoding='utf-8') as f:
	stopwords = set(f.read().splitlines())
	
	# 合并标题和内容
	text = ' '.join(comments_df['title'] + ' ' + comments_df['content'])
	
	# 中文分词
	words = jieba.cut(text)
	
	# 过滤停用词和单个字符
	filtered_words = [word for word in words if word not in stopwords and len(word) > 1]
	
	# 词频统计
	word_counts = pd.Series(filtered_words).value_counts()
	
	return word_counts
	
	word_counts = get_word_frequency(comments_df, stopwords_path)
	# 保存词频统计结果
	word_counts.to_csv(f'{stock_code}_股吧评论词频统计_{datetime.now().strftime("%Y%m%d")}.csv', encoding='utf-8-sig')
	print(f'词频统计结果已保存到{stock_code}_股吧评论词频统计_{datetime.now().strftime("%Y%m%d")}.csv')
	
	# 6. 生成词云图
	def generate_wordcloud(word_counts, mask_path=None):
	# 配置词云图参数
	wc = WordCloud(
	font_path='simhei.ttf', # 中文字体路径
	background_color='white', # 背景颜色
	max_words=200, # 最大显示词语数
	max_font_size=100, # 最大字体大小
	width=1200, # 图片宽度
	height=800, # 图片高度
	mask=plt.imread(mask_path) if mask_path else None # 背景图片
	)
	
	# 生成词云图
	wc.generate_from_frequencies(word_counts)
	
	# 显示词云图
	plt.figure(figsize=(12, 8))
	plt.imshow(wc, interpolation='bilinear')
	plt.axis('off')
	plt.title(f'{stock_code}股吧评论词云图', fontsize=20)
	plt.show()
	
	# 保存词云图
	wc.to_file(f'{stock_code}_股吧评论词云图_{datetime.now().strftime("%Y%m%d")}.png')
	print(f'词云图已保存到{stock_code}_股吧评论词云图_{datetime.now().strftime("%Y%m%d")}.png')
	
	generate_wordcloud(word_counts, mask_path)

逐行讲解:
requests.get(api_url, headers={...}):发送GET请求抓取股吧评论,headers参数设置User-Agent,模拟浏览器请求,避免被反爬虫机制拦截
re.compile(r'(.*?)'):使用正则表达式提取评论标题
jieba.cut(text):使用jieba库进行中文分词
WordCloud(...):配置词云图参数,font_path参数设置中文字体路径,避免中文显示为方块
wc.generate_from_frequencies(word_counts):根据词频统计结果生成词云图
运行结果:
会生成三个文件:
1.600519_股吧评论_20250710.csv:保存抓取的股吧评论数据
2.600519_股吧评论词频统计_20250710.csv:保存词频统计结果
3.600519_股吧评论词云图_20250710.png:保存生成的词云图
同时会在浏览器中显示词云图,词云图中出现频率较高的词语用较大的字体显示,出现频率较低的词语用较小的字体显示。

18.1.4 基础知识拓展:股吧舆情分析的方法

  1. 词频分析
    词频分析是指统计文本中每个词语出现的频率,帮助我们了解文本的主题和焦点。常用的词频分析方法有TF-IDF、词袋模型等。
  2. 情感分析
    情感分析是指分析文本的情感倾向,判断文本是乐观、悲观还是中性。常用的情感分析方法有基于词典的方法、基于机器学习的方法等。
    python
	# 情感分析示例
	from snownlp import SnowNLP
	
	def analyze_sentiment(comments_df):
	# 分析每条评论的情感倾向
	comments_df['sentiment'] = comments_df['content'].apply(lambda x: SnowNLP(x).sentiments)
	# 计算平均情感倾向
	avg_sentiment = comments_df['sentiment'].mean()
	print(f'平均情感倾向: {avg_sentiment}')
	# 保存情感分析结果
	comments_df.to_csv(f'{stock_code}_股吧评论情感分析_{datetime.now().strftime("%Y%m%d")}.csv', index=False, encoding='utf-8-sig')
	print(f'情感分析结果已保存到{stock_code}_股吧评论情感分析_{datetime.now().strftime("%Y%m%d")}.csv')
	return comments_df
	
	comments_df = analyze_sentiment(comments_df)

运行结果:
会生成一个CSV文件600519_股吧评论情感分析_20250710.csv,包含每条评论的情感倾向(0表示悲观,1表示乐观),以及平均情感倾向。
3. 主题分析
主题分析是指分析文本的主题,判断文本主要讨论的内容。常用的主题分析方法有LDA(潜在狄利克雷分配)、LSA(潜在语义分析)等。
python

	# 主题分析示例
	from sklearn.feature_extraction.text import CountVectorizer
	from sklearn.decomposition import LatentDirichletAllocation
	
	def analyze_topic(comments_df, n_topics=5):
	# 文本预处理
	texts = comments_df['content'].apply(lambda x: ' '.join(jieba.cut(x)))
	
	# 构建词袋模型
	vectorizer = CountVectorizer(max_df=0.95, min_df=2, stop_words='english')
	tf = vectorizer.fit_transform(texts)
	
	# 训练LDA模型
	lda = LatentDirichletAllocation(n_components=n_topics, random_state=42)
	lda.fit(tf)
	
	# 打印主题关键词
	feature_names = vectorizer.get_feature_names_out()
	for topic_idx, topic in enumerate(lda.components_):
	print(f'主题{topic_idx+1}的关键词:')
	print(' '.join([feature_names[i] for i in topic.argsort()[:-10 - 1:-1]]))
	
	return lda
	
	lda = analyze_topic(comments_df)

运行结果:
会打印每个主题的关键词,帮助我们了解股吧评论的主要讨论内容。

18.1.5 实战优化:添加评论热度分析

  1. 实战代码:添加评论热度分析
    python
	# 分析评论热度
	def analyze_hotness(comments_df):
	# 计算每条评论的热度(评论数+点赞数+收藏数)
	# 由于东方财富股吧的API没有提供评论数、点赞数和收藏数,这里用评论的长度作为热度的近似值
	comments_df['hotness'] = comments_df['content'].apply(lambda x: len(x))
	
	# 按热度排序
	hot_comments_df = comments_df.sort_values('hotness', ascending=False)
	
	# 保存热度分析结果
	hot_comments_df.to_csv(f'{stock_code}_股吧评论热度分析_{datetime.now().strftime("%Y%m%d")}.csv', index=False, encoding='utf-8-sig')
	print(f'热度分析结果已保存到{stock_code}_股吧评论热度分析_{datetime.now().strftime("%Y%m%d")}.csv')
	
	# 打印热度最高的10条评论
	print('热度最高的10条评论:')
	print(hot_comments_df[['title', 'content', 'author', 'time', 'hotness']].head(10))
	
	return hot_comments_df
	
	hot_comments_df = analyze_hotness(comments_df)

运行结果:
会生成一个CSV文件600519_股吧评论热度分析_20250710.csv,包含每条评论的热度,并按热度排序。同时会打印热度最高的10条评论。

18.1.6 总结:股吧舆情分析的应用场景
1.投资决策:通过股吧舆情分析,可以了解投资者对股票的看法和预期,辅助投资决策。如果舆情乐观,可以考虑买入股票;如果舆情悲观,可以考虑卖出股票。
2.量化策略:在量化策略中,股吧舆情分析可以用于构建舆情驱动的交易策略,当舆情乐观时买入股票,当舆情悲观时卖出股票。
3.风险控制:通过股吧舆情分析,可以识别出投资者对股票的负面情绪,及时卖出股票,控制投资风险。
4.市场监控:通过股吧舆情分析,可以监控市场的热点股票和主题,把握市场的投资机会。
通过这个实战,你应该已经掌握了抓取东方财富股吧评论并生成词云图的方法,包括股吧评论抓取、中文分词、词频统计、词云图生成、情感分析、主题分析、热度分析等功能。接下来可以尝试用这些方法制作更专业的股吧舆情分析工具和投资决策系统。
下一节咱们就讲如何用Python做量化策略回测,帮你验证策略的有效性。

 本站原创,转载请注明出处:https://www.xin3721.com/ArticlePrograme/csharp49714.html


相关教程