前言
看前面有位朋友分析了一下每天某個時間發文章的訪問量區別,以討論非系統性因素對文章訪問量的影響。之所以進一步討論工作日和周末發文對文章訪問量的影響,一是覺得很有意思,二是畢業設計與此有很大關系,三是覺得還是有點意義的,於是決定做一下這個工作。那么到底周末發文的訪問量是不是總體來說比工作日低呢,請往下看。
工具
1.Python 3.5
2.BeautifulSoup 4.4.1
3.Requests模塊
分析網頁
由於之前的工作已知博客園博客展覽頁是要通過ajax請求換頁,這里我采用了Requests模塊,post一個請求即可。
payload = {"CategoryType":"SiteHome","ParentCategoryId":0,"CategoryId":808,"PageIndex":i,"ItemListActionName":"PostList"} r = requests.post(posturl,data = payload)
這樣就可以接收到第i頁的博文列表的HTML內容了。
再來看一下我們要爬取的內容:
我們要爬取兩個內容:發布時間 與 閱讀量,這次我們爬取40—200頁共161頁的內容,並分兩種情況:剔除3000以上訪問量的文章以及考慮全部文章,然后要做的工作有兩個:根據打掃過的數據,統計出一周周一到周日每天的文章總數與訪問量總數,最后用WPS表格來制作出對比圖。一提到解析網頁,我毫無疑問地又想到了BeautifulSoup這款工具,簡單好用,功能強大,推薦。
那么我們首先用BeautifulSoup抓出 class = post_item_foot 的 ‘發布於...’ 內容,以及抓出 class = 'article_view' 的 ’閱讀(...)‘內容,再去除一些無用的部分,最后提取出日期三個數據y,m,d,以及閱讀量,這里我們無需關心文章到底是誰發的或者具體時間。
(ps:Python 3.5下裝BeautifulSoup老是不成功,后來發現有更高的版本4.4.1,就果斷換了,然后一發成功,不知道什么原因)
部分代碼如下:
bs = BeautifulSoup(r.text,"html.parser") #轉化成beautifulsoup對象 View = bs.findAll(attrs = {'class' : 'article_view','class' : 'post_item_foot'}) #找出兩個class內容 strallview = str(View) #轉化為字符串 viewcountsmatch = re.findall('閱讀\(\d+\)',strallview) viewdaymatch = re.findall('發布於 ....-\d+-\d+',strallview)
得出日期三個數據以后,這里我使用蔡勒公式(Zeller Fomula)直接計算出該日是星期幾。蔡勒公式函數代碼如下:
def ZellerFomula(y,m,d): if m == 1 or m == 2: y -= 1 m += 12 c = y // 100 y = y - c * 100 w = (c // 4) - 2 * c + (y + y // 4) + (13 * (m + 1) // 5) + d - 1 while w < 0: w += 7 w %= 7 if w == 0: w += 7 return w
然后就是簡單的統計了。
這里我有一個考慮,由於日子越早的文章顯然訪問量總是會更高,所以為了在一定程度上抵消這種效應,我為每一頁的20篇文章設置了一個權重:
weight = 1 - 0.0005 * (i - 40)
即i越大,頁數越大,發布越早,訪問量相應打一個折扣,這里我設置的最大折扣為92%,即第200頁的文章相應的閱讀量為其原來閱讀量的92%,希望能稍微提升一下結果的公平性。
代碼
這時候寫出python代碼(剔除3000+文章版本):
import requests import re import urllib from bs4 import BeautifulSoup def ZellerFomula(y,m,d): if m == 1 or m == 2: y -= 1 m += 12 c = y // 100 y = y - c * 100 w = (c // 4) - 2 * c + (y + y // 4) + (13 * (m + 1) // 5) + d - 1 while w < 0: w += 7 w %= 7 if w == 0: w += 7 return w f = open('keyvalue.txt','w') posturl = 'http://www.cnblogs.com/mvc/AggSite/PostList.aspx' daysum = [0,0,0,0,0,0,0,0,0] count = [0,0,0,0,0,0,0,0,0] for i in range(40,201): weight = 1 - 0.0005 * (i - 40) payload = {"CategoryType":"SiteHome","ParentCategoryId":0,"CategoryId":808,"PageIndex":i,"ItemListActionName":"PostList"} r = requests.post(posturl,data = payload) bs = BeautifulSoup(r.text,"html.parser") View = bs.findAll(attrs = {'class' : 'article_view','class' : 'post_item_foot'}) strallview = str(View) viewcountsmatch = re.findall('閱讀\(\d+\)',strallview) viewdaymatch = re.findall('發布於 ....-\d+-\d+',strallview) #print(viewcountsmatch) #print(viewdaymatch) for j in range(len(viewcountsmatch)): vcm = viewcountsmatch[j] vcm = re.sub('閱讀\(','',vcm) vcm = re.sub('\)','',vcm) #print(vcm) vc = int(vcm) if(vc > 3000): continue vdm = viewdaymatch[j] vdm = re.sub('發布於 ','',vdm) vdm = vdm.split('-',2) #print(vdm) ans = ZellerFomula(int(vdm[0]),int(vdm[1]),int(vdm[2])) #print(ans) ass = int(weight*vc) #print(str(ass)+ ' ' +str(vc)) daysum[ans] += ass count[ans] += 1 for i in range(1,8): f.write(str(daysum[i])+' ') f.write(str(count[i])) f.write('\n') f.close()
這代碼寫了很久,主要python很久沒碰也不熟悉了。
運行結果與分析
然后我們運行就可以爬了,耗時大約40+秒,結果如下:
1.剔除版本數據
每行前面是161篇文章中星期1~7的文章訪問總量,后面是文章數量。不算3000+訪問以上的文章總數3104篇,貢獻訪問量1573399。
2.未剔除版本
文章總數3220 = 161 x 20篇,貢獻訪問量2176232.
由上可以看出,3000+訪問以上的較優質文章116篇,占比3.6%,其貢獻的訪問量為602833,占比27.7%,這也是預料之中的。
圖表
由圖可得,兩種方式總體上的差距並不大,從發文數量上看,周一發文最多,可能是大家都上班了,開始新一周的工作使然。隨后周二到周四發文數量略有波動,但是都差不太多,並且比周一少。到周五由於放假了,文章數量也相應減少。到周末兩天發文數量就有了很大下降,這也是預料之中。
從文章訪問量來看,周一達到最大,隨后又以較周一低的水平波動,到周末達到低谷,一大原因也是由於文章數量的減少。
從平均訪問情況來看,周一至周五的平均訪問量普遍比周末稍高一點,印證了結論“工作日發文要比周末發文平均訪問量多”,但是並沒有多太多,其中周一達到最高峰,隨后有波動,到周日有一個反彈,說明“周一效應”還是有一點的。
兩幅圖的有些顯著的不同就是訪問量來看,剔除3000+文章以后,周二的訪問量有10W+的顯著下降,這是否說明周二的時候高質量文章的訪問在急速增長的原因呢。
補充
后來我發現光考慮篇均訪問還不全面,因為周一即使篇均訪問較高,但是它的文章數也是很大的,所以周一的文章必然會很快被覆蓋過去,所以這里有一個性價比的問題,於是我又算了一項指標,即篇均訪問與當日文章數量之比,底數越大小即文章數量越小,越晚被覆蓋,曝光率越大,篇均訪問越大自然帶來的效應越大。所以有了下面這張圖:
事實證明,性價比最高的發文日期居然是發的很少,訪問很少的周末!
后續工作
雖然本次挖掘3220篇文章數據較小,感覺還是可以從速度方面進行優化的。
權重也是我自己簡單設計的,這方面也可以進一步優化。
歡迎大家提出意見與建議。
結論與啟示
所以說,如果你想要讓你的文章獲得更多的訪問量,獲得更大的影響力,盡量在工作日發文吧。當然,我前面說過,這些都只是非系統性因素,俗話說,打鐵還需自身硬,提高自己文章的質量和水平才是獲得更大文章影響力的決定性因素。希望廣大園友能夠致力於發布質量更高的文章,共同構建一個屬於我們的優質的博客園。
本文就是上星期四晚上寫就的,一直到現在才發,試下效果。事實是寫完文章很難忍住不發,哈哈。
同樣,爬取博客園只是為了學習之用,無其他目的,望理解。感謝韓子遲的工作。