python爬取股票评论_Python爬虫股票评论,snowNLP简单分析股民用户情绪

原标题:Python爬虫股票评论,snowNLP简单分析股民用户情绪

一、背景

股民是网络用户的一大群体,他们的网络情绪在一定程度上反映了该股票的情况,也反映了股市市场的波动情况。作为一只时间充裕的研究僧,我课余时间准备写个小代码get一下股民的评论数据,分析以下用户情绪的走势。代码还会修改,因为结果不准确,哈哈!

二、数据来源

本次项目不用于商用,数据来源于东方财富网,由于物理条件,我只获取了一只股票的部分评论,没有爬取官方的帖子,都是获取的散户的评论。

三、数据获取

Python是个好工具,这次我使用了selenium和PhantomJS组合进行爬取网页数据,当然还是要分析网页的dom结构拿到自己需要的数据。

爬虫部分:

fromselenium importwebdriver

importtime

importjson

importre

# from HTMLParser import HTMLParser

frommyNLP import *

# from lxml import html

# import requests

classCrawler:

url =''

newurl =set()

headers ={}

cookies ={}

def__init__( self, stocknum, page) :

self.url ='http://guba.eastmoney.com/list,'+stocknum+',5_'+page+'.html'

cap =webdriver.DesiredCapabilities.PHANTOMJS

cap[ "phantomjs.page.settings.resourceTimeout"] =1000

#cap["phantomjs.page.settings.loadImages"] = False

#cap["phantomjs.page.settings.localToRemoteUrlAccessEnabled"] = True

self.driver =webdriver.PhantomJS( desired_capabilities=cap)

defcrawAllHtml( self, url) :

self.driver.get( url)

time.sleep( 2)

# htmlData = requests.get(url).content.decode('utf-8')

# domTree = html.fromstring(htmlData)

# return domTree

defgetNewUrl( self, url) :

self.newurl.add( url)

deffilterHtmlTag( self, htmlStr) :

self.htmlStr =htmlStr

#先过滤CDATA

