爬取嗶哩嗶哩番劇排行榜


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

1.爬蟲名稱:爬取嗶哩嗶哩番劇排行榜

2.爬取內容:爬取番劇名稱、播放量、評論數、喜歡人數、綜合得分。爬取網站:"https://www.bilibili.com/ranking/bangumi/13/0/3"

3.網絡爬蟲設計方案概述:

思路:通過分析網頁源代碼,找出數據所在的標簽,通過爬蟲讀取數據保存到csv文件中,讀取文件,對數據進行清洗和處理,數據分析與可視化處理。

技術難點:信息處理知識掌握不夠全面以及在同一標簽下信息的分離

通過命名將混合在一起的三個數據分散開

在將文件進行以csv形式保存並清洗數據

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

打開F12進行尋找我們需要的信息,發現要爬取數據都分布在標簽div  class “info”里面。播放量、評論數、喜歡人數都在span class "data-box"里面,綜合得分在div class "pts"里面

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

2.Htmls頁面解析

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

三、網絡爬蟲程序設計

全部代碼

  1 import numpy as np
  2 import matplotlib.pyplot as plt
  3 import matplotlib as mpl
  4 from scipy.optimize import leastsq 
  5 import requests
  6 from bs4 import BeautifulSoup
  7 import pandas as pd
  8 import csv
  9 import jieba
 10 import wordcloud
 11 import requests
 12 from bs4 import BeautifulSoup
 13 import pandas as pd
 14 
 15 
 16 url="https://www.bilibili.com/ranking/bangumi/13/0/3"#嗶哩嗶哩番劇排行榜
 17 #偽裝爬蟲
 18 headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/69.0.3497.100 Safari/537.36'}
 19 
 20 #請求網站
 21 r=requests.get(url)
 22 
 23 r.encoding=r.apparent_encoding
 24 
 25 #獲取源代碼
 26 x=r.text
 27 
 28 #構造Soup的對象
 29 soup=BeautifulSoup(x,'lxml')
 30 
 31 #進行信息的分離
 32 a=[]
 33 b=[]
 34 s=[]
 35 d=[]
 36 e=[]
 37 
 38 one=soup.find_all(class_="title")
 39 
 40 for i in range(20):
 41     a.append(one[i].text)  
 42 
 43 
 44 two=soup.find_all(class_="data-box")
 45 
 46 for i in range(0,60,3):
 47     b.append(two[i].text)
 48 for i in range(1,60,3):
 49     s.append(two[i].text)
 50 for i in range(2,60,3):
 51     d.append(two[i].text)
 52 
 53 three=soup.find_all(class_="pts")
 54 for i in range(20):
 55     e.append(three[i].text)
 56     
 57 lt=[]
 58 for i in range(20):
 59     lt.append([a[i],b[i],s[i],d[i],e[i]])
 60 
 61 h=pd.DataFrame(lt,columns=["番劇名稱","播放量","評論數","喜歡人數","綜合得分"])
 62 
 63 #print(h)
 64 
 65 #保存文件,數據持久化
 66 h.to_csv('嗶哩嗶哩番劇排行榜.csv') 
 67 
 68 df = pd.DataFrame(pd.read_csv('嗶哩嗶哩番劇排行榜.csv'))
 69 
 70 #print(df)
 71 df.head()
 72 
 73 df.drop('評論數',axis=1,inplace=True)
 74 
 75 df.drop('番劇名稱',axis=1,inplace=True)
 76 
 77 df.drop('綜合得分',axis=1,inplace=True)
 78 
 79 df.head()
 80 
 81 #檢查是否有重復值
 82 df.duplicated()
 83 
 84 #缺失值處理
 85 df[df.isnull().values==True]#返回無缺失值
 86 
 87 #用describe()命令顯示描述性統計指標
 88 df.describe()
 89 
 90 plt.rcParams['axes.unicode_minus']=False #用來正常顯示負號
 91 
 92 plt.bar(df.播放量, df.喜歡人數, label="柱狀圖")
 93 
 94 plt.xlabel("播放量")
 95 
 96 plt.ylabel("喜歡人數")
 97 plt.title('播放量與喜歡人數柱狀圖')
 98 plt.show()
 99 
