从上面三张图能够看到,掘金前端类目下的文章基本都在讲 React、Vue、JS、源码、CSS、实践、异步、性能、原理等等老生常谈的知识点。值得注意的是 Flutter 在 2019 年的掘金文章中开始占有一席之地,有兴趣写点新东西的胖友或许能够考虑开始写 Flutter(可是不知道有没有人看)。前端
简单讲分三步:python
掘金彷佛没有作反爬的措施,对于爬虫小白来说太友好了。前端类目下的数据通通放在了:「timeline-merger-ms.juejin.im/v1/get_entr… 。使用 Request 库发起请求就行:mysql
r = requests.get(url, params = payload, headers = header)
复制代码
爬到的数据能够直接保存到 mysql,方便后续处理。 python 与数据库的交互可使用 pymysql 这个库:sql
conn = pymysql.connect(host=host, user=user, passwd=passwd, db=db,
port=3306, charset='utf8mb4')
self.cursor = self.conn.cursor()
复制代码
charset 要设置为 'utf8mb4',由于有些标题会带 emoij 字符等特殊的符号,设置成 utf8 这些符号写不进数据库,会出错。数据库
数据处理部分我用了 R 来作,由于 Python 用的不熟。 第一步固然是要从 Mysql 里将数据读取出来。用 RMySQL:异步
library(RMySQL)
jjDb <- dbConnect(MySQL(), user = user, host = host, password = password, db = db)
dbSendQuery(jjDb,'SET NAMES utf8')
df <- dbGetQuery(jjDb,'SELECT * FROM juejintimeline')
dbDisconnect(jjDb)
复制代码
「juejintimeline」是保存的数据表的名字。性能
这里有两个坑,第一个是连接数据库的时候,个人 Mac 安装的是 MySQL 8.0,用的 Strong Password Encryption,须要在系统偏好设置 -> MySQL -> initialize Database -> Use Legacy Password Encryption 中改为 Legacy Password Encryption。url
这一步会把 MySQL 实例中的数据库清空,因此若是 MySQL 实例中有重要数据库,搜一搜别的办法吧(也请留言告诉我😢)spa
另外一个坑是直接在 MySQL 中 「SET NAMES utf8」读取的中文不显示,要在与数据库创建连接以后dbSendQuery(jjDb,'SET NAMES utf8')
才正常。code
读取的数据不免有重复,上 dplyr 包:
library(dplyr)
df <- df %>% group_by(objectId) %>% filter(row_number() == 1) %>% ungroup()
复制代码
经过把 objectId 同样的数据过滤掉,去重。
由于掘金返回的数据时间格式是 Datetime:「2019-03-23T00:33:26.392Z」,想按年对数据进行划分须要把 year 提取出来。R 中的 lubridate 专门用来处理时间:
library('lubridate')
df$createdAt <- ymd_hms(df$createdAt)
df$year <- year(df$createdAt)
复制代码
以2019年数据为例,在数据处理部分已经给数据增长了一个维度:year。要提取 2019 年的数据就很是简单了:
df2019 <- df %>% filter(year == 2019)
复制代码
文章的 title 保存在了 df2019$title 中,是一个 series,使用 paste() 将 series 聚合为 Vector:
title2018<-paste(df2018$title,sep = ',',collapse = ',')
复制代码
而后开始分词并计算词频:
wk <- worker(stop_word = 'stopword_chinese.txt')
word2019 <-freq(wk<=title2019) %>% arrange(desc(freq))
复制代码
stop_word 是中止词,在 stop_word 所对应的文件中出现的词不会被统计。(一共有 1000 多个常见中文中止词,有须要留言)。
作词云用的是 wordcloud2,若是前面的处理都正确,那么一行代码就能够搞定:
library('wordcloud2')
wordcloud2(word2019, size = 1,shape = "star")
复制代码
word2019 是用 jiebaR 分词以后获得的词组|词频数据,shape 是出图的形状,形状能够用 png 图片自定义,可是我找不到 png 格式的掘金图片,做罢。
最终获得的词云图片长这样
对比三年的文章标题,发现你们写来写去,关键词都是几个前端库、性能、源码、实战等等,这几块应该是前端的核心吧~不过这几个词涵盖的范围也很大,或许你们都在写这里面的细节。