爬取酷狗top500歌曲熱度排名


一、主題式網絡爬蟲設計方案

1.主題式網絡爬蟲

爬取酷狗top500歌曲熱度排名

2.主題式網絡爬蟲爬取的內容與數據特征分析

內容及數據特征分析:對酷狗TOP500上歌曲的熱度排行做一個可視化表格,

主要是爬取酷狗音樂榜單酷狗TOP500的歌曲排名

3.主題式網絡爬蟲設計方案概述(包括實現思路與技術難點)

實現思路:用requests庫抓取頁面信息,用BeautifulSoup庫解析網頁,創建excel存儲數據進行數據分析

技術難點:excel的創建和相關系數散點圖與建立回歸方程

二、主題頁面的結構特征分析

1.主題頁面的結構與特征分析

搜索https://www.kugou.com/,打開主頁,然后點擊榜單找到榜單頁面,如圖所示

2.Htmls頁面解析

3.節點(標簽)查找方法與遍歷方法

按“F12"打開網頁源代碼,如圖所示

用find_all()方法進行遍歷

三、網絡爬蟲程序設計

1.數據爬取與采集

爬取代碼如下

復制代碼
 1 import requests
 2 import time
 3 import xlwt
 4 from bs4 import BeautifulSoup
 5 
 6 #創建Excel存儲數據
 7 class Spider:
 8     def __init__(self):
 9         self.workbook, self.worksheet = self.create_excel()
10         self.nums = 1
11 
12     def create_excel(self):
13         workbook = xlwt.Workbook(encoding='utf-8')
14         worksheet = workbook.add_sheet('Sheet1')
15         title = ['排名', '歌手和歌名', '播放時間']
16         for index, title_data in enumerate(title):
17             worksheet.write(0, index, title_data)
18         return workbook, worksheet
19 
20     def get_html(self,url):
21         headers = {'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)', }  # 爬蟲請求頭信息
22         response = requests.get(url, headers=headers)
23         if response.status_code == 200:  # 如果請求狀態值為200,則輸出
24             return response.text
25         else:
26             return '產生異常'
27 
28 
29     def get_data(self,html):
30         soup = BeautifulSoup(html, 'lxml')  # 用BeautifulSuop庫解析網頁
31         ranks = soup.find_all('span', class_='pc_temp_num')  # 排名
32         names = soup.find_all('a', class_='pc_temp_songname')  # 歌手和歌名
33         times = soup.find_all('span', class_='pc_temp_time')  # 播放時間
34 
35         # 打印信息
36         for r, n, t in zip(ranks, names, times):  # 用zip函數
37             r = r.get_text().replace('\n', '').replace('\t', '').replace('\r', '')
38             n = n.get_text()
39             t = t.get_text().replace('\n', '').replace('\t', '').replace('\r', '')
40             data = {'排名': r, '歌名-歌手': n, '播放時間': t}
41             self.worksheet.write(self.nums, 0, str(r))
42             self.worksheet.write(self.nums, 1, str(n))
43             self.worksheet.write(self.nums, 2, str(t))
44             self.nums += 1
45 
46     def main(self,):
47         urls = ['https://www.kugou.com/yy/rank/home/{}-8888.html?from=rank'.format(str(i)) for i in range(1, 24)]  # 用for循環
48         for url in urls:
49             print(url)
50             html = self.get_html(url)
51             self.get_data(html)
52             time.sleep(1)  # 暫停1S
53         self.workbook.save('data.xls')#存入所有信息后保存為data.xls
54 
55 
56 if __name__ == '__main__':  # 程序執行時調用主程序main()
57     spider = Spider()
58     spider.main()
復制代碼

運行結果如圖

2.對數據進行清洗和處理

輸出數據文件的前5行

1 import pandas as pd
2 kugou=pd.DataFrame(pd.read_excel('data.xls'))
3 kugou.head()

 

 

 

   (1)刪除無效行與列

1 import pandas as pd
2 kugou=pd.DataFrame(pd.read_excel('data.xls'))
3 kugou.head()
4 kugou.drop(1,axis=0,inplace=True)
5 kugou.head()

 

 

(2)重復值處理,索引判斷詞沒有出現“True”

1 import pandas as pd
2 kugou=pd.DataFrame(pd.read_excel('data.xls'))
3 kugou.head()
4 kugou.duplicated()

 

 