100 
101 
102 #繪制散點圖
103 def scatter():
104     plt.scatter(df.喜歡人數, df.播放量, color='green', s=25, marker="o")
105     plt.xlabel("喜歡人數")
106     plt.ylabel("播放量")
107     plt.title("排名與評分散點圖")
108     plt.show()
109 scatter()
110 
111 
112 #繪制折線圖
113 def line_diagram():
114     x = df['播放量']
115     y = df['喜歡人數']
116     plt.xlabel('播放量')
117     plt.ylabel('喜歡人數')
118     plt.plot(x,y)
119     plt.scatter(x,y)
120     plt.title("播放量與喜歡人數折線圖")
121     plt.show()
122 line_diagram()
123 
124 #繪制箱體圖
125 import pandas as pd
126 
127 from matplotlib import  pyplot as plt
128 
129 import seaborn as sns
130 
131 plt.rcParams['font.sans-serif']=['STSong']
132 
133 file_path = "嗶哩嗶哩番劇排行榜.csv"
134 
135 df = pd.DataFrame(pd.read_csv(file_path,names=["番劇名稱","播放量","評論數","喜歡人數","綜合得分"]))
136 
137 plt.figure(figsize=(10, 8))
138 
139 plt.title('播放量與喜歡人數箱體圖')
140 
141 sns.boxplot(x='q播放量',y='喜歡人數', data=df)
142 
143 
144 #繪制一元一次回歸方程
145 
146 def main():
147     colnames = ["番劇名稱","播放量","評論數","喜歡人數","綜合得分"]
148     df = pd.read_csv('嗶哩嗶哩番劇排行榜.csv',skiprows=1,names=colnames)
149     X = df.播放量
150     Y = df.喜歡人數
151     
152     def func(p, x):
153         k, b = p
154         return k * x + b
155     
156     def error_func(p, x, y):
157         return func(p,x)-y
158     
159     p0 = [0,0]
160     #使用leastsq()函數對數據進行擬合
161     Para = leastsq(error_func, p0, args = (X, Y))
162     k, b = Para[0]
163     print("k=",k,"b=",b)
164     
165     plt.figure(figsize=(10,6))
166     plt.scatter(X,Y,color="green",label=u"評分分布",linewidth=2)
167     x=np.linspace(0,30,30)
168     y=k*x+b
169     plt.plot(x,y,color="red",label=u"回歸方程直線",linewidth=2) 
170     
171     plt.title("播放量與喜歡人數關系圖")
172     plt.xlabel('播放量')
173     plt.ylabel('喜歡人數')
174     plt.legend() 
175     plt.show()
176 
177     
178 main()
179 
180 
181 #繪制一元二次回歸方程
182 def main2():
183     colnames = ["番劇名稱","播放量","評論數","喜歡人數","綜合得分"]
184     df = pd.read_csv('嗶哩嗶哩番劇排行榜.csv',skiprows=1,names=colnames)
185     
186     X = df.排名
187     Y = df.評分
188     r=sts.pearsonr(X,Y) #相關性r
189     print('相關性r',r)
190     def func(p, x):
191         a, b, c = p
192         return a * x * x + b * x + c
193     
194     def error_func(p, x, y):
195         return func(p,x)-y
196     
197     p0 = [0,0,0]
198    
199     #使用leastsq()函數對數據進行擬合
200     Para = leastsq(error_func, p0, args = (X, Y))
201     a, b, c = Para[0]
202     print("a=", a,"b=", b,"c=", c)
203     
204     plt.figure(figsize=(10,6))
205     plt.scatter(X,Y,color="green",label=u"評分分布",linewidth=2)
206     
207     x = np.linspace(0,30,30)
208     y = a * x * x + b * x + c
209     
210     plt.plot(x,y,color="red",label=u"一元二次回歸方程直線",linewidth=2) 
211     plt.title("播放量和喜歡人數關系圖")
212     plt.xlabel('播放量')
213     plt.ylabel('喜歡人數')
214     plt.legend() 
215     plt.show()
216 
217     
218 main2()


免責聲明!

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



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