Python:情感分析之爬取东方财富股吧评论

文摘   教育   2024-11-23 22:01   中国  

👇 连享会 · 推文导航 | www.lianxh.cn

🍓 课程推荐:连享会:2025 寒假班
嘉宾:连玉君(初级|高级);杨海生(前沿)
时间:2025 年 1 月 13-24 日
咨询:王老师 18903405450(微信)

作者: 梁海(河北大学)
邮箱:  lianyhai@163.com


目录

  • 1. 引言

  • 2. 爬取工具

  • 3. 代码实现

    • 3.1 导入相关库

    • 3.2 分析网址规律

    • 3.3 爬取和解析网页源代码

    • 3.4 保存结果

    • 3.5 补充

  • 4. 情绪打分

  • 5. 获取上证指数分时数据

  • 6. 参考文献


温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」

1. 引言

自 2006 年上线以来,「东方财富股吧」以其独创的交互模式,成为深受广大中小投资者喜爱的投资交流社区之一。也因此,其股吧评论可以有效代表资本市场上中小投资者情绪。

本文将主要介绍如何爬取「东方财富股吧」评论,并计算评论情绪倾向。

2. 爬取工具

本文使用了 Python 的 request 库作为主要爬取工具,并且该库具有简单易用等特点,能够满足一般的数据爬取需求。

进一步,本文使用了 xpath 来获取特定标签所储存的信息。XPath,全称 XML Path Language,即 XML 路径语言。XPath 最初设计是用来搜寻 XML 文档的,但是也同样适用于 HTML 文档的搜索。XPath 的选择功能十分强大,不但提供了非常简洁明了的路径选择表达式,而且还提供了超过 100 个内建函数用于字符串、数值、时间的匹配,以及节点、序列的处理等。甚至,我们可以认为几乎所有定位的节点都可以用 XPath 来选择。

3. 代码实现

本文爬取的股吧为上证指数,作为国民关注度最高的指数,该股吧也是众多的股吧中活跃度最高的。因此用上证指数股吧,作为爬取对象。

在本文中,我们将仅以「上证指数」的股吧评论为例进行演示。

3.1 导入相关库

import requests         ##获取网页  
from lxml import etree  ##解析文档  
import pandas as pd     ##保存文件  

3.2 分析网址规律

网址:http://guba.eastmoney.com/list,zssh000001,f.html

第一页如图所示:

第二页如图所示:

可以发现,两页网址区别在于 f_ 后面的数字不同,因此可以通过设置数字爬取不同页面内容。

3.3 爬取和解析网页源代码

通过 requests 库,我们可以获取网页源代码。

headers = {'User-Agent''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36'}  #构造头文件,模拟浏览器。
for page in range(1,max_page+1):
    #获取网页源代码
    print('crawling the page is {}'.format(page))  
    url= f'http://guba.eastmoney.com/list,zssh000001,f_{page}.html'  
    response  = requests.get(url, headers=headers) 

然后,通过 xpath 解析网页源代码,我们就可以获取需要信息。

在谷歌浏览器内按 F12 进入开发者模型,审查我们所需要的元素,如下图:

可以看出,所有的标题和时间都保存在属性为 articleh normal_postdiv 标签下,因此我们可以构造如下代码进行爬取。当然,以上过程也可以借助 XPath Helper 工具大大简化,

title = root.xpath("//div[contains(@class,'articleh normal_post')]//span[@class='l3 a3']//a//text()")  
time = root.xpath("//div[contains(@class,'articleh normal_post')]//span[@class='l5 a5']//text()")  

完整代码如下:

max_page  = 20   #最大爬取页面
all_title = []   #爬取的标题存储列表
all_time  = []   #爬取的发表时间储存列表
headers = {'User-Agent''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36'}  #构造头文件,模拟浏览器。
for page in range(1,max_page+1):
    #获取网页源代码
    print('crawling the page is {}'.format(page))  
    url= f'http://guba.eastmoney.com/list,zssh000001,f_{page}.html'  
    response  = requests.get(url, headers=headers) 
    #解析网页源代码
    root = etree.HTML(response.text)  
    title = root.xpath("//div[contains(@class,'articleh normal_post')]//span[@class='l3 a3']//a//text()")  
    time = root.xpath("//div[contains(@class,'articleh normal_post')]//span[@class='l5 a5']//text()")  
    all_title += title  #保存到总数组上
    all_time  += time 

3.4 保存结果

