1. 程式人生 > >如何利用Python快速爬取B站全站視訊資訊

如何利用Python快速爬取B站全站視訊資訊

B 站我想大家都熟悉吧,其實 B 站的爬蟲網上一搜一大堆。不過 紙上得來終覺淺,絕知此事要躬行,我碼故我在。最終爬取到資料總量為 760萬 條。

準備工作

首先開啟 B 站,隨便在首頁找一個視訊點選進去。常規操作,開啟開發者工具。這次是目標是通過爬取 B 站提供的 api 來獲取視訊資訊,不去解析網頁,解析網頁的速度太慢了而且容易被封 ip。

勾選 JS 選項,F5 重新整理

找到了 api 的地址

複製下來,去除沒必要的內容,得到 https://api.bilibili.com/x/web-interface/archive/stat?aid=15906633 ,用瀏覽器開啟,會得到如下的 json 資料

動手寫碼

好了,到這裡程式碼就可以碼起來了,通過 request 不斷的迭代獲取資料,為了讓爬蟲更高效,可以利用多執行緒。

核心程式碼

 
  1. result = [] 
  2. req = requests.get(url, headers=headers, timeout=6).json() 
  3. time.sleep(0.6)     # 延遲,避免太快 ip 被封 
  4. try: 
  5.     data = req['data'] 
  6.     video = Video( 
  7.         data['aid'],        # 視訊編號 
  8.         data['view'],       # 播放量 
  9.         data['danmaku'],    # 彈幕數 
  10.         data['reply'],      # 評論數 
  11.         data['favorite'],   # 收藏數 
  12.         data['coin'],       # 硬幣數 
  13.         data['share']       # 分享數 
  14.     ) 
  15.     with lock: 
  16.         result.append(video) 
  17. except: 
  18.     pass 

迭代爬取

 
  1. urls = ["http://api.bilibili.com/archive_stat/stat?aid={}".format(i)  
  2.     for i in range(10000)] 
  3.  with futures.ThreadPoolExecutor(32) as executor:    # 多執行緒 
  4.      executor.map(run, urls) 

不要一次性爬取全部連結,我是利用兩個程序,這樣就是多程序+多執行緒了。一個程序一次大概爬取 50w 條資料。100w 條資料的話大概一個多小時吧。分多次爬取,分別將資料儲存為不同的檔名,最後再彙總。

執行的效果大概是這樣的,數字是已經已經爬取了多少條連結,其實完全可以在一天或者兩天內就把全站資訊爬完的。

至於爬取後要怎麼處理就看自己愛好了,我是先儲存為 csv 檔案,然後再彙總插入到資料庫。

彙總的 csv 檔案

資料庫表

由於這些內容是我在幾個月前爬取的,所以資料其實有些滯後了。

資料總量

查詢播放量前十的視訊

查詢回覆量前十的視訊