|
|
51CTO旗下网站
|
|
移动端

用数据分析网络暴力有多可怕

故事源于潘长江在某个综艺节目上没认出蔡徐坤,然后潘长江老师的微博评论区就炸锅了。最后搞得两边都多多少少受到网络暴力的影响。直至今日,这条微博的评论区还在更新着。不得不说微博的黑粉,强行带节奏,真的很可怕。

作者:小F来源:法纳斯特|2019-04-01 13:51

这应该是一篇拖得蛮久的文章。

用数据分析网络暴力有多可怕

故事源于潘长江在某个综艺节目上没认出蔡徐坤,然后潘长江老师的微博评论区就炸锅了。

***搞得两边都多多少少受到网络暴力的影响。

直至今日,这条微博的评论区还在更新着。

不得不说微博的黑粉,强行带节奏,真的很可怕。

还有比如自己一直关注的英雄联盟。

上周王校长也是被带了一波节奏,源于姿态退役后又复出的一条微博。

用数据分析网络暴力有多可怕

本来是一句很普通的调侃回复,「离辣个传奇adc的回归,还远吗?[二哈]」。

然后就有人开始带王校长的节奏,直接把王校长给惹毛了。

上面这些事情,对于我这个吃瓜群众,也没什么好说的。

只是希望以后能没有那么多无聊的人去带节奏,强行给他人带来压力。

本次通过获取潘长江老师那条微博的评论用户信息,来分析一波。

一共是获取了3天的评论,共14万条。

一、前期工作

微博评论信息获取就不细说,之前也讲过了。

这里提一下用户信息获取,同样从移动端下手。

用数据分析网络暴力有多可怕

主要是获取用户的昵称、性别、地区、微博数、关注数、粉丝数。

另外本次的数据存储采用MySQL数据库。

创建数据库。

  1. import pymysql 
  2.  
  3. db = pymysql.connect(host='127.0.0.1'user='root'password='774110919', port=3306) 
  4. cursor = db.cursor() 
  5. cursor.execute("CREATE DATABASE weibo DEFAULT CHARACTER SET utf8mb4"
  6. db.close() 

创建表格以及设置字段信息。

  1. import pymysql 
  2.  
  3. db = pymysql.connect(host='127.0.0.1'user='root'password='774110919', port=3306, db='weibo'
  4. cursor = db.cursor() 
  5. sql = 'CREATE TABLE IF NOT EXISTS comments (user_id VARCHAR(255) NOT NULL, user_message VARCHAR(255) NOT NULL, weibo_message VARCHAR(255) NOT NULL, comment VARCHAR(255) NOT NULL, praise VARCHAR(255) NOT NULL, date VARCHAR(255) NOT NULL, PRIMARY KEY (comment, date))' 
  6. cursor.execute(sql) 
  7. db.close() 

二、数据获取

具体代码如下。

  1. from copyheaders import headers_raw_to_dict 
  2. from bs4 import BeautifulSoup 
  3. import requests 
  4. import pymysql 
  5. import re 
  6.  
  7. headers = b""
  8. accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 
  9. accept-encoding:gzip, deflate, br 
  10. accept-language:zh-CN,zh;q=0.9 
  11. cache-control:max-age=0 
  12. cookie:你的参数 
  13. upgrade-insecure-requests:1 
  14. user-agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 
  15. ""
  16.  
  17. # 将请求头字符串转化为字典 
  18. headers = headers_raw_to_dict(headers) 
  19.  
  20.  
  21. def to_mysql(data): 
  22.     ""
  23.     信息写入mysql 
  24.     ""
  25.     table = 'comments' 
  26.     keys = ', '.join(data.keys()) 
  27.     values = ', '.join(['%s'] * len(data)) 
  28.     db = pymysql.connect(host='localhost'user='root'password='774110919', port=3306, db='weibo'
  29.     cursor = db.cursor() 
  30.     sql = 'INSERT INTO {table}({keys}) VALUES ({values})'.format(table=table, keys=keys, values=values
  31.     try: 
  32.         if cursor.execute(sql, tuple(data.values())): 
  33.             print("Successful"
  34.             db.commit() 
  35.     except
  36.         print('Failed'
  37.         db.rollback() 
  38.     db.close() 
  39.  
  40.  
  41. def get_user(user_id): 
  42.     ""
  43.     获取用户信息 
  44.     ""
  45.     try: 
  46.         url_user = 'https://weibo.cn' + str(user_id) 
  47.         response_user = requests.get(url=url_user, headers=headers) 
  48.         soup_user = BeautifulSoup(response_user.text, 'html.parser'
  49.         # 用户信息 
  50.         re_1 = soup_user.find_all(class_='ut'
  51.         user_message = re_1[0].find(class_='ctt').get_text() 
  52.         # 微博信息 
  53.         re_2 = soup_user.find_all(class_='tip2'
  54.         weibo_message = re_2[0].get_text() 
  55.         return (user_message, weibo_message) 
  56.     except
  57.         return ('未知''未知'
  58.  
  59.  
  60. def get_message(): 
  61.     # ***页有热门评论,拿取信息较麻烦,这里偷个懒~ 
  62.     for i in range(2, 20000): 
  63.         data = {} 
  64.         print('第------------' + str(i) + '------------页'
  65.         # 请求网址 
  66.         url = 'https://weibo.cn/comment/Hl2O21Xw1?uid=1732460543&rl=0&page=' + str(i) 
  67.         response = requests.get(url=url, headers=headers) 
  68.         html = response.text 
  69.         soup = BeautifulSoup(html, 'html.parser'
  70.         # 评论信息 
  71.         comments = soup.find_all(class_='ctt'
  72.         # 点赞数 
  73.         praises = soup.find_all(class_='cc'
  74.         # 评论时间 
  75.         date = soup.find_all(class_='ct'
  76.         # 获取用户名 
  77.         name = re.findall('id="C_.*?href="/.*?">(.*?)</a>', html) 
  78.         # 获取用户ID 
  79.         user_ids = re.findall('id="C_.*?href="(.*?)">(.*?)</a>', html) 
  80.  
  81.         for j in range(len(name)): 
  82.             # 用户ID 
  83.             user_id = user_ids[j][0] 
  84.             (user_message, weibo_message) = get_user(user_id) 
  85.             data['user_id'] = " ".join(user_id.split()) 
  86.             data['user_message'] = " ".join(user_message.split()) 
  87.             data['weibo_message'] = " ".join(weibo_message.split()) 
  88.             data['comment'] = " ".join(comments[j].get_text().split()) 
  89.             data['praise'] = " ".join(praises[j * 2].get_text().split()) 
  90.             data['date'] = " ".join(date[j].get_text().split()) 
  91.             print(data) 
  92.             # 写入数据库中 
  93.             to_mysql(data) 
  94.  
  95.  
  96. if __name__ == '__main__'
  97.     get_message() 

***成功获取评论信息。

用数据分析网络暴力有多可怕

3天14万条评论,着实可怕。

有时我不禁在想,到底是谁天天会那么无聊去刷评论。

职业黑粉,职业水军吗?好像还真的有。

三、数据清洗

清洗代码如下。

  1. import pandas as pd 
  2. import pymysql 
  3.  
  4. # 设置列名与数据对齐 
  5. pd.set_option('display.unicode.ambiguous_as_wide'True
  6. pd.set_option('display.unicode.east_asian_width'True
  7. # 显示10列 
  8. pd.set_option('display.max_columns', 10) 
  9. # 显示10行 
  10. pd.set_option('display.max_rows', 10) 
  11. # 设置显示宽度为500,这样就不会在IDE中换行了 
  12. pd.set_option('display.width', 2000) 
  13.  
  14. # 读取数据 
  15. conn = pymysql.connect(host='localhost'user='root'password='774110919', port=3306, db='weibo', charset='utf8mb4'
  16. cursor = conn.cursor() 
  17. sql = "select * from comments" 
  18. db = pd.read_sql(sql, conn) 
  19.  
  20. # 清洗数据 
  21. df = db['user_message'].str.split(' ', expand=True
  22. # 用户名 
  23. df['name'] = df[0] 
  24. # 性别及地区 
  25. df1 = df[1].str.split('/', expand=True
  26. df['gender'] = df1[0] 
  27. df['province'] = df1[1] 
  28. # 用户ID 
  29. df['id'] = db['user_id'
  30. # 评论信息 
  31. df['comment'] = db['comment'
  32. # 点赞数 
  33. df['praise'] = db['praise'].str.extract('(\d+)').astype("int"
  34. # 微博数,关注数,粉丝数 
  35. df2 = db['weibo_message'].str.split(' ', expand=True
  36. df2 = df2[df2[0] != '未知'
  37. df['tweeting'] = df2[0].str.extract('(\d+)').astype("int"
  38. df['follows'] = df2[1].str.extract('(\d+)').astype("int"
  39. df['followers'] = df2[2].str.extract('(\d+)').astype("int"
  40. # 评论时间 
  41. df['time'] = db['date'].str.split(':', expand=True)[0] 
  42. df['time'] = pd.Series([i+'时' for i in df['time']]) 
  43. df['day'] = df['time'].str.split(' ', expand=True)[0] 
  44. # 去除无用信息 
  45. df = df.ix[:, 3:] 
  46. df = df[df['name'] != '未知'
  47. df = df[df['time'].str.contains("日")] 
  48. # 随机输出10行数据 
  49. print(df.sample(10)) 

输出数据。

用数据分析网络暴力有多可怕

随机输出十条,就大致能看出评论区是什么画风了。

四、数据可视化

01 评论用户性别情况

用数据分析网络暴力有多可怕

用数据分析网络暴力有多可怕

通过用户ID对数据去重后,剩下约10万+用户。

***张图为所有用户的性别情况,其中男性3万+,女性7万+。

这确实也符合蔡徐坤的粉丝群体。

第二张图是因为之前看到「Alfred数据室」对于蔡徐坤粉丝群体的分析。

提到了很多蔡徐坤的粉丝喜欢用带有「坤、蔡、葵、kun」的昵称。

所以将昵称包含这些字的用户提取出来。

果不其然,女性1.2万+,男性900+,更加符合了蔡徐坤的粉丝群体。

可视化代码如下。

  1. from pyecharts import Pie, Map, Line 
  2.  
  3.  
  4. def create_gender(df): 
  5.     # 全部用户 
  6.     # df = df.drop_duplicates('id'
  7.     # 包含关键字用户 
  8.     df = df[df['name'].str.contains("坤|蔡|葵|kun")].drop_duplicates('id'
  9.     # 分组汇总 
  10.     gender_message = df.groupby(['gender']) 
  11.     gender_com = gender_message['gender'].agg(['count']) 
  12.     gender_com.reset_index(inplace=True
  13.  
  14.     # 生成饼图 
  15.     attr = gender_com['gender'
  16.     v1 = gender_com['count'
  17.     # pie = Pie("微博评论用户的性别情况", title_pos='center', title_top=0) 
  18.     # pie.add("", attr, v1, radius=[40, 75], label_text_color=None, is_label_show=True, legend_orient="vertical", legend_pos="left", legend_top="%10"
  19.     # pie.render("微博评论用户的性别情况.html"
  20.     pie = Pie("微博评论用户的性别情况(昵称包含关键字)", title_pos='center', title_top=0) 
  21.     pie.add("", attr, v1, radius=[40, 75], label_text_color=None, is_label_show=True, legend_orient="vertical", legend_pos="left", legend_top="%10"
  22.     pie.render("微博评论用户的性别情况(昵称包含关键字).html"

02 评论用户区域分布

用数据分析网络暴力有多可怕

广东以8000+的评论用户居于首位,随后则是北京、山东,江苏,浙江,四川。

这里也与之前网易云音乐评论用户的分布有点相似。

更加能说明这几个地方的网民不少。

可视化代码如下。

  1. def create_map(df): 
  2.     # 全部用户 
  3.     df = df.drop_duplicates('id'
  4.     # 分组汇总 
  5.     loc_message = df.groupby(['province']) 
  6.     loc_com = loc_message['province'].agg(['count']) 
  7.     loc_com.reset_index(inplace=True
  8.  
  9.     # 绘制地图 
  10.     value = [i for i in loc_com['count']] 
  11.     attr = [i for i in loc_com['province']] 
  12.     map = Map("微博评论用户的地区分布图", title_pos='center', title_top=0) 
  13.     map.add("", attr, value, maptype="china", is_visualmap=True, visual_text_color="#000", is_map_symbol_show=False, visual_range=[0, 7000]) 
  14.     map.render('微博评论用户的地区分布图.html'

03 评论用户关注数分布

用数据分析网络暴力有多可怕

整体上符合常态,不过我也很好奇那些关注上千的用户,是什么样的一个存在。

可视化代码如下。

  1. def create_follows(df): 
  2.     ""
  3.     生成评论用户关注数情况 
  4.     ""
  5.     df = df.drop_duplicates('id'
  6.     follows = df['follows'
  7.     bins = [0, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000] 
  8.     level = ['0-10''10-20''20-50''50-100''100-200''200-500''500-1000''1000-2000''2000-5000''5000-10000''10000以上'
  9.     len_stage = pd.cut(follows, bins=bins, labels=level).value_counts().sort_index() 
  10.     # 生成柱状图 
  11.     attr = len_stage.index 
  12.     v1 = len_stage.values 
  13.     bar = Bar("评论用户关注数分布情况", title_pos='center', title_top='18', width=800, height=400) 
  14.     bar.add("", attr, v1, is_stack=True, is_label_show=True, xaxis_interval=0, xaxis_rotate=30) 
  15.     bar.render("评论用户关注数分布情况.html"

04 评论用户粉丝数分布

用数据分析网络暴力有多可怕

这里发现粉丝数为「0-10」的用户不少,估摸着应该是水军在作怪了。

粉丝数为「50-100」的用户最多。

可视化代码如下。

  1. def create_follows(df): 
  2.     ""
  3.     生成评论用户关注数情况 
  4.     ""
  5.     df = df.drop_duplicates('id'
  6.     follows = df['follows'
  7.     bins = [0, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000] 
  8.     level = ['0-10''10-20''20-50''50-100''100-200''200-500''500-1000''1000-2000''2000-5000''5000-10000''10000以上'
  9.     len_stage = pd.cut(follows, bins=bins, labels=level).value_counts().sort_index() 
  10.     # 生成柱状图 
  11.     attr = len_stage.index 
  12.     v1 = len_stage.values 
  13.     bar = Bar("评论用户关注数分布情况", title_pos='center', title_top='18', width=800, height=400) 
  14.     bar.add("", attr, v1, is_stack=True, is_label_show=True, xaxis_interval=0, xaxis_rotate=30) 
  15.     bar.render("评论用户关注数分布情况.html"

05 评论时间分布

用数据分析网络暴力有多可怕

潘老师是在17时发出微博的,但是那时并没有大量的评论出现,那个小时一共有1237条评论。

直到蔡徐坤在18时评论后,微博的评论一下就上去了,24752条。

而且目前一半的评论都是在蔡徐坤的回复底下评论,点赞数多的也大多都在其中。

不得不说蔡徐坤的粉丝力量真大,可怕可怕~

可视化代码如下。

  1. def creat_date(df): 
  2.     # 分组汇总 
  3.     date_message = df.groupby(['time']) 
  4.     date_com = date_message['time'].agg(['count']) 
  5.     date_com.reset_index(inplace=True
  6.  
  7.     # 绘制走势图 
  8.     attr = date_com['time'
  9.     v1 = date_com['count'
  10.     line = Line("微博评论的时间分布", title_pos='center', title_top='18', width=800, height=400) 
  11.     line.add("", attr, v1, is_smooth=True, is_fill=True, area_color="#000", xaxis_interval=24, is_xaxislabel_align=True, xaxis_min="dataMin", area_opacity=0.3, mark_point=["max"], mark_point_symbol="pin", mark_point_symbolsize=55) 
  12.     line.render("微博评论的时间分布.html"

06 评论词云

用数据分析网络暴力有多可怕

大体上言论还算好,没有很偏激。

可视化代码如下。

  1. from wordcloud import WordCloud, ImageColorGenerator 
  2. import matplotlib.pyplot as plt 
  3. import jieba 
  4.  
  5.  
  6. def create_wordcloud(df): 
  7.     ""
  8.     生成评论词云 
  9.     ""
  10.     words = pd.read_csv('chineseStopWords.txt', encoding='gbk', sep='\t', names=['stopword']) 
  11.     # 分词 
  12.     text = '' 
  13.     for line in df['comment']: 
  14.         line = line.split(':')[-1] 
  15.         text += ' '.join(jieba.cut(str(line), cut_all=False)) 
  16.     # 停用词 
  17.     stopwords = set(''
  18.     stopwords.update(words['stopword']) 
  19.     backgroud_Image = plt.imread('article.jpg'
  20.     wc = WordCloud( 
  21.         background_color='white'
  22.         mask=backgroud_Image, 
  23.         font_path='C:\Windows\Fonts\华康俪金黑W8.TTF'
  24.         max_words=2000, 
  25.         max_font_size=150, 
  26.         min_font_size=15, 
  27.         prefer_horizontal=1, 
  28.         random_state=50, 
  29.         stopwords=stopwords 
  30.     ) 
  31.     wc.generate_from_text(text) 
  32.     img_colors = ImageColorGenerator(backgroud_Image) 
  33.     wc.recolor(color_func=img_colors) 
  34.     # 高词频词语 
  35.     process_word = WordCloud.process_text(wc, text) 
  36.     sort = sorted(process_word.items(), key=lambda e: e[1], reverse=True
  37.     print(sort[:50]) 
  38.     plt.imshow(wc) 
  39.     plt.axis('off'
  40.     wc.to_file("微博评论词云.jpg"
  41.     print('生成词云成功!'

五、总结

***,照例来扒一扒哪位用户评论最多。

用数据分析网络暴力有多可怕

这位男性用户,一共评论了90条,居于首位。

评论画风有点迷,是来搅局的吗?

用数据分析网络暴力有多可怕

这位女性用户,一共评论了80条。

大部分内容都是围绕黑粉去说的。

用数据分析网络暴力有多可怕

这位女性用户,一共评论了71条。

疯狂与评论区互动...

用数据分析网络暴力有多可怕

这位男性用户,一共评论了68条。

也在与评论区互动,不过大多数评论情感倾向都是偏消极的。

观察了评论数最多的10名用户,发现其中男性用户的评论都是偏负面的,女性评论都是正面的。

好了,作为一名吃瓜群众,我是看看就好,也就不发表什么言论了。

【编辑推荐】

  1. 如何写好数据分析师简历?
  2. 2025年大数据分析发展的预测
  3. 数据分析向云迁移时如何避免混乱
  4. 大数据分析师的日常,听起来高大上,其实干的活四个字脏乱差累
  5. 2019年IT关注的重点:大数据分析的存储架构
【责任编辑:未丽燕 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+更多

16招轻松掌握PPT技巧

16招轻松掌握PPT技巧

GET职场加薪技能
共16章 | 晒书包

289人订阅学习

20个局域网建设改造案例

20个局域网建设改造案例

网络搭建技巧
共20章 | 捷哥CCIE

645人订阅学习

WOT2019全球人工智能技术峰会

WOT2019全球人工智能技术峰会

通用技术、应用领域、企业赋能三大章节,13大技术专场,60+国内外一线人工智能精英大咖站台,分享人工智能的平台工具、算法模型、语音视觉等技术主题,助力人工智能落地。
共50章 | WOT峰会

0人订阅学习

读 书 +更多

敏捷Acegi、CAS:构建安全的Java系统

本书是关于Acegi、CAS的权威教程,是Java/Java EE安全性开发者的必备参考书。无论是Java EE安全性编程模型的背景和基础知识,还是Acegi、CA...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO播客