data_raw = pd.DataFrame()  
data_raw['title'] = all_title  
data_raw['time'] = all_time  
data_raw.to_excel('.//data_raw.xlsx', index=False)  

输出结果如下:

3.5 补充

如何获取自己的 User-Agent?

进入开发者模型,点击 Network,如下图:

然后,点击任意一个 Name 列的标题,就可以看到 User-Agent,如下图:

User-Agent 会告诉网站服务器,访问者是通过什么工具来请求的,如果是爬虫请求,一般会拒绝,如果是用户浏览器,就会应答。

4. 情绪打分

不久之前,百度正式发布情感预训练模型 SKEP (Sentiment Knowledge Enhanced Pre-training for Sentiment Analysis)。通过利用情感知识增强预训练模型,SKEP 在 14 项中英情感分析典型任务上全面超越 SOTA。

具体实现原理,详见「SKEP: Sentiment Knowledge Enhanced Pre-training for Sentiment Analysis」。

#!pip install paddlehub

import paddlehub as hub
data_raw = pd.read_excel(".\\data_raw.xlsx")
data_raw['time'] = pd.to_datetime('2020 '+data_raw['time'])
##这里使用了百度开源的成熟NLP模型来预测情感倾向
senta = hub.Module(name="senta_bilstm")
texts = data_raw['title'].tolist()
input_data = {'text':texts}
res = senta.sentiment_classify(data=input_data)
data_raw['pos_p'] = [x['positive_probs'for x in res]
##重采样至五分钟
data_raw.index = data_raw['time']
data = data_raw.resample('15min').mean().reset_index()

部分股本评论的情感评分如下:

可以看出,上述情感评分具有一定借鉴意义。

5. 获取上证指数分时数据

AkShare 是基于 Python 的财经数据接口库,可以实现对股票、期货、期权、基金、外汇、债券、指数、数字货币等金融产品的基本面数据、历史行情数据、以及衍生数据的快速采集和清洗。接下来,我们将使用 AKShare 库获取上证指数分时数据,具体代码如下:

#pip instasll akshare --usre
import akshare as ak
sz_index = ak.stock_zh_a_minute(symbol='sh000001', period='15', adjust="qfq")
sz_index['day'] = pd.to_datetime(sz_index['day'])
sz_index['close'] = sz_index['close'].astype('float')
data = data.merge(sz_index,left_on='time',right_on='day',how='inner')
import matplotlib.pyplot as plt
matplotlib.use('Qt5Agg')
data.index = data['time']
data[['pos_p','close']].plot(secondary_y=['close'])
plt.show()

可以看出,情绪相对于上证指数存在一个滞后效应。在初始的大幅上涨中,情绪没有立刻上涨,而是在第二次小幅上涨后才出现大幅度的上升。

6. 参考文献

  • akshare -Link-
  • Tian H, Gao C, Xiao X, et al. SKEP: Sentiment Knowledge Enhanced Pre-training for Sentiment Analysis[J]. arXiv preprint arXiv:2005.05635, 2020. -Link-。


尊敬的老师 / 亲爱的同学们:

连享会致力于不断优化和丰富课程内容,以确保每位学员都能获得最有价值的学习体验。为了更精准地满足您的学习需求,我们诚挚地邀请您参与到我们的课程规划中来。 请您在下面的问卷中,分享您 感兴趣的学习主题或您希望深入了解的知识领域 。您的每一条建议都是我们宝贵的资源,将直接影响到我们课程的改进和创新。 我们期待您的反馈,因为您的参与和支持是我们不断前进的动力。感谢您抽出宝贵时间,与我们共同塑造更加精彩的学习旅程!https://www.wjx.cn/vm/YgPfdsJ.aspx# 再次感谢大家宝贵的意见!

New! Stata 搜索神器:lianxh 和 songbl  GIF 动图介绍
搜: 推文、数据分享、期刊论文、重现代码 ……
👉 安装:
  . ssc install lianxh
  . ssc install songbl
👉  使用:
  . lianxh DID 倍分法
  . songbl all

🍏 关于我们

  • 连享会 ( www.lianxh.cn,推文列表) 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 直通车: 👉【百度一下: 连享会】即可直达连享会主页。亦可进一步添加 「知乎」,「b 站」,「面板数据」,「公开课」 等关键词细化搜索。

连享会
连玉君老师团队分享,主页:lianxh.cn。白话计量,代码实操;学术路上,与君同行。
 最新文章