Bilibili動漫排行榜信息爬取分析


Bilibili動漫排行榜信息爬取分析

(一)、選題的背景

  互聯網從發展到至今,已經深入到人們的日常生活中,並且不論老人還是小孩,多少都會接觸到互聯網。在這個越來越信息化的社會,互聯網上的信息量更是爆炸式的增長,但是在如此巨大的信息量中,我們想要找到我們需要的價值信息就非常困難了。國內國外包含了很多搜索引擎,類似有搜狗,百度,360等等,我們如何有效的尋找具有價值的信息?網絡爬蟲應運而生,它可以幫助我們在繁瑣的信息網中爬取出關鍵信息,而且可以一次性的爬取出來,省去了人力搜索。

 

(二)、主題式網絡爬蟲設計方案

1.主題式網絡爬蟲名稱

           Bilibili動漫排行榜信息爬取分析

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

           爬取熱門動漫番名、播放量、評論量、收藏量等信息,從而作出分析。

3.主題式網絡爬蟲設計方案概述

           使用爬蟲爬取 Bilibili動漫排行榜(嗶哩嗶哩排行榜 (bilibili.com)) 信息然對數據進行相應的處理,最后對處理后的數據進行可視化分析。

(三)、主題頁面的結構特征分析

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

爬取頁面展示

 

 

 

 

2.Htmls 頁面解析

f12進入后,尋找所要信息

 

 

 

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

找出他們對應的class名,之后使用for循環遍歷這些標簽,再進行輸出

 

 

 

 

(四)、網絡爬蟲程序設計

爬蟲程序主體要包括以下各部分,要附源代碼及較詳細注釋,並在每部分程序后面提供輸出結果的截圖。

1.數據爬取與采集

 1 # 導入相關庫
 2 import requests
 3 import json
 4 from bs4 import BeautifulSoup
 5 
 6 def get_html(url):
 7     try:
 8         r = requests.get(url)             # 使用get來獲取網頁數據
 9         r.raise_for_status()              # 如果返回參數不為200,拋出異常
10         r.encoding = r.apparent_encoding  # 獲取網頁編碼方式
11         return r.text                     # 返回獲取的內容
12     except:
13         return '錯誤'
14 
15 
16 url = 'https://www.bilibili.com/v/popular/rank/bangumi'    # 網址
17 html = get_html(url)                                       # 獲取返回值
18 print(html)                                              # 打印

 

 

 2.提取需要的數據,並保存為.xlsx

 1 def save(html):
 2     # 解析網頁
 3     soup = BeautifulSoup(html, 'html.parser')  # 指定Beautiful的解析器為“html.parser”
 4 
 5     # 定義好相關列表准備存儲相關信息
 6     name = []  # 動漫名字
 7     bfl = []  # 播放量
 8     pls = []  # 評論數
 9     scs = []  # 收藏數
10 
11     #  動漫名字存儲
12     for tag in soup.find_all('div', class_='info'):
13         # print(tag)
14         bf = tag.a.string
15         name.append(str(bf))
16     print(name)
17 
18     #  播放量存儲
19     for tag in soup.find_all('div', class_='detail'):
20         # print(tag)
21         bf = tag.find('span', class_='data-box').get_text()
22         # 統一單位為‘萬’
23         if '' in bf:
24             num = float(re.search(r'\d(.\d)?', bf).group()) * 10000
25             # print(num)
26             bf = num
27         else:
28             bf = re.search(r'\d*(\.)?\d', bf).group()
29         bfl.append(float(bf))
30     print(bfl)
31     #  評論數存儲
32     for tag in soup.find_all('div', class_='detail'):
33         # pl = tag.span.next_sibling.next_sibling
34         pl = tag.find('span', class_='data-box').next_sibling.next_sibling.get_text()
35         #統一單位
36         if '' not in pl:
37             pl = '%.1f' % (float(pl) / 10000)
38             # print(123, pl)
39         else:
40             pl = re.search(r'\d*(\.)?\d', pl).group()
41         pls.append(float(pl))
42     print(pls)
43     #  收藏數
44     for tag in soup.find_all('div', class_='detail'):
45         sc = tag.find('span', class_='data-box').get_text()
46         sc = re.search(r'\d*(\.)?\d', sc).group()
47         scs.append(float(sc))
48     print(scs)
49     
50     
51     # 存儲至excel表格中
52     info = {'動漫名': name, '播放量(萬)': bfl, '評論數(萬)': pls, '收藏數(萬)': scs}
53     dm_file = pandas.DataFrame(info)
54     #查找重復值
55     #print(dm_file.duplicated())
56     
57     #查找缺少值
58     #print(dm_file.isnull())
59     
60     dm_file.to_excel('Dongman.xlsx', sheet_name="動漫數據分析")
61     # 將所有列表返回
62     return name, bfl, pls, scs, TScore

 

 

 

