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

发布时间:2020-10-13 阅读 216

Stata 连享会   主页 || 视频 || 推文

温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。

课程详情 https://gitee.com/arlionn/Course   |   lianxh.cn

课程主页 https://gitee.com/arlionn/Course

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


目录


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-

相关课程

连享会-直播课 上线了!
http://lianxh.duanshu.com

免费公开课:


课程一览

支持回看,所有课程可以随时购买观看。

专题 嘉宾 直播/回看视频
最新专题 DSGE, 因果推断, 空间计量等
Stata数据清洗 游万海 直播, 2 小时,已上线
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]

Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。


关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。直播间 有很多视频课程,可以随时观看。
  • 连享会-主页知乎专栏,300+ 推文,实证分析不再抓狂。
  • 公众号推文分类: 计量专题 | 分类推文 | 资源工具。推文分成 内生性 | 空间计量 | 时序面板 | 结果输出 | 交乘调节 五类,主流方法介绍一目了然:DID, RDD, IV, GMM, FE, Probit 等。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

连享会主页  lianxh.cn
连享会主页 lianxh.cn

连享会小程序:扫一扫,看推文,看视频……

扫码加入连享会微信群,提问交流更方便

✏ 连享会学习群-常见问题解答汇总:
https://gitee.com/arlionn/WD