(3)空值與缺失值處理

1 import pandas as pd
2 kugou=pd.DataFrame(pd.read_excel('data.xls'))
3 kugou.head()
4 kugou['播放時間'].isnull().value_counts()

 

 

(4)異常值處理

1 import pandas as pd
2 kugou=pd.DataFrame(pd.read_excel('data.xls'))
3 kugou.head()
4 kugou.describe()

 

 

 3.文本分析(可選):jieba分詞、wordcloud的分詞可視化

4.數據分析與可視化(例如:數據柱形圖、直方圖、散點圖、盒圖、分布圖)

復制代碼
 1 import matplotlib
 2 from matplotlib import pyplot
 3 matplotlib.rcParams['font.sans-serif']=['SimHei']
 4 x = ['胡66-后來遇見他','海來阿木-點歌的人','皮卡丘多多-驚雷','傅如喬-微微','夢然-少年']
 5 y = [1,2,3,4,5]
 6 pyplot.plot(x,y)
 7 plt.xlabel("歌手和歌名")
 8 plt.ylabel("排名")
 9 plt.title('排名1-5音樂的播放歌手和歌名')
10 pyplot.show()
復制代碼

 

復制代碼
1 import matplotlib.pyplot as plt
2 plt.rcParams['font.family']=['sans-serif']
3 plt.rcParams['font.sans-serif']=['SimHei']
4 plt.bar(['胡66-后來遇見他','海來阿木-點歌的人','皮卡丘多多-驚雷','傅如喬-微微','夢然-少年'],[1,2,3,4,5])
5 plt.legend()
6 plt.xlabel("歌手和歌名")
7 plt.ylabel("排名")
8 plt.title('排名1-5音樂的歌手和歌名')
9 pyplot.show()
復制代碼

 

 

 
        

 

 

 

 

5.根據數據之間的關系,分析兩個變量之間的相關系數,畫出散點圖,並建立變量之間的回歸方程(一元或多元)

復制代碼
 1 import numpy as np
 2 import pandas as pd
 3 import sklearn
 4 kugou_df=pd.read_excel('data.xls')
 5 kugou_df.head()
 6 from sklearn.linear_model import LinearRegression
 7 X = kugou_df.drop("排名",axis=1)
 8 predict_model = LinearRegression()
 9 predict_model.fit(X,kugou_df['排名'])#訓練模型
10 print("回歸系數為:",predict_model.coef_)#判斷相關性
復制代碼
復制代碼
1 import numpy as np
2 import pandas as pd
3 import seaborn as sns
4 kugou_df = pd.read_excel('data.xls')
5 kugou_df.columns
6 DataFrame=kugou_df[["排名","歌手和歌名","播放時間"]]
7 sns.regplot(kugou_df.排名,kugou_df.歌手和歌名)
復制代碼

 

6.數據持久化

7.將以上各部分的代碼匯總,附上完整程序代碼

 

