【數據分析】6 點發的文章在博客園閱讀量最高?


最近 "個人惡趣味" 持續泛濫。

博客的訪問量、粉絲數一直是滿足樓主個人虛榮心的好東西(原諒樓主也是凡人愛慕 "虛榮"),有時候我就在想,同一篇隨筆,不同時間段發表是不是能獲得不同的閱讀量,換句話說,博文質量相同的情況下,哪個時間段的閱讀量可能會多一些呢,於是決定讓數據說話。(我會告訴你其實是想學習 node 嘛)

PS:爬取博客園並不想對博客園的服務器造成任何影響(事實也證明博客園的服務器是很剛的),只是為了學習之用,還望博客園的大大們海涵。

整體架構#

整體思路非常簡單,采集發表在博客園首頁的文章的 發表時間 以及 閱讀量,進行分析。

博客園首頁每頁 20 篇隨筆,采集 150 頁,從 p51 到 p200,相應的 url 為 http://www.cnblogs.com/#p51http://www.cnblogs.com/#p200,取每篇隨筆的發表時間(小時)以及閱讀量,最后求得該時段每篇隨筆的閱讀量平均值。

考慮到我和馬雲平均一下也是億萬富翁,得剔除一些有影響的數據。怎么說?比方有篇文章發表於 5 點,閱讀量為 10k,並不是因為發表於 5 點導致閱讀量很高,而是因為這篇文章確實有質量,如果它是 10 點發表,它的閱讀量還是一樣高,如果將這條數據算做有效數據,那么發表於 5 點的文章的平均閱讀量一下子會被拉高,和 5 點這個時段並沒有直接關系。根據經驗,我把這個閾值定為閱讀量 2000,也就是剔除了閱讀量 2000+ 的數據。這也正是前面說的,"博文質量相同" 為前提,當然這個 "相同" 不可能是絕對的,只能相對來說。

后端#

后端方面,我希望能給前端提供一個接口,返回一個數組,該數組擁有 20*150 個對象,每個對象代表一條文章數據,它有兩個 key 值,一個 key 為 postTime,表示發表時間(小時),另一個 key 為 viewTimes,表示閱讀量。

比如上面這條數據,表示文章發表於 9 點(多),閱讀量為 885。

這里我用 node 去爬博客園。

之前也用 node 並發爬過網頁(詳見 Nodejs - 如何用 eventproxy 模塊控制並發),但是我不確定並發 150 個請求是不是會被博客園 "拒絕",好在我多慮了。

但是博客園的爬取和之前的爬蟲還是有點區別,開始我以為爬取 http://www.cnblogs.com/#p51http://www.cnblogs.com/#p200 即可,后來發現不對勁,它們的爬出來的頁面 HTML 源代碼都是一樣的,都是博客園首頁,才恍然大悟到博客園的翻頁是 ajax 請求的(不知道 phantomjs 能不能得到類似的請求之后的頁面源碼),好在 SuperAgent 模塊不僅能 get,還能 post。我們把這條請求抓出來看看:

用 SuperAgent 偽造 post 請求:

superagent  
  .post('http://www.cnblogs.com/mvc/AggSite/PostList.aspx')
  .send({"CategoryType":"SiteHome","ParentCategoryId":0,"CategoryId":808,"PageIndex":i,"ItemListActionName":"PostList"})
  .end(function (err, sres) { // callback
    // ...
  });

接下去就不難了,用 eventproxy 模塊控制並發,完成 150 個頁面數據的抓取后,進入 after 回調;用 cheerio 模塊對頁面進行分析,得到需要的數據;通過 express 模塊進行展示。這部分具體可以參考 node系列 的前兩篇文章。

node 部分具體代碼可以參考 Github

前端#

前端方面,需要進行數據的直觀展示。

一開始想的是用 ajax 去請求接口,但是 node 比 php 復雜多了,不大好搞,我也在 cnode 社區提了個 問題,解答如下:

首先你沒理解ajax技術的本質

1. 讓你的node能在瀏覽器端輸出 hello world  參見http://www.nodebeginner.org/index-zh-cn.html
2. 在你的頁面端 js,跑 ajax 嘗試去獲取這個 hello world。如果涉及到跨域,請采用 fs 文件系統 + 設置 mime 的方式自己做 fs 服務器輸出 page。 

感覺有點復雜,畢竟文件系統什么的都沒接觸過,還好也有了解決方案,決定用 jsonp 進行跨域。

在調研了幾款 Javascript 圖表庫后,最后選擇了 chart.js 進行數據渲染,主要是它比較輕巧,很適合做簡單的 demo。

接下去就非常簡單了,將爬蟲采集到的數據在 jsonp 回調函數中進行分析即可,分析的數據傳入圖表庫的接口中,完成圖表的渲染。

前端部分具體代碼可以參考 Github

總結#

最后來看看成果吧。

首先統計的是是各個時間段發文總量,這個圖表沒有剔除數據,共 3000 條。

由圖可以看出博客發表在 16點、17點 達到了高峰,個人猜測可能是快下班了,手頭上的活都已經干完了,正好有時間可以總結總結。而 0-8 點以及 12-13 點明顯處於谷值,這也不難理解,畢竟是睡覺時間以及午休時間。其他各個時間段的數據差異不大。

再來來看看各時段發文的平均閱讀量(剔除了閱讀量 2000+ 的數據):

由圖中可以看到,6 點發的文章閱讀量 "鶴立雞群" 啊,平均可以斬獲 875 的訪問。而 7-9 點發表的文章閱讀量也緊隨其后,這不難理解,6 點發表的文章正好可以被上班途中的人閱讀到,一般 6-8 點發文的量並不多,這樣你的文章就有很大的概率被上班途中的人看到。而 7-9 點也是一樣的道理,早上到公司,打開瀏覽器,看看博客園首頁,這幾乎成了很多人的 "慣性",所以這個時間點的發文閱讀量會相對大些。

其他一些時間點的數據相對平均,12 點又迎來一個小高峰,吃完午飯,瀏覽下博客園也是常事。

所以,程序員們,早起 6 點發文吧!當然,程序員們才不會干這種事,這種事交給定時腳本來干就好了,這個就是后文了。

如果你有興趣,還可以研究下周末發文的閱讀量和工作日的區別(據說周末發文沒人看哦)。

本文所有代碼可在我的 Github 中找到。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM