练习一个从数据采集分析到展示的过程

Posted 一加六

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了练习一个从数据采集分析到展示的过程相关的知识,希望对你有一定的参考价值。

很早之前写的一个舆论监测的小东西,虽然最终没有用到。
首页数据总览

热度排行榜TOP10

趋势观察


词云展示

lda话题分析

简单分为三部分:数据采集、数据分析、数据展示
信息来源都是面向公众的媒体平台,像微博、贴吧、知乎、微信这些,主要搜集关于某个主题文本信息。
爬下来的信息做了些初步的统计信息,和一些简单分析如上图。

剖析项目结构

第一部分 数据采集(即爬虫)

用python写的爬虫
爬虫结构

用到的库

各平台的反扒很多文章都有方法介绍,我是各个击破,综合到一起来着。
download模块
通用下载模块,对网页内容下载
parser模块
请求到的信息格式微博、知乎是json格式,只需json.loads下来取某个key的values即可,微信、贴吧等是html网页源码格式,我使用的是BeautifulSoup库,soup.find_all()很顺手,使用lxml库的etree的xpath语法虽更简单,但是有时因为一个元素去改整个得到list很是麻烦
dataoutput
数据储存,我用的是mysql

#数据统一格式
mdata = 
		 'plantform': 'weibo', 
		 'mtimestamp': create_time, 
		 'hotnum': hotnum, 
         'url': url, 
         'title': content,
         'comments': comments, 
         'username': username
         

如上保存信息格式储存nosql数据库中更为方便
spidermain
调度模块,将前面三个模块综合起来
代码量:爬虫部分大概900行代码

本地调试完成,就可上传Linux服务器,设置定时任务,每天抓取,做为数据分析的基础

第二部分 数据处理分析

原始数据如上图
数据标记 (id)是拼接两个字段的值(plantform+title),大概率保证了信息的唯一性,同时也对同一title的信息内容更新比较友好。
储存内容 字段时需要对一些特殊字符过滤处理,一方面防止引起编码错误,和sql语句错误,例如 “#” 会当成注释
储存时间 均使用时间戳储存,取出时再转换成日期格式,
数据查重和更新 id使库里的数据具有唯一性,储存数据时遍历比较id即可,若id已存在,则进行更新,更新改变的数据如事件热度、url、comments等易改变的字段

update_sql = "UPDATE TABLENAME SET " \\
                         "feeling='feeling'," \\
                         "hotnum='v0'," \\
                         "URL='v1'," \\
                         "COMMENTS='v2' " \\
                         "WHERE " \\
                         "myid='v3'" \\
                        .format(TABLENAME=self.__tablename,
                                feeling=feeling,
                                v0=item['hotnum'],
                                v1=item['url'],
                                v2=comments,
                                v3=item_str)

数据统计 根据字段内容分组统计,例如我的plantform字段下有weibo、weixin、tieba、zhihu等几个内容,按此查询group by plantform,几个平台的数据总览就出来了。
根据时间统计 统计每天的数据,以此观察信息发布的趋势,情绪态度的变化趋势。还写了一个py脚本,将mysql里每天的信息做统计建新表,提高查询信息效率。如下新建表字段:

词频统计 将title、comment字段下的内容查询先使用分词工具jieba分词、去停用词等预处理,统计即可,导入用户自定义词典分词更准确一些。
情感分析 一是使用snownlp,但是结果很难让人满意。
二是使用情感词典(玻森情感词典),如下,会有11万词的评分,使用使就是遍历该词典,结果得分一般是加和计算。

我对比后选择了后者。
话题聚类 将信息进行主题聚类,发现讨论的话题,
这里我使用的是lda主题模型,目标是找到每一篇文档的主题分布和每一个主题中词的分布,根据每个主题词的分布,我们加以概括这个主题,该主题下的文章内容我称之为一个讨论话题。
再处理文本之前先进行文本预处理,切词、去停用词,标记文档,参数调整,再训练模型即可,过程原理大家感兴趣可以找相关文档看。

代码量 统计分析部分大概500行代码

第三部分 数据展示

web页面来展示内容
图表更能直观的反映数据变化趋势,善用图表会有奇迹般效果。

首页我放置的是一个饼图,pycharts实现,查询情绪指数,将情绪指数在某个阈值内划分范围,分出积极、中性和消极三个等级,右侧放置各平台抓取的信息总数。每个图表连接新的页面展示该平台的详细数据。
趋势图是select新表中的数据,填充到pycharts实例中,将时间戳转换为日期格式倒序排列,生成时间变化趋势图。
词云部分将title、comments文本信息查询,做词频统计,然后再将词-词频数据填充到pycharts词云实例。
使用flask做web页面展示、pycharts作图,现学现用,不难。
代码量 该部分不算前端代码只有100行。
总体代码量 1600行代码,哈哈哈!

每一部分的东西都是之前几个学期学的东西,零零散散组了起来。

以上是关于练习一个从数据采集分析到展示的过程的主要内容,如果未能解决你的问题,请参考以下文章

搜索中词权重计算及实践

上海高考大数据分析,复旦大学热度最高,最喜欢的专业航空航天!

2018年各大深度学习框架热度分析,TensorFlow占据榜首

顺丰 基于 Hook 机制实现数据血缘系统

顺丰 基于 Hook 机制实现数据血缘系统

数据分析(微博热搜榜单热度排名)