re_cdata=re.compile( '//

[ >] ∗//

>',re.I) #匹配CDATA

re_=re.compile( ']*>[^',re.I) #

re_style=re.compile( ']*>[^',re.I) #style

re_br=re.compile( '') #处理换行

re_h=re.compile( '?w+[^>]*>') #HTML标签

re_comment=re.compile( '') #HTML注释

s=re_cdata.sub( '', htmlStr) #去掉CDATA

s=re_.sub( '',s) #去掉

s=re_style.sub( '',s) #去掉style

s=re_br.sub( 'n',s) #将br转换为换行

blank_line=re.compile( 'n+') #去掉多余的空行

s=blank_line.sub( 'n',s)

s=re_h.sub( '',s) #去掉HTML标签

s =re_comment.sub( '',s) #去掉HTML注释

#去掉多余的空行

blank_line =re.compile( 'n+')

s =blank_line.sub( 'n',s)

returns

defgetData( self) :

comments =[]

self.crawAllHtml( self.url)

postlist =self.driver.find_elements_by_xpath( '//*[@id="articlelistnew"]/div')

forpost inpostlist :

href =post.find_elements_by_tag_name( 'span')[ 2].find_elements_by_tag_name( 'a')

iflen(href) :

self.getNewUrl(href[ 0].get_attribute( 'href'))

# if len(post.find_elements_by_xpath('./span[3]/a/@href')):

# self.getNewUrl('http://guba.eastmoney.com'+post.find_elements_by_xpath('./span[3]/a/@href')[0])

forurl inself.newurl :

self.crawAllHtml(url)

time =self.driver.find_elements_by_xpath( '//*[@id="zwconttb"]/div[2]')

post =self.driver.find_elements_by_xpath( '//*[@id="zwconbody"]/div')

age =self.driver.find_elements_by_xpath( '//*[@id="zwconttbn"]/span/span[2]')

iflen(post) andlen(time) andlen(age) :

text =self.filterHtmlTag(post[ 0].text)

iflen(text) :

tmp =myNLP(text)

comments.append({ 'time':time[ 0].text, 'content':tmp.prob, 'age':age[ 0].text})

commentlist =self.driver.find_elements_by_xpath( '//*[@id="zwlist"]/div')

iflen(commentlist) :

forcomment incommentlist :

time =comment.find_elements_by_xpath( './div[3]/div[1]/div[2]')

post =comment.find_elements_by_xpath( './div[3]/div[1]/div[3]')

age =comment.find_elements_by_xpath( './div[3]/div[1]/div[1]/span[2]/span[2]')

iflen(post) andlen(time) andlen(age) :

text =self.filterHtmlTag(post[ 0].text)

iflen(text) :

tmp =myNLP(text)

comments.append({ 'time':time[ 0].text, 'content':tmp.prob, 'age':age[ 0].text})

returnjson.dumps(comments) 存储部分:

这部分其实可以用数据库来做,但是由于只是试水,就简单用 json文件来存部分数据 importio

classFile:

name =''

type =''

src =''

file =''

def__init__( self, name, type, src) :

self.name =name

self.type =type

self.src =src

filename =self.src +self.name +'.'+self.type

self.file =io.open(filename, 'w+', encoding='utf-8')

definputData( self, data) :

self.file.write( data.decode( 'utf-8'))

self.file.close()

defcloseFile( self) :

self.file.close() 测试用的local服务器:

这里只是为了要用浏览器浏览数据图,由于需要读取数据,js没有权限操作本地的文件,只能利用一个简单的服务器来弄了

importSimpleHTTPServer

importSocketServer;

PORT = 8000

Handler = SimpleHTTPServer.SimpleHTTPRequestHandler

httpd = SocketServer.TCPServer(("", PORT), Handler);

httpd.serve_forever()NLP部分:snowNLP这个包还是用来评价买卖东西的评论比较准确

不是专门研究自然语言的,直接使用他人的算法库。这个snowNLP可以建立一个训练,有空自己来弄一个关于股票评论的。

#!/usr/bin/env python

# -*- coding: UTF-8 -*-

fromsnownlpimportSnowNLP

classmyNLP:

prob = 0.5

def_init_(self, text):

self.prob = SnowNLP(text).sentiments主调度:

# -*- coding: UTF-8 -*-

'''''

Created on 2017年5月17日

@author: luhaiya

@id: 2016110274

@deion:

'''

#http://data.eastmoney.com/stockcomment/ 所有股票的列表信息

#http://guba.eastmoney.com/list,600000,5.html 某只股票股民的帖子页面

#http://quote.eastmoney.com/sh600000.html?stype=stock 查询某只股票

fromCrawlerimport*

fromFileimport*

importsys

default_encoding = 'utf-8'

ifsys.getdefaultencoding() != default_encoding:

sys.setdefaultencoding(default_encoding)

defmain():

stocknum = str(600000)

total = dict()

foriinrange(1,10):

page = str(i)

crawler = Crawler(stocknum, page)

datalist = crawler.getData()

comments = File(stocknum+'_page_'+page,'json','./data/')

comments.inputData(datalist)

data = open('./data/'+stocknum+'_page_'+page+'.json','r').read()

jsonData = json.loads(data)

fordetailinjsonData:

num = '1'if'年'notindetail['age'].encode('utf-8')elsedetail['age'].encode('utf-8').replace('年','')

num = float(num)

date = detail['time'][4:14].encode('utf-8')

total[date] = total[date] ifdateintotal.keys()else{'num':0,'content':0}

total[date]['num'] = total[date]['num'] + numiftotal[date]['num']elsenum

total[date]['content'] = total[date]['content'] + detail['content']*numiftotal[date]['content']elsedetail['content']*num

total = json.dumps(total)

totalfile = File(stocknum,'json','./data/')

totalfile.inputData(total)

if__name__ =="__main__":

main()四、前端数据展示

使用百度的echarts。用户的情绪是使用当天所有评论的情绪值的加权平均,加权系数与用户的股龄正相关。

分析图表

body{texr-align:center;}

#mainContainer{width:100%;}

#fileContainer{width:100%; text-align:center;}

#picContainer{width: 800px;height:600px;margin:0 auto;}

这里是文件夹列表

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第三方库:snownlp、tushare、pandas、numpy、matplotlib getData:从东方财富网旗下的股吧论坛爬取数据 SQL:用到的数据库操作函数 quantilizeSentiment:量化情绪指数,生成excel文件便于后面进行情绪指数和股票价格涨幅相关度的量化分析股票价格历史数据来自tusharepro网站,可以免费获取) result:传入某只股票代码,返回情绪指数结果(主要关注此文件即可,其他爬虫分析之类的我后面放到云上,爬取的数据都放入云数据库中) analyze:进行情绪指数和股票价格涨幅相关度分析、数据可视化 爬取后的数据存储在云端数据库中: db = pymysql.connect(host="116.62.46.214",user="dfcf",password="iJHPFZnRjXacNi6p",db="dfcf",port=3306) 接口说明(重点!!!): 函数: def data(share_code):#计算情绪指数 传参:share_code 股票代码(例如:zssh000001)上证指数 返回参数:result 情绪指数 例如: if __name__ == '__main__': result=data('zssh000001') #传入股票代码参数 print(result) #打印情绪指数结果 实现功能:根据传入的股票代码到东方财富网旗下的股吧对应的某股票分论坛爬取当天的用户评论信息,并将爬取的数据存储到MySQL中,之后再将数据进行统计并计算出该股票当天的市场情感趋势。 执行流程 1、输入股票代码 2、清空数据库上一天的评论信息 3、使用爬虫爬取当天东方财富网股吧论坛中该股票股民评论信息并进行数据清洗过滤,筛选出有效信息,存入MySQL数据库 4、使用金融情感计算模型进行文本数据分析 5、得出该股票当日的情绪指数 6、返回情绪指数值 计算情绪指数具体算法实现 借助自然语言处理中的情感分类技术。按照正常的处理流程,需要搭建模型、准备语料库、训练模型、测试模型然后得到一个情感分类的模型。但这里,时间有限,所以直接使用现有的模型。snownlp是一个中文的开源的自然语言处理的Python库,可以进行分词、情感分类等。在本项目中可以直接使用它来量化出某一日市场投资者的整体情绪。量化的方法有许多种,可以将某一日所有的评论情绪得分得分相加再求评价,也可以求某一日情绪得分大于0.5的评论所占的比例。 项目所采用的方法: 将情绪得分>0.6的评论当作积极评论,小于0.4的评论当作消极评论。 设置变量neg和pos,存储某一日市场的积极情绪因子和消极情绪因子。关于neg和pos的计算方法,以neg为例: 初始化为0,若某一日的某一评论comment的情绪得分<0.4 neg=neg+1+log(该条评论的点赞数+该条评论作者的粉丝数+1,2),其中log(x,2)表示以2为低的x的对数。考虑该条评论的点赞数和该条评论作者的粉丝数是因为考虑到不同的评论的质量不同。取对数是为了让数据更加平滑,防止极值过大。+1是为了防止该条评论的点赞数和该条评论作者的粉丝数都为0。 计算某一日市场的总体情绪得分score。设计的模型是: score=log((pos/(pos+neg+0.0001)-0.5)*(该日评论总数+1)) (pos/(pos+neg+0.0001)-0.5)的意思是计算市场的情绪倾向,**大于0表明市场积极情绪情绪较强,越接近0.5越强。小于0反之。**后面的(该日评论总数+1),是因为某一日投资者的评论越多,代表市场投资者情绪的波动越大。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值