復制代碼
  1 import requests
  2 import time
  3 import xlwt
  4 
  5 from bs4 import BeautifulSoup
  6 
  7 #創建Excel存儲數據
  8 class Spider:
  9     def __init__(self):
 10         self.workbook, self.worksheet = self.create_excel()
 11         self.nums = 1
 12 
 13     def create_excel(self):
 14         workbook = xlwt.Workbook(encoding='utf-8')
 15         worksheet = workbook.add_sheet('Sheet1')
 16         title = ['排名', '歌手和歌名', '播放時間']
 17         for index, title_data in enumerate(title):
 18             worksheet.write(0, index, title_data)
 19         return workbook, worksheet
 20 
 21     def get_html(self,url):
 22         headers = {'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)', }  # 爬蟲請求頭信息
 23         response = requests.get(url, headers=headers)
 24         if response.status_code == 200:  # 如果請求狀態值為200,則輸出
 25             return response.text
 26         else:
 27             return '產生異常'
 28 
 29 #獲取數據
 30     def get_data(self,html):
 31         soup = BeautifulSoup(html, 'lxml')  # 用BeautifulSuop庫解析網頁
 32         ranks = soup.find_all('span', class_='pc_temp_num')  # 排名
 33         names = soup.find_all('a', class_='pc_temp_songname')  # 歌手和歌名
 34         times = soup.find_all('span', class_='pc_temp_time')  # 播放時間
 35 
 36         # 打印信息
 37         for r, n, t in zip(ranks, names, times):  # 用zip函數
 38             r = r.get_text().replace('\n', '').replace('\t', '').replace('\r', '')
 39             n = n.get_text()
 40             t = t.get_text().replace('\n', '').replace('\t', '').replace('\r', '')
 41             data = {'排名': r, '歌名-歌手': n, '播放時間': t}
 42             self.worksheet.write(self.nums, 0, str(r))
 43             self.worksheet.write(self.nums, 1, str(n))
 44             self.worksheet.write(self.nums, 2, str(t))
 45             self.nums += 1
 46 
 47     def main(self,):
 48         urls = ['https://www.kugou.com/yy/rank/home/{}-8888.html?from=rank'.format(str(i)) for i in range(1, 24)]  # 用for循環
 49         for url in urls:
 50             print(url)
 51             html = self.get_html(url)
 52             self.get_data(html)
 53             time.sleep(1)  # 暫停1S
 54         self.workbook.save('data.xls')
 55 
 56 
 57 if __name__ == '__main__':  # 程序執行時調用主程序main()
 58     spider = Spider()
 59     spider.main()
 60 
 61 #對數據進行清洗和處理
 62 import pandas as pd
 63 kugou=pd.DataFrame(pd.read_excel('data.xls'))
 64 kugou.head()#輸出數據文件的前5行
 65 
 66 kugou.drop(1,axis=0,inplace=True)#刪除無效行與列
 67 
 68 kugou.duplicated()#縮影重復值處理
 69 
 70 kugou['播放時間'].isnull().value_counts()#查找空值與缺失值處理
 71 
 72 kugou.describe()#索引異常值處理
 73 kugou.head()
 74 
 75 #繪制圖像
 76 import matplotlib
 77 from matplotlib import pyplot
 78 matplotlib.rcParams['font.sans-serif']=['SimHei']
 79 x = ['胡66-后來遇見他','海來阿木-點歌的人','皮卡丘多多-驚雷','傅如喬-微微','夢然-少年']
 80 y = [1,2,3,4,5]
 81 pyplot.plot(x,y)
 82 plt.xlabel("歌手和歌名")
 83 plt.ylabel("排名")
 84 plt.title('排名1-5音樂的播放歌手和歌名')
 85 pyplot.show()
 86 
 87 import matplotlib.pyplot as plt
 88 plt.rcParams['font.family']=['sans-serif']
 89 plt.rcParams['font.sans-serif']=['SimHei']
 90 plt.bar(['胡66-后來遇見他','海來阿木-點歌的人','皮卡丘多多-驚雷','傅如喬-微微','夢然-少年'],[1,2,3,4,5])
 91 plt.legend()
 92 plt.xlabel("歌手和歌名")
 93 plt.ylabel("排名")
 94 plt.title('排名1-5音樂的歌手和歌名')
 95 pyplot.show()
 96 
 97 import seaborn as sns
 98 file_path = "data.xls"
 99 df = pd.read_excel(file_path,names=['排名','歌手和歌名','播放時間'])
100 sns.boxplot(x='播放時間',y='排名',data=df)
101 
102 #分析相關系數
103 import numpy as np
104 import pandas as pd
105 import sklearn
106 kugou_df=pd.read_excel('data.xls')
107 kugou_df.head()
108 from sklearn.linear_model import LinearRegression
109 X = kugou_df.drop("排名",axis=1)
110 predict_model = LinearRegression()
111 predict_model.fit(X,kugou_df['排名'])#訓練模型
112 print("回歸系數為:",predict_model.coef_)#判斷相關性
113 
114 #繪制散點圖,建立回歸方程
115 import numpy as np
116 import pandas as pd
117 import seaborn as sns
118 kugou_df = pd.read_excel('data.xls')
119 kugou_df.columns
120 DataFrame=kugou_df[["排名","歌手和歌名","播放時間"]]
121 sns.regplot(kugou_df.排名,kugou_df.歌手和歌名)
復制代碼

四、結論
1.經過對主題數據的分析與可視化,可以得到哪些結論?

酷狗音樂TOP500的音樂熱度非常高

排行榜上歌手多為網絡歌手
2.對本次程序設計任務完成的情況做一個簡單的小結。

 本次程序讓我跟了解了python,同時也讓我知道了自己的不足


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM