不同歌手的粉絲們都在什么時候聽歌?

I.采集部分(不感興趣可以直接跳到數據部分)

工具:python+selenium包+excel
素材來源:網易云音樂歌曲的評論區-評論的時間
主要用的是利用selenium的自動化測試工具抓取,因為對爬蟲也是正在學習,對于怎么抓內嵌的frame里的內容唯一想到的就是用selenium(對此有更高效的方法歡迎指點)。
程序非常簡單:

from selenium import web driver
#歌手主頁的url地址
def wangyi(url=u'http://music.163.com/#/artist?id=37995'):
    py_web=webdriver.Firefox()    
    py_web.get(url)    
    #切換到包涵內容的frame
    py_web.switch_to_frame('g_iframe')    
    songlinks=[]    
    for obj_a in py_web.find_elements_by_xpath("http://tr"):        
       songlink = obj_a.find_element_by_tag_name('a').get_attribute('href') 
       songlinks.append(songlink)
#由此得到該歌手主頁下的最熱50首歌,我們將songlinks內的歌曲下的評論時間進行抓取
    comments_time = {}
    #開始每首歌評論抓取
    for song in song links:
      py_web.get(song)            
      py_web.switch_to_frame('g_iframe') 
      #第一頁的評論時間抓取       
      for comment in py_web.find_elements_by_xpath("http://div[@class='time s-fc4']"): 
         #每個comment的text是該條評論的時間  
         comment_clock=comment.text   
         #我們只需要那些帶‘:’的評論,即能確定到小時的         
         if u':' in comment_clock:  
             #提取出評論的小時時間              
             hour = comment_clock.split(u':')[0][-2:]                
             comments_time.setdefault(hour,0)                
             comments_time[hour]+=1        
         #為了減少抓取時候評論集中帶來的誤差,同時增加樣本,我們多抓25頁的評論
         for i in range(25):            
             if len(py_web.find_elements_by_xpath("http://a[@href='#']"))>3:  
                #我們直接找到'下一頁'的按鈕,click后對評論翻頁再抓,直到結束-出現'js=disable'或抓完25+1頁
                next = py_web.find_elements_by_xpath("http://a[@href='#']")[-3]                
                if u'js-disabled' not in next.get_attribute("class"): 
                      next.click()                    
                      time.sleep(0.5) 
                      #下面是與抓第一頁評論相同的,應該可以簡化代碼
                      for comment in py_web.find_elements_by_xpath("http://div[@class='time s-fc4']"):     
                          comment_clock=comment.text                        
                          if u':' in comment_clock:                            
                              hour = comment_clock.split(u':')[0][-2:]     
                              comments_time.setdefault(hour,0)      
                              comments_time[hour]+=1
    return comments_time

以上就是抓取一個歌手下評論時間的代碼了,還是歡迎建議。

II.數據部分

對歌手A有comment_number=[a0,a1,a2......,a23]。每個歌手歌曲的評論數量當然不同,為了方便比較,對其求和sum_A,然后轉換為概率comment_p=[a0/sum_A,a1/sum_A,......,a23/sum_A]。
好了,根據個人選擇,我抓取了幾個歌手得到了以下的表格(先聲明,我并不是所有人的歌迷啊,只是好奇):


各歌手時間p分布.jpg

拿來直接畫圖,看看總體分布:


各歌手下評論時間走勢.jpg

線比較混亂,不過可以看到的是總體上大家作息很是類似的,其中21點后到23點間評論量增加趨勢的歌手是:陳奕迅、李志、萬青、Nirvana、槍花,而周杰倫、TF-Boy、張杰的歌迷21點后都開始放緩了。同樣在0點看活躍度,周杰倫、比伯,張杰,TF-Boy與其他幾位分開還是比較明顯的。其中,我自己比較好奇的是Kendrick Lamar(說唱)的活躍度在21點后就不高了,其一可能是因為他的評論樣本與其他幾位比非常少(個人比較喜歡所以硬加的),其二可能真的大晚上聽的人少。

光這么看還不夠,我們計算一下各個歌手comment_p之間的差異度吧。A,B歌手之間的對比,先用comment_p_A-comment_p_B得到diff_comment_p,再對diff_comment_p做均方誤差。得到下列結果:


各歌手評論活躍時間之間差異度.jpg

這個結果還是比較亂,我們做單人比較,對Guns&Roses來說,與其差異度最小的是涅槃Nirvana(0.00530),差異度最大的是TF-Boy(0.01),將這三者comment_p做個雷達圖比較,如下:

Guns&Roses VS Nirvana VS TF-Boy.jpg

嗯,不管是大朋友還是小朋友,23點以后就應該睡覺了。

再看看我比較喜歡的逼哥吧,與李志差異度較小的是陳奕迅(0.00256,全場最小),萬青(0.00409),差異比較大的拿杰倫(0.010)跟TF-Boy(0.01191)。比較如下:

李志 VS 萬青 VS TF-Boy VS 周杰倫 VS 陳奕迅.jpg

可以看出最明顯的是峰值差異,李志、萬青、陳奕迅峰值都出現在24點,而TF-Boy、周杰倫峰值出現在22點。

此外我的抓取是在大早上做的,所以可能靠前的評論都是昨天深夜的,那么粉絲多的,評論增加頻繁的比如陳奕迅,周杰倫等可能在23,24點會偏大,這點可以通過抓取更多評論抵消一點偏差。所以需要更有效率的抓法,用selenium的還是稍慢。

有時間可以拿不同大類(流行,搖滾,民謠等等)下的一些歌手作為共同樣本,來做曲風不同聽歌時間之間差異比較。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 淳享下午學習雙節棍,課堂上,孩子們好興奮,課間休息時,一手一個雙節棍不停亂甩,好擔心會傷到人,果然不出所料,...
    淳淳的媽媽閱讀 275評論 0 4
  • 今天畫得倒是很快,但是看書找關鍵詞的過程實在是太漫長了,非常的累,但我想,這就是提升專注力的表現。只有專注,才有收...
    生如夏花CWP閱讀 390評論 1 3
  • 時間過得很快,這個我最早開通也是我最在意的空間幾乎快要荒蕪了。我長時間沒有在這里寫一篇文章,空間的美感已經悄悄褪去...
    二馬行空閱讀 267評論 0 2
  • 最近聽得最多的就是挖掘原動力,何謂原動力,度娘說“原動力指原來的、先前的動力,原始的動力,天生就有的,不需要外界環...
    汪凌眉閱讀 1,039評論 0 2