从创造营开始,就入了豪门,一直想考古电竞男主脸--任豪的微博,这几天空闲来翻了翻从2015年10月24日他开通微博到2020年4月6日的582条原创微博,发现入豪不亏!~
首先要爬取数据,一般web都有反爬虫机制,而且反爬虫策略一直在更新,冒着被封号的危险,踩了无数的坑,看了周鸟大佬(感谢微博id:@爱编程的周鸟)的视频后,有了以下思路:
微博目前有3个版本,分别是手机端(https://m.weibo.cn/)、移动端(https://weibo.cn/)和网页端(https://weibo.com/),因为网页端很难操作,一般选择移动端或者手机端。本文选用移动端,界面越“丑”但越好用。
根据周鸟大佬的视频,大家可以轻松得到喜欢的博主的所有微博(包括原创、转发、图片、视频等),根据自己的需要设置起始时段,当一切配置好后,下次直接更改博主id和cookie(有时候会过期失效)即可。
下面贴出视频链接:
[https://m.weibo.cn/u/3184193244?uid=3184193244&luicode=10000011&lfid=100103type%3D1%26q%3D%E5%91%A8%E9%B8%9F](https://m.weibo.cn/u/3184193244?uid=3184193244&luicode=10000011&lfid=100103type%3D1%26q%3D%E5%91%A8%E9%B8%9F]
在此贴出几个注意点:
①如果本身安装了Python,这个mini版本就不需要安装了,而且要注意不同版本的冲突,如果要卸载最好先在cmd里面看自己需要什么版本再用uninstall.exe卸载
②如果因为空间限制,Python安装在d盘或者其他盘,就要体现设置好环境变量,并且在cmd里面要转换路径(cd /d d:/具体路径)
③如果怕大号被封,最好用小号的cookie
④如果which Python无结果,可以输where is Python试试
部分数据截图如下:
对提取到的微博数据,采用jieba分词模块对微博正文进行处理,首先将微博中的数字、字母、特殊符号等使用正则表达式去掉,然后使用jieba分词模块对微博正文进行分词。
首先画一个词云图,看看豪大爷最喜欢用哪些词,具体代码如下所示:
import requests
import json
import re
import csv
from time import sleep
from PIL import Image
from wordcloud import WordCloud, ImageColorGenerator #词云库
import matplotlib.pyplot as plt #数学绘图库
import numpy as np
import jieba #分词库
import matplotlib.font_manager as fm #需要对中文进行处理
from os import path #用来获取文档的路径
#读入txt文本数据
ywj=open(r'f:\\Anaconda\\weiboSpider-master\\weibo\\rh\\ywj.txt',"r").read().split('\n')
background_image = np.array(Image.open(r'f:\\Anaconda\\weiboSpider-master\\weibo\\rh\\yt.jpg'))
Rs1=[] #建立存储分词的列表
for i in range(len(ywj)):
result=[]
seg_list = jieba.cut(ywj[i])
for w in seg_list :#读取每一行分词
result.append(w)
Rs1.append(result)#将该行分词写入列表形式的总分词列表
#写入CSV,此时仅分词
file1=open('f:\\Anaconda\\weiboSpider-master\\weibo\\rh\\fc.csv','w')
writer = csv.writer(file1)#定义写入格式
writer.writerows(Rs1)#按行写入
file1.close()
得到分词后的结果:
#打开停用词表
ywj_stop={}.fromkeys([line.rstrip() for line in open(r'f:\\Anaconda\\weiboSpider-master\\weibo\\rh\\stopwords.txt',"r")])
#原txt文件
ywj=open(r'f:\\Anaconda\\weiboSpider-master\\weibo\\rh\\ywj.txt',"r").read().split('\n')
Rs2=[] #建立存储分词的列表
for i in range(len(ywj)-1):
result=[]
seg_list = jieba.cut(ywj[i])
for w in seg_list :#读取每一行分词
if w not in ywj_stop and w != ' ':
result.append(w)
Rs2.append(result)#将该行分词写入列表形式的总分词列表
#写入CSV,此时是删除停用词之后的结果
file2=open('f:\\Anaconda\\weiboSpider-master\\weibo\\rh\\stop_cutword.csv','w')
writer = csv.writer(file2)#定义写入格式
writer.writerows(Rs2)#按行写入
file2.close()
得到删除停用词后的结果:
使用的背景图如下:
#此时将stop_cutword.csv转换为txt文件
stop_cutword=open(r'f:\\Anaconda\\weiboSpider-master\\weibo\\rh\\stop_cutword.txt',"r").read().split('\n')
# Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。
stop_cutword_text = "/".join(stop_cutword)
wc = WordCloud(
scale=4,
font_path="f:\\Anaconda\\Lib\\site-packages\\wordcloud\\Fonts\\MSYH.TTF",
background_color="white",
max_words=200,
max_font_size=60,
random_state=42,
mask=background_image).generate(stop_cutword_text)
#为图片设置字体
my_font=fm.FontProperties(fname='f:\\Anaconda\\Lib\\site-packages\\wordcloud\\Fonts\\MSYH.TTF')
#产生背景图片,基于彩色图像的颜色生成器
image_colors = ImageColorGenerator(background_image)
#开始画图
plt.imshow(wc.recolor(color_func=image_colors))
plt.imshow(wc)
#为云图去掉坐标轴
plt.axis('off')
#画云图,显示
plt.show
#保存云图
wc.to_file(r"f:\\Anaconda\\weiboSpider-master\\weibo\\rh\\hz.png")
得到词云图:
从词云图可以看出我们豪总是一个认真努力积极向上的当代好青年_
“希望、努力、美好、梦想”,是你啊,是始终的追光者。
生活有望穿秋水的等待也会有意想不到的惊喜。
无需畏惧黑暗,但你要成为光。
“RISE、ZERO、POI”,是矢志不渝的坚持啊
你收集了世间星光,带着温柔和真诚来遇见我们。
谢谢你经历过的一切造就了现在的任豪,接下来请一路走花路吧
“现在、准备、马上、今晚、明天”是忙碌的豪总啊
一直在路上,因为无尽的热情和喜爱持续输出。
希望你能永远明朗坦荡钟情豁达,有得有失有坚持,能笑能哭能尽欢。
”第一次、成团、作品、录制、创造、拍照、MV、舞台“是处处有惊喜的人生啊
星星醉酒到处跑,月亮跌进深海里,我以前从未觉得人间美好,直到你来了。
你的种种第一次,带给我们的是处处惊喜。
”北京、上海、妈妈、回家“是牵挂家人的任菲特啊
就像你说的,”我出生在一个与生俱来就铭刻着我的成都
我把我轻狂的热血留在了杭州
我走着人生最大转折点选择在上海
而我将最美好的时光寄托给了你们“
希望POI.任豪可以走出国门看世界,果仁们一路相伴!
”哈哈哈、纠结、开心、幸福“是充满小确辛的生活啊
有钱会炒股、杀鱼做饭熟练、照顾别人情绪、话不多但精辟,一枚细心boy!
笑容就像冬日的暖阳,治愈人心,愿你的笑容常在!
”一起、谢谢、粉丝、宝宝、十二、谢谢你们”是始终对粉丝温柔回应的人好啊
看完b站的录播,不知道那天晚上被wjjw批成什么样,和粉丝之间的真心话
与粉丝双向的爱,易于常人成熟的心智
被队员都形容“稳、老大哥、豪总"的他,始终向众人展示他的好与温柔
好吧,自己敲完的字感触颇多,感觉自己很幸运,喜欢上一个内心柔软的男孩!
再看看豪总一般什么时候比较活跃哈
时间在excel中是字符形式的,需要把其转换为datetime格式,然后忽略分钟对小时进行概率统计,具体代码如下:
# 对豪总发微博的时间进行统计
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import seaborn as sns
from datetime import datetime
import pylab as pl
# 设置背景
sns.set_style('darkgrid')
# 设置字体,防止中文乱码
zhfont1 =fm.FontProperties(fname='F:\\Worktools\Fonts\MSYH.TTF')
# 此时要将日期去掉
works=pd.read_excel('f:\\Anaconda\\weiboSpider-master\\weibo\\rh\\time.xls')
works['时间']=works['时间']
Time=[]
for i in range(0,len(works)):
Time.append(datetime.strptime(works['时间'][i].strftime("%H:%M:%S"), '%H:%M:%S'))
emmm=[]
for i in range(0,len(Time)):
emmm.append(Time[i].hour)
print(emmm)
plo=sns.distplot(emmm,label = '豪总发微博的时间',bins = np.arange(25),kde=False,color='#ff8000')
# 添加横纵坐标
plt.xlabel('time')
plt.ylabel('numbers')
# 设置x轴刻度
plo.set_xticks(np.arange(0,24,1))
# tight:坐标轴数据显示更明细
plt.axis('tight')
# x轴标签旋转角度
pl.xticks(rotation=30)
pl.xticks(rotation=30)
# 显示图例
plt.legend(prop=zhfont1)
# 添加数据标签
# z, y+0.05表示在每一柱子对应x值、y值上方0.05处标注
# '%.0f'中0表示不显示小数后面的数值,1就表示显示小数后面一位,以此类推
# ha='center', va= 'bottom'代表horizontalalignment(水平对齐)、verticalalignment(垂直对齐)
for p in plo.containers[0].patches:
height = p.get_height()
x, y = p.get_x() + p.get_width()/2 - 0.3, 1.02 * height
plt.text(x, y+0.5, '{:,.0f}'.format(height),va= 'bottom')
# 添加折线图,此时先得到每小时段的频数,不采用核密度是此时只想要一个纵坐标
# def list_count(num_list):
# return {x: num_list.count(x) for x in set(num_list)}
# y=list_count(emmm)
# y=np.asarray(y.values())
# 因为数据类型转换的问题,直接复制y-NUM
# 绘制折线图
# 0-23的自然数列
x = np.arange(24)
NUM=[30, 6, 4, 2, 3, 5, 5, 5, 10, 16, 19, 34, 31, 43, 32, 46, 28, 42, 45, 47, 36, 32, 39, 22]
plt.plot(x, NUM, color="green", linestyle="--", linewidth=1)
# 图表输出到本地
# 注意:在plt.show()后调用了 plt.savefig(),实际上已经创建了一个新的空白的图片(坐标轴),再plt.savefig()就会保存这个新生成的空白图片。
plt.savefig('f:\\Anaconda\\weiboSpider-master\\weibo\\rh\\time.png')
# 显示图形
plt.show()
再直观看一下更漂亮的图吧!
NUM=np.array(NUM)
sortIndex = np.argsort(-NUM) # 倒序,返回排序后各数据的原始下标
x_sort = x[sortIndex] # 重新进行排序,与y保持初始顺序一致
y_sort = NUM[sortIndex] # 重新进行排序,倒序
# 添加横纵坐标
plt.xlabel('time')
plt.ylabel('numbers')
# 设置字体,防止中文乱码
zhfont1 =fm.FontProperties(fname='F:\\Worktools\Fonts\MSYH.TTF')
#定义函数来显示柱状上的数值
def autolabel(rects):
for rect in rects:
height = rect.get_height()
plt.text(rect.get_x()+rect.get_width()/2.-0.25, 1.01*height, '%s' % int(height))
plt.xticks(np.arange(len(x_sort)), x_sort)
a = plt.bar(np.arange(len(x_sort)),y_sort,color=['r','g','b', 'c', 'm', 'y'],label = '豪总发微博的时间')
# 显示图例
plt.legend(prop=zhfont1)
autolabel(a)
plt.savefig('f:\\Anaconda\\weiboSpider-master\\weibo\\rh\\time1.png')
# 显示图形
plt.show()
由图可知,豪总一般在下午15点或者晚上18、19点的时候十分活跃,但是在23点之后甚至00点之后也依然活跃,而且在凌晨1点到5点之间也是有数次在线,也要注意休息啊
下面再来看看点赞数、评论数和转发数,以下观点摘自知乎@蕴涵:
点赞数反应了综合好感度。主要是路人的好感度。对于知名的一线小花小生,点赞数几十万甚至破百万都不是太难的事。光看数字参考度不强。但可以对比一下。比如都是一张自拍,说中秋快乐,一位点赞数五十万,一位三十五万,结果就不言而喻了。评论数比较能反应粉丝活跃度。一般会回复的,不是纯粉,就是黑粉,回复数的多少,通常是粉丝战斗力的直观体现。同样用中秋自拍举例。一位点赞数五十万,回复数五万。一位点赞数三十五万,回复数九万。可见前者路人缘好,后者流量强。转发数是粉丝加路人粉的体现。简单说,你想知道这位明星到底有多红,看他的转发量就可以了,评论数是纯粉,点赞是路人纯粉和路人粉。那么转发数就基本上是这个明星目前的粉丝活跃度了。再拿中秋自拍举例。一人转发数二十四万,点赞五十万,评论五万。一人转发数十五万,点赞三十五万,评论九万。虽然在你印象里后者可能比较红,但实际上,是后者可能不如前者。(转自https://www.zhihu.com/question/41556587/answer/277402351)
因此,我用了气泡图来反映三者之间的关系,因为豪总的数据基本都是万级的,我对数据做了一点点处理:
#绘制气泡图看点赞数、评论数和转发数的关系
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from matplotlib.font_manager import FontProperties
#一键防止中文乱码
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
data = pd.read_csv('f:\\Anaconda\\weiboSpider-master\\weibo\\rh\\tendency.csv')
data.head()
#一共有582个数据,产生582种随机颜色
colors1 = np.random.rand(582)
plt.scatter(x = data.like/10000,
y = data.comment/10000,
s = data.repost/100,
c = colors1, label = '转发数', alpha = 0.6
)
# 添加横纵坐标
plt.xlabel('点赞数*10000')
plt.ylabel('评论数*10000')
# 添加标题
plt.title('点赞数、评论数和转发数的气泡图')
# 添加图例
plt.legend()
#设置画布大小
plt.figure(figsize=(40,25))
# 显示图形
plt.show()
通过气泡图也是可以看出当点赞数和评论数越多时,转发数所代表的圆圈也相应的比较大。
再看看这几年豪总的点赞数和评论数和转发数的具体趋势吧
#通过时间序列分析三者趋势
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from matplotlib.font_manager import FontProperties
from datetime import datetime
#一键防止中文乱码
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_csv('f:\\Anaconda\\weiboSpider-master\\weibo\\rh\\tendency.csv', encoding='utf-8', index_col='date')
df.index = pd.to_datetime(df.index) # 将字符串索引转换成时间索引
ts = df # 生成pd.Series对象
# 查看数据格式
ts.head()
ax = ts.plot(
x_compat=True,
grid=True)
# 显示背景的网格线
ax.set_title("pv-gmv")
ax.grid(linestyle="--", alpha=0.3)
plt.show()
再看看成团前后的差别吧,我是从2019年2月开始截取的数据
#截取近一年的数据看看具体趋势
ts_subset1 = ts[:'2019-02-01']
ax1 = ts_subset1.plot(
x_compat=True,
grid=True)
#df[['A']]用于提取某一类
ax1.set_title("趋势图")
ax1.grid(linestyle="--", alpha=0.3)
plt.show()
可以明显看出,从2019年4月创造营开营到2019年6月8日成团出道,因为梦想而坚持,他值得!
最后我按照评论数排序,统计了前11条微博。
1.#元气爱豆的日常# 今天合唱300总决赛 大家一起加油 #元气爱豆的日常# 为了不露出衣服造型 我只能先这样哈哈哈哈哈 相信你们能给我们一个震撼的力量 期待哦#爱
(https://weibo.com/5732739112/I5Z43qCwQ?type=comment#_rnd1586784335026)
2.#元气爱豆的日常# 第一次有了坐飞机离不开的玩具 它睡着好舒服啊 #爱豆V力量# 哈哈哈哈哈哈 安全落地 大家放心咯 [带着微博去旅行]✈️
(https://weibo.com/5732739112/I67TWyAPJ?type=comment#_rnd1586784076207)
3.前往下一站北京的路上 一路下来见到很多不同群体的人 也有曾经一直没能去尝试的事情 大多美好的回忆 仿佛是你在停下脚步用心感受霎那间 #爱豆V力量# #元气爱豆的日常#
(https://weibo.com/5732739112/I5Z43qCwQ?type=comment#_rnd1586784335026)
4.讲真的#元气爱豆的日常# 自拍真的是门学问
(https://weibo.com/5732739112/I5Z43qCwQ?type=comment#_rnd1586784335026)
5.看我的月饼 #爱豆V力量# #元气爱豆的日常# 今天要次月饼哦 腊肉月饼我的最爱 哈哈哈
(https://weibo.com/5732739112/I5Z43qCwQ?type=comment#_rnd1586784335026)
6.#爱豆V力量##爱豆V力量# 暗中观察 @R1SE-赵让 @R1SE-刘也
(https://weibo.com/5732739112/I5IZNe2sH?type=comment#_rnd1586784566928)
7.成团满月的一天 小伙子们你们都很不错哦 @R1SE-何洛洛 @R1SE-赵让 @R1SE-张颜齐 @R1SE-周震南 @R1SE-姚琛 @R1SE-刘也 @R1SE-赵磊 @R1SE-夏之光 @R1SE-焉栩嘉
(https://weibo.com/5732739112/I5IZNe2sH?type=comment#_rnd1586784566928)
8.#VogueMe酷枇杷舞#@VogueMe 那就一起呗 R1SE-任豪的微博视频
(https://weibo.com/5732739112/I3rlWF81N?type=comment)
9.R1SE成员第一次的集体飞行✈️
(https://weibo.com/5732739112/I3rlWF81N?type=comment)
10.胡老师生日快乐 🎉 🎂🎂 @胡彦斌 R1SE-任豪的微博视频
(https://weibo.com/5732739112/HBVFwct0J?type=comment)
11.#元气爱豆的日常# #爱豆V力量# 他拍和自拍 我就觉得我自拍的还行... 哼你们觉得哪个好嘛
(https://weibo.com/5732739112/HBVFwct0J?type=comment)
哈哈,从豪总评论数最多的微博来看,都是有视频有自拍的,所以以后要多自拍哦,尽管蜜汁角度_