一、數據預處理與入庫
獲取到了原始數據之後,下一步就是清洗入庫。
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
對沸點內容關鍵詞製作詞雲等。
可能的話,後臺專門跑個服務對沸點數據進行定時抓取和更新,並製作數據大屏進行展示。