关于网页爬虫:掘金15W沸点简单分析二

34次阅读

共计 2973 个字符,预计需要花费 8 分钟才能阅读完成。

一、数据预处理与入库

获取到了原始数据之后,下一步就是荡涤入库。

1.1 数据模型

因为是简略剖析,所以只获取 话题 用户 音讯 三块内容。具体如下:

class Pins(object):
    """沸点"""
    msg_id = None            # 沸点 ID
    topic_id = None            # 话题 ID
    topic_title = None        # 话题名称
    user_id = None            # 用户 ID
    user_name = None        # 用户名
    msg_content = None        # 沸点内容
    msg_ctime = None        # 沸点创立工夫
    msg_digg_count = 0      # 沸点点赞数
    msg_comment_count = 0   # 沸点评论数

    def __repr__(self):
        return '<Pins: %s>' % self.msg_id

1.2 数据库表创立

数据库的话,应用 MySQL。因为沸点内容 msg_content 中含有 emoji 表情,所以在建表时字符集编码须要应用utf8mb4

建表 SQL 语句如下:

CREATE SCHEMA `juejin` DEFAULT CHARACTER SET utf8mb4 ;

CREATE TABLE `juejin`.`pins` (`msg_id` VARCHAR(20) NOT NULL COMMENT '音讯 ID',
  `topic_id` VARCHAR(20) NOT NULL COMMENT '主题 ID',
  `topic_title` VARCHAR(16) NOT NULL COMMENT '主题名称',
  `user_id` VARCHAR(20) NOT NULL COMMENT '用户 ID',
  `user_name` VARCHAR(32) NOT NULL COMMENT '用户昵称',
  `msg_content` TEXT CHARACTER SET 'utf8mb4' NOT NULL COMMENT '音讯内容',
  `msg_ctime` VARCHAR(16) NOT NULL COMMENT '音讯创立工夫戳',
  `msg_digg_count` INT(11) NOT NULL COMMENT '音讯点赞数',
  `msg_comment_count` INT(11) NOT NULL COMMENT '音讯评论数',
  `msg_createdate` DATETIME NOT NULL DEFAULT now() COMMENT '音讯创立工夫(同 msg_ctime 工夫戳)',
  PRIMARY KEY (`msg_id`));

1.3 原始数据的读取及入库

接上文,咱们曾经将所有沸点数据保留至 json_data 文件夹下。只须要将该文件下所有的 json 文件遍历读取进去,在做简略的解决,而后存入数据库即可。

示例代码如下:

def read_all_data():
    """
    遍历读取所有 json 数据,而后入库
    :return:
    """
    pins_list = []
    for dirpath, dirnames, filenames in os.walk('./json_data'):
        filenames = sorted(filenames, key=lambda _: _[5: 9])
        for filename in filenames:
            filename = os.path.join('./json_data', filename)
            print(filename)
            with open(filename, 'r') as pins_file:
                items_data = json.loads(''.join(pins_file.readlines()))['data']
                for item in items_data:
                    pins = Pins().parse_from_item(item)
                    pins_list.append(pins)
                    insert_db([pins])
    return pins_list

最终,数据库表如下图所示。

二、Superset 简介

官网是这样形容的:A modern, enterprise-ready business intelligence web application.

先说下公司我的项目应用过程中的感触。咱们次要是将配置好的图表以 IFrame 的模式嵌入到其余页面中,独自做图表的话是比拟费时费力的。

  • ①首先遇到的就是权限问题,过后为了赶进度间接对 Public 设置全副可读权限,但这有数据安全的隐患。
  • ②Superset 能够很不便的生成 IFrame,然而不好的中央就是每次批改完图表后都须要更新 IFrame 代码。
  • ③因为做的比拟通用,所以失落了很多个性,或者说很多性能是不太好实现的,比方数据下钻等。
  • ④图表展现是基于 D3.js,感觉格调有些不合乎国内的偏好,好在开源,能够扩大如echarts 等图表。

整体来说,配置和应用还是比拟不便的。毕竟是收费的,不要要求太高。

2.1 装置

依据官网文档,咱们应用 OS dependencies 的形式装置和应用 Superset。

依据文档一步步走即可,virtualenv的应用可参考官网文档。

间接应用 pip 装置 Superset 即可,pip install apache-superset。以后最新版本为0.37.0

最初,咱们将官网示例加载如零碎,superset load_examples。而后启动开发服务器即可,`superset run -p 8088 –with-threads –reload –debugger
`。

实践上,咱们关上 http://127.0.0.1:8088/superset/dashboard/births/,即可看到如下图所示:

2.2 官网文档

官网文档肯定要看,http://superset.apache.org/

三、基于 Superset 构建图表

在制作图表前,咱们须要先制订几个指标,也就是想要从数据中获取什么主题。

咱们就以上面 6 个主题来制作图表吧。

  • 每日沸点数柱形图
  • 沸点总数随工夫的变动曲线图
  • 沸点话题占比饼图 TOP10
  • 沸点发表数最多的用户 TOP25
  • 评论数最多的沸点 TOP25
  • 点赞数最多的沸点 TOP25

3.0 图表制作筹备工作

Superset 图表的制作能够由数据库表间接生成。这里咱们抉择更通用的一种形式,由 SQL Lab -> SQL Editor 通过 SQL 来间接获取指标数据。

3.0.1 新增数据库链接

格局为SLQAlchemy URI,应用过 Python 的同学对这款 ORM 必定不会生疏。感兴趣的能够理解一下,官网文档:https://www.sqlalchemy.org/。

首次配置时,会抛出 Could not load database driver: mysql 异样。执行 pip install mysqlclient 装置 mysql 驱动即可。

3.1 图表制作示例

3.1.1 每日沸点数柱形图

3.1.2 沸点总数随工夫的变动曲线图

3.1.3 沸点话题占比饼图 TOP10

该数据统计时,将没有话题的沸点进行了排除。

3.1.4 发表数最多的用户 TOP25

3.1.5 评论数最多的沸点 TOP25

3.1.6 点赞数最多的沸点 TOP25

不过这前两条沸点有刷赞的嫌疑。

3.2 应用已创立的图表制作 Dashboard

四、后记

后续思考对数据进行多维度、深层次的剖析。如应用 jieba 分词+wordcloud 对沸点内容关键词制作词云等。

可能的话,后盾专门跑个服务对沸点数据进行定时抓取和更新,并制作数据大屏进行展现。


震惊????!全副话题 竟有 1 / 4 在摸鱼

源码已上传至 GitHub, Gitee。

正文完
 0