爬取B站熱門視頻排行榜


一、主題式網絡爬蟲設計方案
1.主題式網絡爬蟲名稱:爬取B站熱門視頻排行榜
2.主題式網絡爬蟲爬取的內容:統計所有投稿視頻的數據綜合得分,每日更新數據(作品,播放量,彈幕,作者)

3.主題式網絡爬蟲設計方案概述:找到網站地址,分析網站源代碼,找到自己所需要的數據所在的位置,提取數據,進行數據整理,數據可視化等操作

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

找到我們需要的數據,進行找查定位

 

 

 

 

 

 

 

 

 

 我們需要的內容分別藏在'a',class_="title",'span',class_="data-box",'div',class_="pts"里面

三、網絡爬蟲程序設計

1.數據爬取與采集

首先爬取網頁通用框架

 

 

 測試爬取的內容

 

 

 然后再將內容進行解析

 

 

 

 

 

 測試解析的內容

 

 

 

分析之前的網頁源碼

 

 

 嘗試把我們需要的內容打印出來

 

 

 沒問題后將剛剛的步驟打包

 

 

 其他需要爬取的數據同理

 

 大部分整理完后進行細分

 

 整理完全部數據之后導出excel文件方便查看

 

 

 

 

數據整理完畢、開始進行數據可視化

 

畫出柱狀圖和散點圖

 

 

輸出結果

 

 

建立變量之間的回歸方程

 

 輸出結果

 

 

四.

附上完整程序代碼

#導入需要用到的模塊
import requests import bs4 import re import matplotlib.pyplot
as plt import seaborn as sns import pandas as pd plt.rcParams['font.sans-serif']=['SimHei']#用來正常顯示中文 plt.rcParams['axes.unicode_minus']=False#用來正常顯示負號 def get_url(url):#獲取網頁內容 #偽裝用戶 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3706.400 SLBrowser/10.0.4040.400'} try: #嘗試獲取網頁 f = requests.get(url,headers = headers) #如果狀態碼不是200則引發異常 f.raise_for_status() #編碼 f.encoding = f.apparent_encoding #返回獲取的網頁 return f.text except: #狀態碼不是200打印產生異常 print('產生異常') def bs(text): #將讀取到的網頁解析 soup = bs4.BeautifulSoup(text,'html.parser') return soup def cont_ent(soup): #提取排行前100的標題 m = soup.find_all('a',class_="title") n=[] for i in m: n.append(i.text) return (n)#整理成列表 def cont_ent2(soup): #提取播放量,彈幕,作者 x = soup.find_all('span',class_="data-box") n=[] for i in x: n.append(i.text) return (n)#整理成列表 def cont_ent3(soup): #提取綜合得分 k = soup.find_all('div',class_="pts") n=[] for i in k: #因為分數沒有過千萬的所以可以搜集千萬以內的數字 c=re.search('\d?\d?\d?\d?\d?\d?\d?\d?',i.text) n.append(eval(c.group())) return (n)#整理成列表 #把之前提取播放量,彈幕,作者再進行整理 def bofang(cone):#播放量 m=3 n=[] for i in cone: if m%3==0: n.append(i) m+=1 return n def danmu(cone):#彈幕 m=2 n=[] for i in cone: if m%3==0: n.append(i) m+=1 return n def zuozhe(cone):#作者 m=1 n=[] for i in cone: if m%3==0: n.append(i) m+=1 return n def main(): #嗶哩嗶哩熱搜視頻排行鏈接 url = 'https://www.bilibili.com/ranking?' #獲取網頁 some = get_url(url) #解析網頁 soup = bs(some) '''with open('try2.txt','w',encoding='utf-8') as f: f.write(soup.text)#測試寫代碼過程中是否出錯''' #數據處理 #提取標題 title = cont_ent(soup) #提取播放量,彈幕,作者 cone = cont_ent2(soup) #提取綜合得分 score = cont_ent3(soup) ''' with open('title.txt','w',encoding='utf-8') as f: for i in title: f.write(str(title.index(i)+1)+'.') f.write(i) f.write('\n') with open('cone.txt','w',encoding='utf-8') as f: for i in cone: f.write(i) f.write('\n') with open('score.txt','w',encoding='utf-8') as f: for i in score: f.write(i) f.write('\n') ''' #導出數據查看是否有誤 bfl = bofang(cone) dm = danmu(cone) zz = zuozhe(cone) df = pd.DataFrame({'排名':range(1,101),'標題':title,'播放量':bfl,'彈幕量':dm,'作者':zz,'綜合得分':score}) df.to_excel('b站熱門視頻排行前100.xlsx') #因數據太多所以挑排名前幾的作圖 #柱狀圖 plt.bar(range(1,21),score[:20]) plt.xlabel('排名') plt.ylabel('綜合得分') plt.title('前幾名的綜合得分柱狀圖') plt.show() #散點圖 plt.scatter(range(1,21),score[:20]) plt.xlabel('排名') plt.ylabel('綜合得分') plt.title('前幾名的綜合得分柱狀圖') plt.show() #回歸分析 file_path = "b站熱門視頻排行前100.xlsx" dataf = pd.read_excel(file_path) sns.lmplot(x='排名',y='綜合得分',data=dataf) main()

 

 

五、結論

1.排行是通過綜合得分來進行排行,彈幕和播放量有一定的影響,吸引人的標題和視頻的質量才是決定的關鍵

2.能夠鞏固之前學到的新知識,最好每隔一段時間前來復習一遍,網絡爬蟲很有趣。


免責聲明!

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



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