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

最近 "我的惡趣味" 持續氾濫。php

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

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

總體架構

總體思路很是簡單,採集發表在博客園首頁的文章的 發表時間 以及 閱讀量,進行分析。node

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

考慮到我和馬雲平均一下也是億萬富翁,得剔除一些有影響的數據。怎麼說?比方有篇文章發表於 5 點,閱讀量爲 10k,並非由於發表於 5 點致使閱讀量很高,而是由於這篇文章確實有質量,若是它是 10 點發表,它的閱讀量仍是同樣高,若是將這條數據算作有效數據,那麼發表於 5 點的文章的平均閱讀量一會兒會被拉高,和 5 點這個時段並無直接關係。根據經驗,我把這個閾值定爲閱讀量 2000,也就是剔除了閱讀量 2000+ 的數據。這也正是前面說的,"博文質量相同" 爲前提,固然這個 "相同" 不多是絕對的,只能相對來講。程序員

後端

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

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

這裏我用 node 去爬博客園。express

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

可是博客園的爬取和以前的爬蟲仍是有點區別,開始我覺得爬取 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 中找到。

相關文章
相關標籤/搜索