文章目录

  • 一.整体思路
  • 二.效果展示
    • 1. 数据库
    • 2. 赌博聊天室聊天内容分析-饼图
    • 3. 赌博聊天室发言数量分析-条形图
    • 4. 赌博用户聊天内容分析-词云图
  • 三.源代码
    • 1. 爬虫
    • 2. 数据可视化
  • 四.总结

闲来无事在网上冲浪,右下角蹦出来一个赌博网站,无聊点进去,发现有个聊天室功能,于是抓取了此网站的所有聊天记录,对其进行分词、情感分析,最终以Echarts图的方式可视化展示出来。


一.整体思路

二.效果展示

1. 数据库

数据库包括用户id、用户名、是否系统、发言事件、聊天内容。

一共爬取了2W5千条聊天记录。

2. 赌博聊天室聊天内容分析-饼图


此饼图是我对聊天记录进行情感分析得出,其中,消极:积极约等于7:3

3. 赌博聊天室发言数量分析-条形图


此条形图为发言次数top10条形图,运68大哥您是真能说啊。

4. 赌博用户聊天内容分析-词云图

此图根据聊天内容进行分词、去停用词处理得出,其中尴尬出现了1322次,真是大写的尴尬。

三.源代码

1. 爬虫

import time
import requests
import json
import pymysqlclass DuBo_Chat_Spider(object):def __init__(self):self.conn=pymysql.connect(host='127.0.0.1',port=3306,user='root',password='root',db='Du_Bo_chat',charset='utf8')self.cursor=self.conn.cursor()sql = '''create table if not exists chat(user_id varchar (100),user_name varchar(255),is_system varchar(50),time varchar (255),content varchar (255)) '''self.cursor.execute(sql)self.conn.commit()def get_content(self,page_no):chat_room_url = ########################headers={'Accept': 'application/json, text/plain, */*','Connection': 'keep-alive','Content-Type': 'application/json;charset=UTF-8','Host': ########################,'Cookie': ########################,'Origin': ########################,'Referer': ########################,'token':'','sec-ch-ua': '" Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36'}playload_data={'Action': "GetMsg",'isChat': 1,'pageNo':page_no,'pageSize': 20}r=requests.post(chat_room_url,headers=headers,data=json.dumps(playload_data))if r.status_code==200:_json=json.loads(r.text)return  _jsonelse:return Nonedef parse(self,json_data):item={}chat_rows=json_data.get('data').get('rows')for row in chat_rows:item['user_id']=row.get('id')item['user']=row.get('spoker')item['is_system']=row.get('system')pub_time=int(row.get('stamp')/1000)timeArray = time.localtime(pub_time)otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)item['time']=otherStyleTimeitem['content']=row.get('content')print(item)sql="""INSERT INTO chat values(%s,%s,%s,%s,%s)"""try:self.cursor.execute(sql,(item['user_id'],item['user'],item['is_system'],item['time'],item['content']))#self.cursor.close()self.conn.commit()except pymysql.err.DataError:passif __name__ == '__main__':p_n=1spider=DuBo_Chat_Spider()while True:_json=spider.get_content(p_n)if _json is not None:spider.parse(_json)p_n += 1print(p_n)else:break

2. 数据可视化

