网易首页 > 网易号 > 正文 申请入驻

手把手教你爬取50W基金贴吧数据,并做投资者情绪分析!

0
分享至

  

  大数据文摘授权转载自菜J学Python

  作者:J哥

  最近金融市场辗转波动,年初入场的小伙伴也许还在等待市场的回暖。面对错综复杂的市场环境,如何才能通过技术手段,更快更好判断市场的变化,提前行动,是每一个会编程或想学编程的基民共同追求的目标。

  本文通过利用Python技术,手把手教你爬取天天基金贴吧50W+数据并分析投资者情绪,让你更快洞察金融市场变化。

  网页分析

  我们首先挑选一只白酒基金,看看这只基金贴吧的数据,网址及网页内容如下:

  http://guba.eastmoney.com/list,of161725.html

  

  由上图可知,该基金共有6371页合计509669条讨论记录,且还在不断更新。数据字段包括阅读、评论、标题、作者、最后更新(评论时间)。点击下一页,URL变为:

  http://guba.eastmoney.com/list,of161725_2.html

  很显然,这是简单的静态网页,只需设置基金代码参数和页码参数来拼接URL,即可爬取任意基金贴吧数据。

  数据爬取

  本文爬虫用的Pycharm,首先导入爬虫相关包:

  import csvimport timeimport randomimport requestsimport tracebackfrom time import sleepfrom fake_useragent import UserAgentfrom lxml import etree

  尝试请求一页数据,尽量设置随机睡眠时间和使用随机生成的headers,这是爬虫人最基本的道德修养,也是最简单的防反爬措施:

  page = 1 #设置爬取的页数fundcode = 161725 #可替换任意基金代码sleep(random.uniform(1, 2)) #随机出现1-2之间的数,包含小数headers = {"User-Agent":UserAgent(verify_ssl=False).random}url = f'http://guba.eastmoney.com/list,of{fundcode}_{page}.html'response = requests.get(url, headers=headers, timeout=10)print(reponse)

  F12看下网页源代码:

  

  网页结构还是很简单的,数据存放在id为articlelistnew的div下,该div下的第一个div为标题行,因此从第二个div解析数据即可。本文采用xpath解析,其他解析方式也很简单。

  parse = etree.HTML(response.text) # 解析网页items = parse.xpath('//*[@id="articlelistnew"]/div')[1:91]for item in items:item = {'阅读': ''.join(item.xpath('./span[1]/text()')).strip(),'评论': ''.join(item.xpath('./span[2]/text()')).strip(),'标题': ''.join(item.xpath('./span[3]/a/text()')).strip(),'作者': ''.join(item.xpath('./span[4]/a/font/text()')).strip(),'时间': ''.join(item.xpath('./span[5]/text()')).strip()}print(item)

  数据爬取下来,我们将其存储为csv格式:

  with open(f'./{fundcode}.csv', 'a', encoding='utf_8_sig', newline='') as fp:fieldnames = ['阅读', '评论', '标题', '作者', '时间']writer = csv.DictWriter(fp, fieldnames)writer.writerow(item)

  爬取多页数据并将爬虫代码封装成函数,另外,建议在各代码段加入异常处理,以防程序中途退出:

  # 主函数def main(page):fundcode = 161725 #可替换任意基金代码url = f'http://guba.eastmoney.com/list,of{fundcode}_{page}.html'html = get_fund(url)parse_fund(html,fundcode)

if __name__ == '__main__':for page in range(1,6372): #爬取多页(共6371页)main(page)time.sleep(random.uniform(1, 2))print(f"第{page}页提取完成")

  OK,数据爬取完成。

  投资者情绪

  本文数据处理分析用的Jupyter notebook,数据爬取完成后,我们就可以开始分析数据了,首先导入数据:

  import pandas as pdimport numpy as np
df = pd.read_csv("/菜J学Python/金融/天天基金/161725.csv",names=['阅读', '评论', '标题', '作者', '时间'])

  做一些基本的数据清洗:

  #重复和缺失数据df = df.drop_duplicates()df = df.dropna()
#数据类型转换df['阅读'] = df['阅读'].str.replace('万','').astype('float')df['时间'] = pd.to_datetime(df['时间'],errors='ignore')
#机械压缩去重def yasuo(st):for i in range(1,int(len(st)/2)+1):for j in range(len(st)):if st[j:j+i] == st[j+i:j+2*i]:k = j + iwhile st[k:k+i] == st[k+i:k+2*i] and kk = k + ist = st[:j] + st[k:]return styasuo(st="J哥J哥J哥J哥J哥")df["标题"] = df["标题"].apply(yasuo)
#过滤表情df['标题'] = df['标题'].str.extract(r"([\u4e00-\u9fa5]+)")df = df.dropna() #纯表情直接删除
#过滤短句df = df[df["标题"].apply(len)>=3]df = df.dropna()

  先制作一个词云图,看看大家对于这只基金的看法:

  import jiebaimport stylecloudfrom IPython.display import Image
