二次元属性被稀释,B站还剩什么?| 数据获取
本文為HeoiJin原創投稿文章,歡迎更多讀者投稿!
作者簡介
HeoiJin:立志透過數據看清世界的產品策劃、數據分析、產品策劃領域。
萬物皆營銷 | 資本永不眠 | 數據恒真理
CSDN:https://me.csdn.net/weixin_40679090
由于篇幅過大原因,文章將分為上篇與下篇:上篇為數據獲取,下篇為數據分析。今天為大家帶來的是上篇:獲取B站數據!
本篇目錄
一、項目背景
最近看了一篇對B站2019年數據解讀的文章,文章最后得出結論:B站的二次元屬性已被稀釋,逐漸走向大眾。
那么走過2020年的春節后,二次元屬性的稀釋情況如何?什么分區是B站的龍頭?b站的主流用戶喜歡什么標簽的視頻?各分區的情況能帶來什么社會價值?本項目將通過數據帶你一起窺探B站的變化。
項目特色:
利用Scrapy框架進行網頁獲取
利用pandas、numpy進行數據分析
利用pyecharts進行數據可視化
利用scipy進行相關性分析
二、工具和環境
語言:python 3.7
IDE:Pycharm
瀏覽器:Chrome
框架:Scrapy 1.8.0
三、需求分析
B站是我們熟悉的彈幕視頻分享網站,根據百度百科的資料顯示,B站的主要業務包括直播、游戲、廣告、電商、漫畫、電競。
在這么多項的業務當中,我們不難看到一個共同點,B站的主要盈利模式是高度依賴用戶,其次是主播和UP主。
因此要分析B站的變化,就要從用戶喜愛變化情況切入分析,本次項目將采集以下數據:
排行榜的分區名
排行頁:視頻的標題、作者、綜合評分、排名、視頻鏈接
詳情頁:視頻的播放量、三連量、評論量、彈幕量、轉發量、熱門標簽
四、頁面分析
4.1 排行榜頁解析
首先從排行榜頁面進行過分析。禁用Javascript后,發現要提取的信息都是在靜態網頁當中,那么在編寫代碼的時候通過xpath定位抓取信息即可。
完成單個分區排行榜頁面的分析后,只需找到各排行榜對應的url即可實現爬取多個分區。通過檢查網頁源碼,發現每一個分區都只有文字描述,并沒有相關的url,因此通過分析url變化再自行構造請求的url。
url規則即對應編號:https://www.bilibili.com/ranking/all/編號/0/30
以下是各分類對應的編號:
我們創建一個編號的列表,并用循環拼接url即可完成url的批量生成
from pprint import pprintlabels_num=[0,1,168,3,129,4,36,188,160,119,155,5,181] url_list=[f'https://www.bilibili.com/ranking/all/{i}/0/30' for i in labels_num]#利用pprint方法,我們能夠在輸出時實現一個url一行pprint(url_list)4.2 詳細信息頁面api解析
我們還需要獲取視頻的播放量、三連量、評論量、彈幕量、轉發量、熱門標簽,但在排行榜頁中并沒有體現,因此要進一步請求視頻的詳情頁。
進入視頻詳情頁,同樣禁用Javascript后,可以發現要找的信息都是ajax異步加載的,在這里考慮抓取api文件來獲取信息,這樣能夠大大提升解析網頁的效率,也不容易被封ip。
?
通過一輪的分析之后,找到了視頻的播放量、三連量、評論量、彈幕量、轉發量數據在stat?aid=文件當中,url末端的數字即視頻的id,后續對視頻鏈接進行切片獲取id再拼接Request URL即可。
訪問該Request URL,是標準的json數據。
對數據頁面進行json解析,后續只需獲得鍵:[‘data ‘]下的數據即可
?
到這里還缺少了熱門標簽的數據,繼續抓包找到另外一個api的url,同樣需要通過視頻的id進行url構造。
?但直接訪問這個url,會顯示要找的頁面不存在。觀察url發現,?后包含了很多參數,嘗試僅保留關鍵的視頻id參數再次訪問后,能夠獲取需要的信息。也是非常工整的json數據。
?
?解析json后,只需要獲取鍵[“data”]下的所有[‘tag_name ‘]即可。
?
至此所有需要的url及相關定位信息都基本找到,下面就可以開始編寫文件了。
五、分析
5.1 Scrapy框架概述
Scrapy是一個為了獲取網站數據,提取結構性數據而編寫的應用框架。可以應用在包括數據挖掘,信息處理或存儲歷史數據等一系列的程序中。
Scrapy架構圖(綠色箭頭為數據流向)
本次項目涉及的組件介紹
Scrapy Engine
引擎負責控制數據流在系統中所有組件中流動,并在相應動作發生時觸發事件。
調度器(Scheduler)
調度器從引擎接收request并將他們入隊,以便之后引擎請求他們時提供給引擎。
下載器(Downloader)
下載器負責獲取頁面數據并提供給引擎,而后提供給spider。
Spiders
Spider是Scrapy用戶編寫用于分析response并提取item(即獲取到的item)或額外跟進的URL的類。每個spider負責處理一個特定(或一些)網站。
Item Pipeline
Item Pipeline負責處理被spider提取出來的item。典型的處理有清理、 驗證及持久化(例如存取到數據庫中)
5.2 為什么用Scrapy框架
Scrapy 使用了異步網絡框架來處理網絡通訊。相比于普通的Request或者多線程,Scrapy在獲取頁面上具有更高的效率(詳細的效率比較可以看這篇《Python x蟲的N種姿勢》:https://www.cnblogs.com/jclian91/p/9799697.html)
同時完善的框架意味著只需要定制開發其中的模塊就能輕松實現,有清晰的邏輯路徑。
六、編寫
如果之前還沒有安裝Scrapy,可在cmd中使用pip語句進行安裝
pip3 install Scrapy6.1 新建項目
去到要新建文件的文件夾中,在地址欄輸入cmd,進入cmd模式。
scrapy startproject blbl cd blbl scrapy genspider bl "bilibili.com"命令解讀:
scrapy startproject blbl:創建項目,項目文件命名為blbl
sd blbl :進入項目文件
scrapy genspider bl “bilibili.com” :創建文件,名為bl(注意名應有別于項目文件名,且在該項目中是唯一的),限定獲取的url范圍”bilibili.com”
到這里我們創建就完成了,目錄結構如下:
簡單介紹下本項目所需文件的作用:
scrapy.cfg :項目的配置文件
blbl/blbl :項目的Python模塊,將會從這里引用代碼
items.py :項目的目標文件
pipelines.py :項目的管道文件
settings.py :項目的設置文件
spiders/ :存儲獲取代碼目錄
bl.py :我們通過命令新建的文件
6.2 創建并編寫start.py
通常啟動Scrapy都是在shell或者cmd命令中進行。為了方便啟動或者進行debug測試,創建一個start.py用來控制啟動
目標:
在py文件中執行cmd命令
創建完成后,我們每次運行或者debug測試時,只需要執行這個文件即可。
6.3 編寫settings.py
目標:
關閉遵循君子協議
設置延遲(好的程序不應對別人服務器造成過大壓力)
構造請求頭
打開Pipeline(用于儲存數據,取消注釋即可)
6.4 編寫bl.py
bl.py是我們通過cmd的命令符創建的文件,主要用于解析網站內容,并將解析后的數據傳給items pipeline。
目標:
獲得排名、視頻標題、作者、得分
獲得視頻id,構造api鏈接
向api鏈接發送請求
獲得三連、彈幕、評論和熱門標簽等數據
6.5 編寫Items.py
將爬取到的數據名稱按照Scrapy的模板填寫好即可
目標:
收集爬取到數據
6.6 編寫pipeline.py
運用scrapy原生的CsvItemExporter能夠讓我們從編寫表頭以及寫writerow語句中解放出來,比傳統寫入csv的方法更簡便。
目標:
利用CsvItemExporter把數據寫入csv文件
最后打開bilibili.csv,可以看到數據都完整爬取下來了!
七、本篇小結
最后回顧下本次的重點內容:
對ajax異步加載的網頁進行抓包,通過抓取Request URL訪問異步加載數據
使用Scrapy框架進行數據采集
利用scrapy.Request向api發送請求并通過meta傳遞已獲取的排行頁數據
利用Scrapy內置的CsvItemExporter將數據存儲到csv中
下周二將推出本篇文章的下部分:數據分析實戰環節,敬請期待吧~
源碼地址(或閱讀原文):https://github.com/heoijin/Bilibili-Rnak
鄭重聲明:本項目及所有相關文章,僅用于經驗技術交流,禁止將相關技術應用到不正當途徑,因為濫用技術產生的風險與本人無關
熱門文章
直戳淚點!數據從業者權威嘲諷指南!
數據分析師做成了提數工程師,該如何破局?
全棧型VS專精型,團隊到底需要什么樣的人?
數據驅動業務,比技術更重要的是思維的轉變
最近面了十多個數據分析師,聊一聊我發現的一些問題
總結
以上是生活随笔為你收集整理的二次元属性被稀释,B站还剩什么?| 数据获取的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [摘录]谁说大象不能跳舞目录
- 下一篇: stm32f103c8t6通过max31