社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

连享会 • 昨天 • 12 次点击  


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

图片
图片


🍓 课程推荐:连享会:2025面板数据因果推断专题 · 线上
嘉宾:徐轶青,斯坦福大学
时间:2025 年 6 月 14-15;21-22;28-29 日每天9:00-12:30
咨询:王老师 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_post 的 div 标签下,因此我们可以构造如下代码进行爬取。当然,以上过程也可以借助 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-。



图片

连享会微信小店上线啦!

Note:扫一扫进入“连享会微信小店”,你想学的课程在这里······

图片
图片

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

图片


🍏 关于我们

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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/183204
 
12 次点击