3.查找缺少/重復值

1 #查找重復值
2     #print(dm_file.duplicated())
3     
4     #查找缺少值
5     #print(dm_file.isnull())

 

 

 

 

 4.繪制條形圖

 1 def view(info):
 2     my_font = font_manager.FontProperties(fname='./data/simhei.ttf')  # 設置中文字體(圖標中能顯示中文)
 3     dm_name = info[0]  # 番劇名
 4     dm_play = info[1]  # 番劇播放量
 5     dm_review = info[2]  # 番劇評論數
 6     dm_favorite = info[3]  # 番劇收藏數
 7 
 8     # 為了坐標軸上能顯示中文
 9     plt.rcParams['font.sans-serif'] = ['SimHei']
10     plt.rcParams['axes.unicode_minus'] = False
11 
12 
13     # *******收藏數條形圖
14     fig, ax1 = plt.subplots()
15     plt.bar(dm_name, dm_favorite, color='red')  #設置柱狀圖
16     plt.title('綜合評分和播放量數據分析', fontproperties=my_font)  # 表標題
17     ax1.tick_params(labelsize=6)
18     plt.xlabel('番劇名')  # 橫軸名
19     plt.ylabel('收藏數')  # 縱軸名
20     plt.xticks(rotation=90, color='green')  # 設置橫坐標變量名旋轉度數和顏色
21     plt.show()
22         
23  
24 
25     # 評論數條形圖
26     fig, ax3 = plt.subplots()
27     plt.bar(dm_name, dm_review, color='green')
28     plt.title('番劇評論數和收藏數分析')
29     plt.ylabel('評論數(萬)')
30     ax3.tick_params(labelsize=6)
31     plt.xticks(rotation=90, color='green')
32     plt.show()
33     
34 
35     # 綜合評分條形圖
36     fig, ax5 = plt.subplots()
37     plt.bar(dm_name, dm_favorite, color='red')
38     plt.title('綜合評分和收藏數量數據分析')
39     plt.ylabel('綜合評分')
40     ax5.tick_params(labelsize=6)
41     plt.xticks(rotation=90, color='green')
42     plt.show()
43     
44    
45     #播放量條形圖
46     fig, ax7 = plt.subplots()
47     plt.bar(dm_name, dm_play, color='cyan')
48     plt.title('播放量和評論數 數據分析')
49     plt.ylabel('播放量(萬)')
50     ax7.tick_params(labelsize=6)
51     plt.xticks(rotation=90, color='green')
52     plt.show()
53     

 

 

 

 

 

 

 

 

 

 

 

 

5.繪制餅圖

 1  #繪制播放量占比餅圖
 2     plt.figure(figsize=(7, 7))
 3     # 標簽名
 4     labels = dm_name[:5]
 5     # 構造數據
 6     data = dm_play[:5]
 7 
 8     # 繪制圖形
 9     plt.pie(data, labels=labels, autopct='%1.1f%%')
