你的浏览器不支持canvas

墨染半纸,清心煮字

微博情感分析API-电子科大教师事件

Date: Author: 吕雄

本文章采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。转载请注明来自吕雄

采用微博API接口爬取

微博API接口平台 https://open.weibo.com/wiki/%E5%BE%AE%E5%8D%9AAPI

以非开发者身份采集信息每日上线1000条

将数据存入Mysql数据库

主要展示爬取过程,不做具体分析`

情感分布

爬取到的内容示例,包括以下字段[ id 日期 地区 (微博标签) 评论内容]

1 页 127 条
破晓_ing524114 Sat Aug 14 09:37:10 +0800 2018 : 天津 (  ) 我觉得停课很正常 他作为一名老师给学生传播错误的思想或者事实 难道不严重?
1 页 128 条
Muffin-Hostel Fri Aug 11 22:51:18 +0800 2017 : 每个人都有各自的观点,只要有理有据,就应得到尊重。  
#%%cell1
from weibo import APIClient
import webbrowser
import pymysql
import matplotlib.pyplot as plt 
import numpy as np  
from snownlp import SnowNLP

APP_KEY = '' #获取的App Key https://open.weibo.com/
APP_SECRET = '' #获取的AppSecret
CALLBACK_URL = 'https://api.weibo.com/oauth2/default.html' #回调链接

client = APIClient(app_key=APP_KEY, app_secret=APP_SECRET, redirect_uri=CALLBACK_URL)
url = client.get_authorize_url()
webbrowser.open_new(url) #打开默认浏览器获取code参数

#print ('输入url中code后面的内容后按回车键:')##自动打开浏览器后链接末尾每次的code值不同

code = input()
r = client.request_access_token(code)
access_token = r.access_token# 新浪返回的token,类似abc123xyz456
expires_in = r.expires_in
client.set_access_token(access_token, expires_in)# 设置得到的access_token

#%%cell2
###更多功能参见https://open.weibo.com/wiki/%E5%BE%AE%E5%8D%9AAPI
###功能1:获取当前登录用户以及所关注用户(已授权)的微博(我关注的用户)https://open.weibo.com/wiki/2/statuses/home_timeline
#statuses = client.statuses__friends_timeline()['statuses'] 
##print(statuses) 
#length = len(statuses)
##print (length)
#输出了部分信息
#for i in range(0,length):
#    #print (u'昵称:'+statuses[i]['user']['screen_name'])
#    #print (u'简介:'+statuses[i]['user']['description'])
#    #print (u'位置:'+statuses[i]['user']['location'])
#    #print (u'微博:'+statuses[i]['text'])

#%%cell3
###功能2:获取某条微博下的评论,功能介绍https://open.weibo.com/wiki/2/comments/show
##如获取https://m.weibo.cn/detail/4408009629387032电子科大教师事件下的评论
for j in range(1,40):#每日上线1000条 for j in range(1,40)
    i=0
    r = client.comments.show.get(id = 4160547165300149,count = 200,page = j)##调用API爬单条微博的评论
    for st in r.comments:
        i+=1
        text = st.text
        name = st['user']['name']##评论者
        time = st['user']['created_at']##评论时间
        location = st['user']['location']#评论者位置
        description = st['user']['description']##评论者标签
        ##print(j,'页',i,'条')
        #print(name,time,':',location,'(',description,')',text)
# 1 页 127 条
#破晓_ing524114 Sat Aug 14 09:37:10 +0800 2018 : 天津 (  ) 我觉得停课很正常 他作为一名老师给学生传播错误的思想或者事实 难道不严重?
#1 页 128 条
#Muffin-Hostel Fri Aug 11 22:51:18 +0800 2017 : 每个人都有各自的观点,只要有理有据,就应得到尊重。   
        
        ##将数据存入数据库
        ##由于编码不同可能无法插入,需修改数据库字段编码为utf8,默认是 latin1 
        conn =pymysql.connect(host='localhost',user='root',password='lvxiong',charset="utf8",use_unicode = True)#连接服务器
        cur = conn.cursor()
        sql = "insert into weibo.dzkdcomments(name,time,location,description,text) values(%s,%s,%s,%s,%s)" #格式是:数据名.表名(域名)
        param = (name,time,location,description,text)
        try:
            A = cur.execute(sql,param)
            conn.commit()
        except Exception as e:
            print(e)
            conn.rollback()
##读取数据
conn =pymysql.connect(host='localhost',user='root',password='lvxiong',charset="utf8",use_unicode = True)#连接服务器
with conn:
    cur = conn.cursor()
    cur.execute("SELECT text FROM weibo.dzkdcomments" )
    rows = cur.fetchall()
    ##print(rows)
    
##排除重复值
#for row in rows:
#    #print(row)
#    row = list(row)
#    del row[0]
#    commentlist = []
#    if row not in commentlist:
#        commentlist.append(row)
#        #print(commentlist)

##SnowNLP自然语言处理
    sentimentslist = []    
for i in range(0,7770):
    ##print(rows[i])
    s = SnowNLP(str(rows[i]))
    ##print(s.sentiments)
    sentimentslist.append(s.sentiments)
    
##绘图    
plt.hist(sentimentslist,bins=np.arange(0,1,0.02))
plt.show()

墨染半纸,清心煮字...