前言
最近在研究文本挖掘相關的內容,所謂巧婦難為無米之炊,要想進行文本分析,首先得到有文本吧。獲取文本的方式有很多,比如從網上下載現成的文本文檔,或者通過第三方提供的API進行獲取數據。但是有的時候我們想要的數據並不能直接獲取,因為並不提供直接的下載渠道或者API供我們獲取數據。那麽這個時候該怎麽辦呢?有壹種比較好的辦法是通過網絡爬蟲,即編寫計算機程序偽裝成用戶去獲得想要的數據。利用計算機的高效,我們可以輕松快速地獲取數據。
關於爬蟲
那麽該如何寫壹個爬蟲呢?有很多種語言都可以寫爬蟲,比如Java,php,python 等,我個人比較喜歡使用python。因為python不僅有著內置的功能強大的網絡庫,還有諸多優秀的第三方庫,別人直接造好了輪子,我們直接拿過來用就可以了,這為寫爬蟲帶來了極大的方便。不誇張地說,使用不到10行python代碼其實就可以寫壹個小小的爬蟲,而使用其他的語言可以要多寫很多代碼,簡潔易懂正是python的巨大的優勢。
好了廢話不多說,進入今天的正題。最近幾年網易雲音樂火了起來,我自己就是網易雲音樂的用戶,用了幾年了。以前用的是QQ音樂和酷狗,通過我自己的親身經歷來看,我覺得網易雲音樂最優特色的就是其精準的歌曲推薦和獨具特色的用戶評論(鄭重聲明!!!這不是軟文,非廣告!!!僅代表個人觀點,非喜勿噴!)。經常壹首歌曲下面會有壹些被點贊眾多的神評論。加上前些日子網易雲音樂將精選用戶評論搬上了地鐵,網易雲音樂的評論又火了壹把。所以我想對網易雲的評論進行分析,發現其中的規律,特別是分析壹些熱評具有什麽***同的特點。帶著這個目的,我開始了對網易雲評論的抓取工作。
網絡庫
Python內置了兩個網絡庫urllib和urllib2,但是這兩個庫使用起來不是特別方便,所以在這裏我們使用壹個廣受好評的第三方庫requests。使用requests只用很少的幾行代碼就可以實現設置代理,模擬登陸等比較復雜的爬蟲工作。如果已經安裝pip的話,直接使用pip install requests 即可安裝。
中文文檔地址在此 =(organic)|utmcmd=organic; playerid=81568911; __utmb=94650624.23.10.1490672820",
'Connection':"keep-alive",
'Referer':'/' }
# 設置代理服務器
proxies= {
'ments(url):
hot_comments_list = []
hot_comments_list.append(u"用戶ID 用戶昵稱 用戶頭像地址 評論時間 點贊總數 評論內容")
params = get_params(1) # 第壹頁
encSecKey = get_encSecKey()
json_text = get_json(url,params,encSecKey)
json_dict = json.loads(json_text)
hot_comments = json_dict['hotComments'] # 熱門評論
print("***有%d條熱門評論!" % len(hot_comments))
for item in hot_comments:
comment = item['content'] # 評論內容
likedCount = item['likedCount'] # 點贊總數
comment_time = item['time'] # 評論時間(時間戳)
userID = item['user']['userID'] # 評論者id
nickname = item['user']['nickname'] # 昵稱
avatarUrl = item['user']['avatarUrl'] # 頭像地址
comment_info = userID + " " + nickname + " " + avatarUrl + " " + comment_time + " " + likedCount + " " + comment + u""
hot_comments_list.append(comment_info)
return hot_comments_list
# 抓取某壹首歌的全部評論
def get_all_comments(url):
all_comments_list = [] # 存放所有評論
all_comments_list.append(u"用戶ID 用戶昵稱 用戶頭像地址 評論時間 點贊總數 評論內容") # 頭部信息
params = get_params(1)
encSecKey = get_encSecKey()
json_text = get_json(url,params,encSecKey)
json_dict = json.loads(json_text)
comments_num = int(json_dict['total'])
if(comments_num % 20 == 0):