狂热与孤寂重叠回忆 在无处落脚的人海里
你的停靠成为岛屿 成为陆地 成为具体
爱你锋利的伤痕 爱你成熟的天真
多谢你如此精彩耀眼 做我平淡岁月里星辰

新浪微博爬取

首先将weiboSpider下载到本地,然后将自己的cookies和要爬取的微博ID替换上去,就可以用了。

这里注意一下这段代码的运行环境是python2.7,因为和3.0及以上版本print的语法不同,所以跑的时候要注意一下。

绘制点赞、转发、评论折线图

接下来的任务我们用R来完成。(因为python并不会用。)

加载包

# 数据预处理
library(tidyverse)
library(stringr)
library(lubridate)
library(plyr)

# 绘图
library(ggplot2)
library(ggthemes)
library(ggthemr)
library(plotly)

# 词云
library(jiebaR)
library(wordcloud2)

# 导出
library(htmltools)

导入数据

然后我们导入之前从微博爬到的数据,我们先看下原来的数据格式。
pyexample
我们可以看到文件由用户信息+原创微博内容组成,原创微博内容是我们需要抓取的内容。

这里需要注意的是在导入之前,需要在记事本里现将文件保存为UTF-8编码,这样导入R才不会乱码。

# 读入文件
filePath <- 'weibo/2013783327.txt' # 指定文件路径
text <- read_lines(filePath,skip=8) # 跳过用户信息

数据预处理

我们发现每一条微博内容都是第一行正文,第二行发布时间,第三行是赞转评,我们把它分别提取出来,并储存到数据框中。

这里遇到的坑首先是list和dataframe的转换,日期型的转到数据框永远是factor,头痛,lubricate包也不能拯救我。后来找到as.Date(as.character.Date(weibodate))这句话感觉世界都好了。

# 删去空行
txt <-  text[text!=""]

# 提取微博正文
seq1 <- seq(1,length(txt),by=3)
weibo <- txt[seq1]
# list合并为data.frame
zw<- do.call(rbind,lapply(weibo, data.frame)) 

# 提取发表时间
seq1 <- seq(2,length(txt),by=3)
weibodate <- txt[seq1] %>% str_replace(.,'发布时间:','')
wd<- do.call(rbind,lapply(weibodate, data.frame))
# factor转日期
mydate <- as.Date(as.character.Date(weibodate)) %>% as.data.frame()


# 提取赞转评
seq1 <- seq(3,length(txt),by=3)
weibozzp <- txt[seq1]
# 导出的文件会有一个‘\t’,我们把它当成一个标识拆分点赞评
zzp <- weibozzp %>% 
  str_replace (.,'点赞数:','') %>%  
  str_replace (.,'转发数:','') %>% 
  str_replace (.,'评论数:','') %>% 
  str_split(.,'\t ',3) %>% 
  as.data.frame() 
# 转置数据框
zzpt <- t(zzp) 
# 这里也存在factor的问题,还是用as.numeric(as.character(x))这样转换两次的语句来解决。
zzptt <-apply(zzpt,2,function(x)as.numeric(as.character(x))) %>% as.data.frame()

# 合并日期、内容、与转赞评,生成数据集db
db <- cbind(zzptt,mydate,zw)
names(db) <- c('点赞','转发','评论','date','content')

绘制图像

现在我们有了一个包含点赞数、转发数、评论数、发表日期、正文的5列的tidy的数据集,可以开始可视化探索啦!

开始用了ggplot2+ggthemr的组合感觉很好,因为ggthemr的主题真的非常漂亮。
不过最后还是用了plotly来绘图,因为觉得交互性也很重要,而且可以导出静态图片,也可以选择某个变量,某个时间段,非常方便。

代码:

# 提取2017年10月后的微博
# 之前的数据都比较稳定无波动
db.recent <- db %>% filter(date>'2017-10-1')