#-*-coding:utf-8-*-
import re
import pymysql
from snownlp import SnowNLP
from collections import Counter
from pyecharts.charts import Pie
from pyecharts.charts import Bar
from pyecharts import options as opts
from pyecharts.charts import WordClouddef get_data_from_mysql():"""从数据库获取数据:return:"""try:conn=pymysql.connect(host='127.0.0.1',port=3306,user='root',password='root',db='du_bo_chat',charset='utf8')cursor=conn.cursor()sql="select * from chat"cursor.execute(sql)data=cursor.fetchall()return dataexcept pymysql.Error:print("数据库操作出现错误!")finally:cursor.close()conn.close()#____________________
def score_sentence(line):"""使用snownlp.sentiments对句子感情进行评分:param line::return:"""try:#预测结果为positive的概率,positive的概率大于等于0.6,我认为可以判断为积极情感,小于0.6的判断为消极情感。所以以下将概率大于等于0.6的评论标签赋为1,小于0.6的评论标签赋为-1,方便后面与实际标签进行比较。s=SnowNLP(line)score=s.sentimentsreturn scoreexcept TypeError:return Nonedef get_emotion(score):"""根据评分生成积极(1),消极(-1)两类评分:param score::return:"""if score is None:return Noneif score>0.6:#积极return 1elif score<0.6 and score>0:#消极return -1def get_pie_data(data):pos_count=0negv_count=0for line in data:pingjia=line[4]emotion_score=get_emotion(score_sentence(pingjia))#print(emotion_score)if emotion_score==1:pos_count+=1elif emotion_score==-1:negv_count+=1item={"积极":pos_count,"消极":negv_count}return item# print(item)# data={'积极': 6836, '消极': 18126}def draw_pie(data):"""根据数据绘制饼图:param data::return:"""c = (Pie().add("赌博聊天室聊天内容分析", [(k,v) for k,v in data.items() ],color = "green",rosetype = "radius").set_colors(["lightblue", "orange", "yellow", "blue", "pink", "orange", "purple"]).set_global_opts(title_opts=opts.TitleOpts(title="赌博聊天室聊天内容分析-饼图"),legend_opts=opts.LegendOpts(orient="vertical", #图例垂直放置pos_top="15%",# 图例位置调整pos_left="2%"),).set_series_opts(label_opts=opts.LabelOpts(formatter="{b} : {c} ({d}%)")).render("赌博聊天室聊天内容分析-饼图.html"))#____________________
def get_line_data(data):item={}for data_ in data:user_name=data_[1]#有些用户名字里面带有*,需要过滤一下if "*"in user_name:user_name=user_name.replace("*",'')if user_name in item.keys():item[user_name]+=1else:item[user_name]=1sorted_item=sorted(item.items(),key=lambda x:x[1],reverse=True)top_10_user_list=[]for index,user in enumerate(sorted_item):if index<10:top_10_user_list.append(user)else:breakreturn top_10_user_listdef draw_line(data):bar = (Bar().add_xaxis([data[0] for data in data]).add_yaxis("发言数量",[data[1] for data in data]).set_global_opts(title_opts=opts.TitleOpts(title="赌博聊天室发言数量分析-条形图.html"),datazoom_opts=opts.DataZoomOpts(),))bar.render("赌博聊天室发言数量分析-条形图.html")#____________________
def get_wordCloud_data(data):word_list=[]stop_words=[word.strip() for word in open('stopwords.txt','r',encoding='utf-8').readlines()]for data_ in data:sentence=data_[4]try:cut_results=SnowNLP(sentence).wordsfor word in cut_results:if re.match(r'[\u4e00-\u9fa5]+',word):if word not in stop_words :if len(word)>1:word_list.append(word)#sorted_item=sorted(item.items(),key=lambda x:x[1],reverse=True)except TypeError:passitem = Counter(word_list)return dict(item)def draw_wordColud(data):c = (WordCloud().add("",[(k,v) for k,v in data.items()],word_size_range=[20, 100],# 这里自定义了字体类型。textstyle_opts=opts.TextStyleOpts(font_family="cursive"),).set_global_opts(title_opts=opts.TitleOpts(title="赌博用户聊天内容分析-词云图")).render("赌博用户聊天室内容分析-词云图.html"))if __name__ == '__main__':data=get_data_from_mysql()print("开始top10条形图绘制!")user_data=get_line_data(data)draw_line(user_data)print("top10条形图绘制完成!")print("开始饼图绘制!")pie_data=get_pie_data(data)draw_pie(pie_data)print("饼图绘制完成!")print("开始词云绘制!")wordCloud_data=get_wordCloud_data(data)draw_wordColud(wordCloud_data)print("词云绘制完成!")

四.总结

网赌跟吸毒没啥区别,沾上网赌的人,赢了还想赢,赢一万还想着十万八万,输了还想翻本,输一万继续往里充,直到你玩上头那一刻,你已经被后台盯上了,怎么下注都是输,大家不要赌博哦。


本次使用Python撰写爬虫,SnowNLP进行中文分词、情感分析,最后使用Pyecharts制作Echarts图,将数据可视化展示出来。停用词表我放在了蓝奏云,思路、代码方面有什么不足欢迎各位大佬指正、批评!觉得还可以的能点个赞嘛。

