一.主題式網絡主題式網絡爬蟲設計方案
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()