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]。
好了,根據個人選擇,我抓取了幾個歌手得到了以下的表格(先聲明,我并不是所有人的歌迷啊,只是好奇):
拿來直接畫圖,看看總體分布:
線比較混亂,不過可以看到的是總體上大家作息很是類似的,其中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做均方誤差。得到下列結果:
這個結果還是比較亂,我們做單人比較,對Guns&Roses來說,與其差異度最小的是涅槃Nirvana(0.00530),差異度最大的是TF-Boy(0.01),將這三者comment_p做個雷達圖比較,如下:
嗯,不管是大朋友還是小朋友,23點以后就應該睡覺了。
再看看我比較喜歡的逼哥吧,與李志差異度較小的是陳奕迅(0.00256,全場最小),萬青(0.00409),差異比較大的拿杰倫(0.010)跟TF-Boy(0.01191)。比較如下:
可以看出最明顯的是峰值差異,李志、萬青、陳奕迅峰值都出現在24點,而TF-Boy、周杰倫峰值出現在22點。
此外我的抓取是在大早上做的,所以可能靠前的評論都是昨天深夜的,那么粉絲多的,評論增加頻繁的比如陳奕迅,周杰倫等可能在23,24點會偏大,這點可以通過抓取更多評論抵消一點偏差。所以需要更有效率的抓法,用selenium的還是稍慢。
有時間可以拿不同大類(流行,搖滾,民謠等等)下的一些歌手作為共同樣本,來做曲風不同聽歌時間之間差異比較。