10     plt.title('播放量占比')
11     plt.savefig('播放量占比.jpg')
12     plt.show()
13 
14     # 繪制番劇評論數占比餅圖
15     plt.figure(figsize=(7, 7))
16     labels = dm_name[:5]
17     data = dm_review[:5]
18 
19     plt.pie(data, labels=labels, autopct='%1.1f%%')
20     plt.title('番劇評論數占比')
21     plt.savefig('番劇評論數占比.jpg')
22     plt.show()
23 
24     # 繪制番劇收藏數占比餅圖
25     plt.figure(figsize=(7, 7))
26     labels = dm_name[:5]
27     data = dm_favorite[:5]
28 
29     plt.pie(data, labels=labels, autopct='%1.1f%%')
30     plt.title('番劇收藏數占比')
31     plt.savefig('番劇收藏數占比.jpg')
32     plt.show()
33 
34     

 

 

 

 

 

 

 

 

 

 

 

 6.數據分析,回歸方程

 1 def rc():
 2 # 分析兩組數據並畫散點圖和建立回歸方程
 3     # 設置中文字體
 4     plt.rcParams['font.sans-serif'] = ['SimHei']
 5 
 6     # 嵌套函數
 7     # 需要擬合的函數func,指定函數的形狀
 8     def func1(p, x):
 9         a, b, c = p
10         return a * x * x + b * x + c
11 
12     # 偏差函數
13     def error1(p, x, y):
14         return func1(p, x) - y
15     df = pd.DataFrame(pd.read_excel('Dongman.xlsx'))
16     # 畫樣本圖像
17     plt.scatter(df['收藏數(萬)'], df['播放量(萬)'])
18 
19     # 設置樣本數據
20     X =df['收藏數(萬)'] / 10000
21     Y = df['播放量(萬)'] / 10000
22     plt.figure(figsize=(8, 6))
23 
24     # 設置函數擬合參數
25     p0 = [1, 15, 20]
26 
27     # 進行最小二乘擬合
28     para = leastsq(error1, p0, args=(X, Y))
29     a, b, c = para[0]
30 
31     # 讀取結果
32     print('a=', a, 'b=', b, 'c=', c)
33     print("求解的擬合直線為:")
34     print("y=" + str(round(a, 2)) + "x*x" + str(round(b, 2)) + "x+" + str(round(c, 2)))
35 
36     # 畫擬合曲線
37     plt.scatter(X, Y, color='green', label='樣本數據', linewidth=2)
38     x = np.linspace(1, 15, 20)
39     y = a * x * x + b * x + c
40     plt.plot(x, y, color='red', label='擬合曲線', linewidth=2)
41     plt.legend()
42     plt.title('')
43     plt.grid()
44     plt.show()
45 
46 rc()

 

 

 

7.數據持久化

