爬了掘金的 1W 多条数据,发现前端三年写的文章内容大同小异

图,依序为 2017 年、2018年、2019年

2017年 wordcloud



从上面三张图能够看到,掘金前端类目下的文章基本都在讲 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 格式的掘金图片,做罢。

最终获得的词云图片长这样

结论

对比三年的文章标题,发现你们写来写去,关键词都是几个前端库、性能、源码、实战等等,这几块应该是前端的核心吧~不过这几个词涵盖的范围也很大,或许你们都在写这里面的细节。

相关文章
相关标签/搜索