👇 连享会 · 推文导航 | www.lianxh.cn
🍎 Stata:Stata基础 | Stata绘图 | Stata程序 | Stata新命令 📘 论文:数据处理 | 结果输出 | 论文写作 | 数据分享 💹 计量:回归分析 | 交乘项-调节 | IV-GMM | 时间序列 | 面板数据 | 空间计量 | Probit-Logit | 分位数回归 ⛳ 专题:SFA-DEA | 生存分析 | 爬虫 | 机器学习 | 文本分析 🔃 因果:DID | RDD | 因果推断 | 合成控制法 | PSM-Matching 🔨 工具:工具软件 | Markdown | Python-R-Stata 🎧 课程:最新专题 | 计量专题 | 关于连享会
🍓 课程推荐:连享会: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_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-。
尊敬的老师 / 亲爱的同学们:
连享会致力于不断优化和丰富课程内容,以确保每位学员都能获得最有价值的学习体验。为了更精准地满足您的学习需求,我们诚挚地邀请您参与到我们的课程规划中来。 请您在下面的问卷中,分享您 感兴趣的学习主题或您希望深入了解的知识领域 。您的每一条建议都是我们宝贵的资源,将直接影响到我们课程的改进和创新。 我们期待您的反馈,因为您的参与和支持是我们不断前进的动力。感谢您抽出宝贵时间,与我们共同塑造更加精彩的学习旅程!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 站」,「面板数据」,「公开课」 等关键词细化搜索。