1 #例如
2 plt.savefig('番劇收藏數占比.jpg')

 

 

 

 

 

 8.完整代碼

  1 import re
  2 import pandas
  3 import requests
  4 from bs4 import BeautifulSoup
  5 import matplotlib.pyplot as plt
  6 from matplotlib import font_manager
  7 
  8 
  9 def get_html(url):
 10     try:
 11         r = requests.get(url)  # 使用get來獲取網頁數據
 12         r.raise_for_status()  # 如果返回參數不為200,拋出異常
 13         r.encoding = r.apparent_encoding  # 獲取網頁編碼方式
 14         return r.text  # 返回獲取的內容
 15     except:
 16         return '錯誤'
 17 
 18 
 19 def save(html):
 20     # 解析網頁
 21     soup = BeautifulSoup(html, 'html.parser')  # 指定Beautiful的解析器為“html.parser”
 22 
 23     # 定義好相關列表准備存儲相關信息
 24     name = []  # 動漫名字
 25     bfl = []  # 播放量
 26     pls = []  # 評論數
 27     scs = []  # 收藏數
 28 
 29     #  動漫名字存儲
 30     for tag in soup.find_all('div', class_='info'):
 31         # print(tag)
 32         bf = tag.a.string
 33         name.append(str(bf))
 34     print(name)
 35 
 36     #  播放量存儲
 37     for tag in soup.find_all('div', class_='detail'):
 38         # print(tag)
 39         bf = tag.find('span', class_='data-box').get_text()
 40         # 統一單位為‘萬’
 41         if '' in bf:
 42             num = float(re.search(r'\d(.\d)?', bf).group()) * 10000
 43             # print(num)
 44             bf = num
 45         else:
 46             bf = re.search(r'\d*(\.)?\d', bf).group()
 47         bfl.append(float(bf))
 48     print(bfl)
 49     #  評論數存儲
 50     for tag in soup.find_all('div', class_='detail'):
 51         # pl = tag.span.next_sibling.next_sibling
 52         pl = tag.find('span', class_='data-box').next_sibling.next_sibling.get_text()
 53         #統一單位
 54         if '' not in pl:
 55             pl = '%.1f' % (float(pl) / 10000)
 56             # print(123, pl)
 57         else:
 58             pl = re.search(r'\d*(\.)?\d', pl).group()
 59         pls.append(float(pl))
 60     print(pls)
 61     #  收藏數
 62     for tag in soup.find_all('div', class_='detail'):
 63         sc = tag.find('span', class_='data-box').get_text()
 64         sc = re.search(r'\d*(\.)?\d', sc).group()
 65         scs.append(float(sc))
 66     print(scs)
 67     
 68     
 69     # 存儲至excel表格中
 70     info = {'動漫名': name, '播放量(萬)': bfl, '評論數(萬)': pls, '收藏數(萬)': scs}
 71     dm_file = pandas.DataFrame(info)
 72     #查找重復值
 73     print(dm_file.duplicated())
 74     
 75     #查找缺少值
 76     print(dm_file.isnull())
 77     
 78     dm_file.to_excel('Dongman.xlsx', sheet_name="動漫數據分析")
 79     # 將所有列表返回
 80     return name, bfl, pls, scs, TScore
 81 
 82 
 83 def view(info):
 84     my_font = font_manager.FontProperties(fname='./data/simhei.ttf')  # 設置中文字體(圖標中能顯示中文)
 85     dm_name = info[0]  # 番劇名
 86     dm_play = info[1]  # 番劇播放量
 87     dm_review = info[2]  # 番劇評論數
 88     dm_favorite = info[3]  # 番劇收藏數
 89 
 90     # 為了坐標軸上能顯示中文
 91     plt.rcParams['font.sans-serif'] = ['SimHei']
 92     plt.rcParams['axes.unicode_minus'] = False
 93 
 94 
 95     # *******收藏數條形圖
 96     fig, ax1 = plt.subplots()
 97     plt.bar(dm_name, dm_favorite, color='red')  #設置柱狀圖
 98     plt.title('綜合評分和播放量數據分析', fontproperties=my_font)  # 表標題
 99     ax1.tick_params(labelsize=6)
