一、主題式網絡爬蟲設計方案
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,同時也讓我知道了自己的不足

