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

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

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

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

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

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

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

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

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

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

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

本来是一句很普通的调侃回复,「离辣个传奇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名用户,发现其中男性用户的评论都是偏负面的,女性评论都是正面的。

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

责任编辑:未丽燕 来源: 法纳斯特
相关推荐

2023-04-17 07:34:17

电商平台ChatGPT表格

2020-05-15 15:09:51

R语言数据分析

2017-08-03 15:20:19

大数据数据分析

2020-07-16 11:49:49

流量焦虑移动互联网

2019-01-15 08:50:41

泄露人脸数据

2017-05-02 17:22:05

数据

2016-05-03 14:46:54

数据源数据分析数据融合

2016-05-04 16:20:55

多源数据大数据

2015-08-19 13:50:19

数据分析

2024-03-10 21:00:33

2023-04-06 11:54:55

2020-09-08 12:48:19

数据分析图表互联网

2021-01-27 09:18:50

大数据数据收集大数据分析

2019-08-05 15:07:04

2015-08-25 10:32:07

健康大数据

2020-05-15 15:51:04

SAS数据分析

2021-01-26 11:57:46

数据挖掘数据分析大数据

2013-01-21 10:55:52

大数据Ayasdi拓扑数据

2012-08-08 09:53:23

HadoopMapReduce

2017-07-06 15:44:33

点赞
收藏

51CTO技术栈公众号