100     plt.xlabel('番劇名')  # 橫軸名
101     plt.ylabel('收藏數')  # 縱軸名
102     plt.xticks(rotation=90, color='green')  # 設置橫坐標變量名旋轉度數和顏色
103     plt.show()
104         
105  
106 
107     # 評論數條形圖
108     fig, ax3 = plt.subplots()
109     plt.bar(dm_name, dm_review, color='green')
110     plt.title('番劇評論數和收藏數分析')
111     plt.ylabel('評論數(萬)')
112     ax3.tick_params(labelsize=6)
113     plt.xticks(rotation=90, color='green')
114     plt.show()
115     
116 
117     # 綜合評分條形圖
118     fig, ax5 = plt.subplots()
119     plt.bar(dm_name, dm_favorite, color='red')
120     plt.title('綜合評分和收藏數量數據分析')
121     plt.ylabel('綜合評分')
122     ax5.tick_params(labelsize=6)
123     plt.xticks(rotation=90, color='green')
124     plt.show()
125     
126    
127     #播放量條形圖
128     fig, ax7 = plt.subplots()
129     plt.bar(dm_name, dm_play, color='cyan')
130     plt.title('播放量和評論數 數據分析')
131     plt.ylabel('播放量(萬)')
132     ax7.tick_params(labelsize=6)
133     plt.xticks(rotation=90, color='green')
134     plt.show()
135     
136     #繪制播放量占比餅圖
137     plt.figure(figsize=(7, 7))
138     # 標簽名
139     labels = dm_name[:5]
140     # 構造數據
141     data = dm_play[:5]
142 
143     # 繪制圖形
144     plt.pie(data, labels=labels, autopct='%1.1f%%')
145     plt.title('播放量占比')
146     plt.savefig('播放量占比.jpg')
147     plt.show()
148 
149     # 繪制番劇評論數占比餅圖
150     plt.figure(figsize=(7, 7))
151     labels = dm_name[:5]
152     data = dm_review[:5]
153 
154     plt.pie(data, labels=labels, autopct='%1.1f%%')
155     plt.title('番劇評論數占比')
156     plt.savefig('番劇評論數占比.jpg')
157     plt.show()
158 
159     # 繪制番劇收藏數占比餅圖
160     plt.figure(figsize=(7, 7))
161     labels = dm_name[:5]
162     data = dm_favorite[:5]
163 
164     plt.pie(data, labels=labels, autopct='%1.1f%%')
165     plt.title('番劇收藏數占比')
166     plt.savefig('番劇收藏數占比.jpg')
167     plt.show()
168 
169     
170 def rc():
171 # 分析兩組數據並畫散點圖和建立回歸方程
172     # 設置中文字體
173     plt.rcParams['font.sans-serif'] = ['SimHei']
174 
175     # 嵌套函數
176     # 需要擬合的函數func,指定函數的形狀
177     def func1(p, x):
178         a, b, c = p
179         return a * x * x + b * x + c
180 
181     # 偏差函數
182     def error1(p, x, y):
183         return func1(p, x) - y
184     df = pd.DataFrame(pd.read_excel('Dongman.xlsx'))
185     # 畫樣本圖像
186     plt.scatter(df['收藏數(萬)'], df['播放量(萬)'])
187 
188     # 設置樣本數據
189     X =df['收藏數(萬)'] / 10000
190     Y = df['播放量(萬)'] / 10000
191     plt.figure(figsize=(8, 6))
192 
193     # 設置函數擬合參數
194     p0 = [1, 15, 20]
195 
196     # 進行最小二乘擬合
197     para = leastsq(error1, p0, args=(X, Y))
198     a, b, c = para[0]
199 
200     # 讀取結果
201     print('a=', a, 'b=', b, 'c=', c)
202     print("求解的擬合直線為:")
203     print("y=" + str(round(a, 2)) + "x*x" + str(round(b, 2)) + "x+" + str(round(c, 2)))
204 
205     # 畫擬合曲線
206     plt.scatter(X, Y, color='green', label='樣本數據', linewidth=2)
207     x = np.linspace(1, 15, 20)
208     y = a * x * x + b * x + c
209     plt.plot(x, y, color='red', label='擬合曲線', linewidth=2)
210     plt.legend()
211     plt.title('')
212     plt.grid()
213     plt.show()
214 
215 
216 def main():
217     url = 'https://www.bilibili.com/v/popular/rank/bangumi'  # 網址
218     html = get_html(url)  # 獲取返回值
219     # print(html)
220     info = save(html)
221     view(info)
222     rc()
223 
224 
225 if __name__ == '__main__':
226     main()

(三)、總結與反思

1.總結

  (1)流行動漫中大部分以日漫為主,國漫極少;

   (2)多為異世界,玄幻為題材,紀實較少;

  (3)評論量與收藏量數據差異很大,導致無法做出合適的擬合分析;

2.課題總結與反思

    通過此次課程設計,使我更加扎實的掌握了python爬蟲方面的知識,在設計過程中雖然遇到了ー些問題,但經過一次又ー次的思考,一遍又一遍的檢查終於找出了原因所在,也暴露出了前期我在這方面的知識欠缺和經驗不足。實踐出真知,通過親自動手制作,使我們掌握的知識不再是紙上談兵,我會繼續加油!


免責聲明!

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



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