# 绘制词云图text1 = get_cut_words(content_series=df['标题'])stylecloud.gen_stylecloud(text=' '.join(text1), max_words=200,collocations=False,font_path='simhei.ttf',icon_name='fas fa-heart',size=653,#palette='matplotlib.Inferno_9',output_name='./基金.png')Image(filename='./基金.png')

  

  好像很难明显看出基民们的情绪......

  于是,继续用更为量化的方法,计算出每个评论的情感评分:

  import paddlehub as hubsenta = hub.Module(name="senta_bilstm")texts = df['标题'].tolist()input_data = {'text':texts}res = senta.sentiment_classify(data=input_data)df['投资者情绪'] = [x['positive_probs'] for x in res]

  对数据进行重采样:

  #重采样至15分钟df['时间'] = pd.to_datetime(df['时间'])df.index = df['时间']data = df.resample('15min').mean().reset_index()

  通过AkShare这一开源API接口获取上证指数分时数据,AkShare是基于Python的财经数据接口库,可以实现对股票、期货、期权、基金、外汇、债券、指数、数字货币等金融产品的基本面数据、历史行情数据的快速采集和清洗。

  import akshare as akimport matplotlib.pyplot as plt
sz_index = ak.stock_zh_a_minute(symbol='sh000001', period='15', adjust="qfq")sz_index['日期'] = pd.to_datetime(sz_index['day'])sz_index['收盘价'] = sz_index['close'].astype('float')data = data.merge(sz_index,left_on='时间',right_on='日期',how='inner')matplotlib.use('Qt5Agg')data.index = data['时间']data[['投资者情绪','收盘价']].plot(secondary_y=['close'])plt.show()

  

  可以看出,投资者情绪相对于上证指数存在一个滞后效应。

  点「在看」的人都变好看了哦!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐

邻国传来好消息!单日新增大幅降低,媒体感恩:多亏了中国疫苗

海峡军武
2021-05-14 16:33:05

巴萨彻底出局,梅球王欲哭无泪!皇马唉声叹气羡慕马竞好运气?

开球咯
2021-05-14 23:29:29

大学生性调查报告数据解读,你觉得意料之中还是出乎意料呢?

记录之路
2021-05-13 11:02:34

莫迪是低种姓,而且曾是卖茶的小贩,为何最终成为印度总理

阿森侃文
2021-05-14 09:30:18

官宣二胎!为了挣遗产,她甘当豪门生育机器?

毒舌一姐
2021-05-13 21:09:41

恒河100多具浮尸原因曝光,印度开口向中方求援,钟南山发出警告

粉红佩琪
2021-05-14 21:07:52

被拐走后17年父子团聚,得知父亲是贫困户后拒绝再见

梦魇绽荼蘼
2021-05-14 15:50:53

伊朗强人内贾德复出,哈马斯过早暴露实力,以色列恐慌要斩草除根

氧气占星
2021-05-14 18:24:59

郭富城毫不在意年龄,和小22岁妻子同框,穿搭简约仍似小伙子

封面时尚
2021-05-14 15:10:38

广州梅州一男孩不愿上学,母亲带他去抹水泥体验辛苦,干了1个月还喜欢上了?

记录之路
2021-05-14 06:28:30

接种中国疫苗第8天,杜特尔特突然说了句前所未有的话,舆论沸腾

海拔新观察
2021-05-14 20:42:06

中美火星车将成为邻居!美国此前反复索要数据,中国承诺知识共享

金十数据
2021-05-14 21:20:29

莫里森不会跟中国打交道,派外长跑到华盛顿,美国务卿:别害怕

排头国际
2021-05-14 18:25:38

芯片封锁再升级?台湾禁止半导体人才赴大陆工作

照理说事
2021-05-14 16:00:02

欧盟:不和中国合作了!中国与欧盟“制裁战”背后,真相是什么?

相见与再见
2021-05-14 12:10:38

吃完10块钱的穷比快乐屋,我感动哭了

厨房人类研究所
2021-05-14 13:44:17

“铁穹”大战火箭弹对中国有何启示?军事专家解读

环球网资讯
2021-05-14 06:44:21

美军截停神秘船只,结果搜出大量中国武器?枪支密密麻麻摆满甲板

林晓爱生活
2021-05-14 04:47:00

每经21点丨辽宁营口新增5名患者均为同一摄影基地员工,9地升级为中风险地区;安徽:近期非必需不前往六安合肥中风险地区

每日经济新闻
2021-05-14 21:21:08

婚后发现妻子和别人开房两百多次 还爱做直播,男子称愿意原谅

王法仪
2021-05-13 08:47:48
2021-05-15 08:20:51
大数据文摘
大数据文摘
专注大数据,每日有分享!
4285文章数 86247关注度
往期回顾 全部

科技要闻

国家航天局:天问一号将于近期择机实施着陆

头条要闻

巴以冲突安理会连开两场会却未发声明 美表态耐人寻味

头条要闻

巴以冲突安理会连开两场会却未发声明 美表态耐人寻味

体育要闻

再见!塔利斯卡晒登机照片 离开中国

娱乐要闻

破年龄壁垒!张丰毅李若彤合体健身

财经要闻

汽车要闻

高性价比V12豪华车 迈巴赫S680正式发布

态度原创

旅游
数码
教育
时尚
本地

旅游要闻

自驾秘境湘西,这些美景你可能从未见过!

数码要闻

2399元起售 国行Xbox Series X|S将于6月10日起推出

教育要闻

俄罗斯的底牌藏在一座70年的大楼里……

某内衣品牌逐渐重口味?竟然选了她

本地新闻

男生为什么都喜欢王冰冰?