# 数据变为长格式
# 这里注意gather指定多于一个不变的变量时用-,-,就可以了,用c()包裹会报错。
ldb <- db.recent %>% 
  gather(key = variable , value = value, -date,-content)


# 绘制动态图像
a <- plot_ly(ldb, 
        type      = 'scatter', 
        mode      = 'lines', 
        x         = ~date, 
        y         = ~value, 
        color     = ~variable,
        # 这里指定悬浮框显示内容
        text      = ~paste('date: ', date, '\n',
                           'variable: ', variable, '\n',
                           'value: ', value, '\n' ,
                           '微博: ', content, '\n'),
        hoverinfo = 'text'
        )

# 图像导出为网页
htmlwidgets::saveWidget(as_widget(a),'index.html')

现在我们得到了折线图:
dzp
动态的点这里

当然还可以研究下怎么更完善(文本换行、横纵轴标度、text的显示)~

结论(TBC)

理论上说,一条微博应该是点赞>评论>转发,但因为抡博组的努力,转发量非常高,所以我们这里只看点赞与评论。

  • 小周是从流行之王正式出道的,从出道后到参加偶像练习生之前,都没有什么大的水花,微博平均点赞XX条,评论XX条,这里面还存在后来偶练红了一点粉丝捞的。

  • 偶练期间,热度很高,微博平均点赞XX条,评论XX条

  • 偶练结束后,数据就稳定的在回落,微博平均点赞XX条,评论XX条,当然这也不能完全说是小花糊了,这和小花沦为广告博主是分不开的……你看八张自拍的数据就很好……

横向对比

对比一下其他家的数据。

文本分析(TBC)

其实转评赞都是附带的,本意是想分分析下小周微博都在说啥……
这里用到两个包jiebaRwordcloud2,感觉都很好用~

下面展示一个基本流程,细节还需要继续完善。

构建分词器

# 新建分词器
z <- worker()

# 定义新词
# 一些人名、专用词
new_user_word(z, "朱星杰", "n") 

# 定义停止词
# 一些不需要分析的词
stopwords <- c("的", "了", "在", "是", "我", "有", "和", "就",  "不", "人", "都", "一", "一个", "上", "也", "很", "到", "说", "要", "去", "你", "会", "着", "没有", "看", "好", "自己", "这")

分词预处理

segWords <- segment(weibo,z)

# 去除停止词
segWords <- filter_segment(segWords,stopwords)
# 去除数字和英文
segWords<-gsub("[0-9a-zA-Z]+?","",segWords)
# 去除空格
segWords<-str_trim(segWords)

# 词频统计
tableWord <- table(segWords)
write.csv(tableWord,'nid.csv') #导出

构建词云

# 词云
wordcloud2(tableWord, size = 2, fontFamily = "微软雅黑",  
color = "random-light", backgroundColor = "white")  

导出的图如下(这个部分还要再研究,比如自定义图片、网页显示、图片大小):

img
很好,除了知道zyc最爱的表情是二哈之外(居然用了38次,丧心病狂),并没有什么收获……

写在最后

坚持一下。


参考文献

  1. R|数据处理|list的转化与转置
    https://zhuanlan.zhihu.com/p/27792447

  2. Dataframe hates you!
    http://biostat.mc.vanderbilt.edu/wiki/pub/Main/ColeBeck/datestimes.pdf

  3. StackOverflow|Plotting two variables on the same graph
    https://stackoverflow.com/questions/3777174/plotting-two-variables-as-lines-using-ggplot2-on-the-same-graph

  4. ggplot2-ggtheme样例表
    https://blog.csdn.net/qq_27755195/article/details/52105087

  5. ggplot2又添新神器——ggthemr助你制作惊艳美图
    https://zhuanlan.zhihu.com/p/26880524

  6. 可能是目前最好的词云解决方案wordcloud2
    https://cosx.org/2016/08/wordcloud2

  7. wordcloud2 r语言词云终极解决方案
    http://yalei.name/2016/06/wordcloud2