python3--数据可视化-爬取赌博聊天室2万5千条聊天记录分析之后发现...相关推荐

  1. python3爬虫之访问量、点击率数据的爬取分析

    python3爬虫之访问量.点击率数据的爬取分析 1.明确问题: 通过开发者工具分析我们可以看出,这个点击率并不是'静态数据',而是一个脚本返回,那么这个数据到底藏在哪里呢? 经验告诉我,不是Doc ...

  2. python爬取网页json数据_python爬取json数据库

    手把手教你使用Python抓取QQ音乐数据(第一弹) [一.项目目标] 获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名.专辑名.播放链接. 由浅入深,层层递进,非常适合刚入门的同学练手. [二. ...

  3. 大数据Python爬取B站电影排行榜——爬取信息

    大数据Python爬取B站电影排行榜-信息爬取 前言 一.配置环境 二.爬取B站电影排行榜top100 1.找到B站电影排行榜top100网页 2.用URL进行爬取信息 三.建立Excel表并导出 总 ...

  4. python3网络爬虫--爬取b站用户投稿视频信息(附源码)

    文章目录 一.准备工作 1.工具 二.思路 1.整体思路 2.爬虫思路 三.分析网页 1.分析数据加载方式 2.分词接口url 3.分析用户名(mid) 四.撰写爬虫 五.得到数据 六.总结 上次写了 ...

  5. python爬取公交车站数据_Python爬虫实例_城市公交网络站点数据的爬取方法

    爬取的站点:http://beijing.8684.cn/ (1)环境配置,直接上代码: # -*- coding: utf-8 -*- import requests ##导入requests fr ...

  6. 如何爬一个网站的数据-免费爬取网站的任意数据软件

    如何爬一个网站的数据?爬取网络数据大家称之为网络爬行 收集页面以创建索引或集合.另一方面,网络抓取下载页面以提取一组特定的数据用于分析目的,例如,产品详细信息.定价信息.SEO 数据或任何其他数据集. ...

  7. 【爬虫】学习:App数据的爬取

    python3网络爬虫开发实战第二版--12 App数据的爬取 Charles 配置环境 教程 1 基础设置:抓包工具Charles:(二)Charles的代理设置(windows,app)_闫振兴的 ...

  8. python3 爬虫数据处理 爬取华为应用市场 APP应用评论(二)根据评论生成词云——小猿搜题

    python3 爬虫&数据处理 爬取华为应用市场 APP应用评论(二)根据评论生成词云--小猿搜题 # 导入扩展库 import re # 正则表达式库 import collections ...

  9. python3 爬虫数据处理 爬取华为应用市场 APP应用评论(二)根据评论生成词云——学霸君

    python3 爬虫&数据处理 爬取华为应用市场 APP应用评论(二)根据评论生成词云--学霸君 # 导入扩展库 import re # 正则表达式库 import collections # ...

最新文章

  1. 计算机领域经典巨著TAOCP卷3上市!【含赠书】
  2. linux 普通用户touch权限不够_一篇文章让你轻松了解 Linux 的权限
  3. flash动画制作成品_Flash制作点燃蛋糕蜡烛的互动动画
  4. 可以弹的钢琴,很不错(转)
  5. 中心频率和一些概念解释
  6. mysql卸载完环境变量还有_MySql完全卸载
  7. java嵌入groovy脚本,java-如何捕获传递给Groovy脚本的参数?
  8. 迷雾世界无限号服务器,迷雾世界部分服务器互通公告_迷雾世界部分服务器3月31日数据互通详情分析_手心游戏...
  9. docker集群管理工具_太多选择:如何选择正确的工具来管理Docker集群
  10. zabbix3.0 监控mysql服务器性能实现过程
  11. 推荐中文分词:腾讯文智
  12. Redis数据类型及其命令
  13. 通过注册表修改键盘映射
  14. java实现线性填充空值_为什么我的Java字符串用空值填充?
  15. 使用微信企业号发送工资条教程
  16. nginx学习-负载均衡-keepalived高可用-反向代理
  17. JavaScript 实现web随机数排序、整除、重置
  18. wordpress博客搭建-保姆教程
  19. 陶瓷充电电池行业研究及十四五规划分析报告
  20. android算法实现房贷计算器

热门文章

  1. ae合成设置快捷键_AE模板 三秒速成的抖音加关注动画模板
  2. 高鹏清华计算机系,丁高鹏:强身健体为祖国健康工作五十年-清华大学新闻网...
  3. eclipse全文搜索多个关键字
  4. python 解决 0-1 二维背包问题
  5. Filmage Converter for mac - 全能的音视频转换器「m1兼容」
  6. CSS------定位和动画
  7. VB.NET + QQ文件助手实现远程控制
  8. zuk如将手机更新到Android10,ZUI新升级:ZUK宣布支持全机型升级Android N系统
  9. 高中数学基础01:集合与函数
  10. 导出CSV后,时间字段无法自动识别-0xEF,0xBB,0xBF