从获取数据到数据分析--智慧校园

185 阅读6分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

前言

数据分析是指对数据进行清晰、系统的分析,以便于提取有价值的信息并进行决策。这一过程可以帮助人们了解数据背后的趋势和模式,并且可以提供有用的反馈来改进业务流程、产品设计或者其他决策。

数据分析通常包括收集、清理、探索和可视化数据,并使用统计方法和机器学习技术来分析数据。这些技术可以帮助人们预测未来的趋势,并且可以通过可视化工具来展示结果。

数据分析可以用于各种领域,包括商业、科学、工程和社会科学。数据分析师通常需要具备良好的数学和统计学知识,并且还需要掌握相关的软件工具和编程语言。

获取数据

获取数据的方式多种多样,其中爬虫是一种技术含量相对较高的方式。本次项目以分析智慧校园为主题,所以目标是爬取关键词为“智慧校园”和“数字校园”的微博内容。

爬虫基本步骤

爬虫(也称为网络爬虫、Web爬虫、蜘蛛)是一种自动地抓取网页内容的程序。爬虫通常被用来收集大量数据、监测网站变化或者执行其他自动化任务。

爬虫的基本步骤如下:

  1. 输入爬取的网站地址(URL)。
  2. 发送HTTP请求获取网页内容。
  3. 使用解析器(如Beautiful Soup或lxml)对网页内容进行解析,提取有用的数据。
  4. 将数据存储到本地或者数据库中。
  5. 对下一个要爬取的网站地址进行处理,并回到第一步继续爬取。

爬虫还可能需要使用代理服务器、使用Cookies或者进行反爬虫设置来避免被网站封禁。

分析爬取的网站

微博手机端网站m.weibo.cn/
f12浏览器网页开发者工具查看服务器响应返回的数据结构

Snipaste_2022-12-19_15-57-54.jpg 可以看到数据保存格式为data->cards>编号->mblog

Snipaste_2022-12-19_15-58-22.jpg 有用的信息(转发数、评论数、点赞数、内容)都保存在mblog,爬取时解析到mblog即可获取到数据。

编写代码

第一步设置请求头

#请求头
headers = {
    "User-Agent": "", #可以从请求头中获取,也可以实现随机用户代理
    "accept": "application/json, text/plain, */*",
    "accept-encoding": "gzip, deflate, br",
}

Snipaste_2022-12-19_16-08-57.jpg 第二步设置请求url和请求参数

# 请求地址
url = 'https://m.weibo.cn/api/container/getIndex'
# 请求参数
params = {
    "containerid": "100103type=1&q={}".format(search_keyword),
    "page_type": "searchall",
    "page": page
}

第三步发送请求

# 发送请求
r = requests.get(url, headers=headers, params=params)

第四步进行解析

cards = r.json()["data"]["cards"]
# 微博内容
text_list = jsonpath(cards, '$..mblog.text'
# 微博创建时间
time_list = jsonpath(cards, '$..mblog.created_at')
# 微博作者
author_list = jsonpath(cards, '$..mblog.user.screen_name')
# 微博id
id_list = jsonpath(cards, '$..mblog.id')
# 微博bid
bid_list = jsonpath(cards, '$..mblog.bid')
# 转发数
reposts_count_list = jsonpath(cards, '$..mblog.reposts_count')
# 评论数
comments_count_list = jsonpath(cards, '$..mblog.comments_count')
# 点赞数
attitudes_count_list = jsonpath(cards, '$..mblog.attitudes_count')

JSONPath是一种用于在JSON文档中指定路径的语法。它可用于从JSON文档中选择和提取数据,类似于XPath用于从XML文档中选择和提取数据。

  1. 根对象使用$来表示,而无需区分是对象还是数组。

  2. 表达式可以使用.,也可以使用[]。如: $.store.book[0].title 或 $['store']['book'][0]['title']

  3. 表达式(<expr>)可用作显式名称或索引的替代,如:

    $.store.book[(@.length-1)].title 表示获取最后一个 book 的 title。

  4. 使用符号@表示当前对象。过滤器表达式通过语法支持,?(<boolean expr>)如:

    $.store.book[?(@.price < 10)].title 表示获取价格小于 10 的所有 book 的 title。

详细使用方法可以参考www.apifox.cn/help/refere… 最终爬取的数据如下图所示:

image.png

数据分析

文本分词

在所有人类语言中,一句话、一段文本、一篇文章都是由一个个的词组成的。词是包含独立意义的最小文本单元,将长文本拆分成单个独立的词汇的过程叫做分词。分词之后,文本原本的语义将被拆分到在更加精细化的各个独立词汇中,词汇的结构比长文本简单,对于计算机而言,更容易理解和分析,所以,分词往往是自然语言处理的第一步。在对文本进行分析前,首先要对文本进行分词,我们采用了jieba分词。jieba分词支持三种模式:精确模式,试图将句子最精确地切开,适合文本分析;全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。通过结果分析,我们选择使用精确模式,如下图所示。

image.png

可视化展示

由网络爬虫等工具爬取到的原始微博文本,通常都会带有我们不需要的信息, 所以需要对文本进行预处理。我们使用 Python 作为我们的预处理工具,其中的用到的库有 Numpy、Pandas 和 jieba,使用正则表达式去掉标点符号,然后使用 jieba 分词切分,最后读取停用词文件,去除停用词,计算词频。获得总计有1819个词,词频前十的词有:

校园1285
智慧778
数字578
教育435
学校429
建设344
信息化151
中小学131
发展120

利用wordcloud库画出词云图,通过词云图可以更为直观的观察比较重要的关键词,如下图所示。

image.png

可视化出现最多的15个词汇,如下图所示。

image.png

关键影响词

具体操作如下:首先,利用 Python 进行词频统计并降序输出,选取其中前 200 个高频主题词,进一步筛选得到有效的高频主题词 74 个。然后,选取 44个用户及所发布的微博正文,对每条微博进行加权计算:转发量0.5+评论量0.3+点赞量 *0.2=权重w,高频主题词出现时则累加,以此类推,如下图所示。

image.png

Snipaste_2022-12-19_16-37-37.jpg
从这些关键词中可以看出,当前智慧校园的建设以校园为主要阵地,利用5G技术、互联网信息技术、云平台技术等打造教学、科研、管理和校园生活为一体的新型智慧化的工作、学习和生活环境,如下图所示。未来,随着新的技术的不断提出和现有技术的发展完善,我相信在不久的将来智慧校园会颠覆传统的认知,让知识以新的方式传递给学生。