爬了掘金的 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 格式的掘金圖片,做罷。

最終獲得的詞雲圖片長這樣

結論

對比三年的文章標題,發現你們寫來寫去,關鍵詞都是幾個前端庫、性能、源碼、實戰等等,這幾塊應該是前端的核心吧~不過這幾個詞涵蓋的範圍也很大,或許你們都在寫這裏面的細節。

相關文章
相關標籤/搜索