菜鳥弟弟從零開始的爬取Bilibili彈幕的Python爬蟲教程-嗶哩嗶哩 - ( ゜- ゜)つロ 乾杯~

從零開始的爬取Bilibili彈幕的Python爬蟲教程

或許可以作爲一個爬蟲小白的練手的demo?

還是先看看什麼是爬蟲吧!(還有Bilibili!

網絡爬蟲:
網絡爬蟲(又稱爲網頁蜘蛛,網絡機器人,在FOAF社區中間,更經常的稱爲網頁追逐者),是一種按照一定的規則,自動地抓取萬維網信息的程序或者腳本。另外一些不常使用的名字還有螞蟻、自動索引、模擬程序或者蠕蟲。-----百度百科

B站:
嗶哩嗶哩(Nasdaq:BILI ;英文名稱:bilibili,簡稱B站)現爲中國年輕世代高度聚集的文化社區和視頻平臺 ,該網站於2009年6月26日創建,被粉絲們親切的稱爲“B站”。2018年3月28日,嗶哩嗶哩在美國納斯達克上市 。
B站早期是一個ACG(動畫、漫畫、遊戲)內容創作與分享的視頻網站 。經過十年多的發展,圍繞用戶、創作者和內容,構建了一個源源不斷產生優質內容的生態系統 ,B站已經涵蓋7000多個興趣圈層的多元文化社區 。
2019年4月22日,針對“後臺源碼泄露”一事,B站做出迴應:經內部緊急覈查,確認該部分代碼屬於較老的歷史版本;5月29日,嗶哩嗶哩發佈通知稱,因彈幕系統技術升級,5月29日起至6月6日網站暫時關閉彈幕功能。
截至2019年第三季度,B站月均活躍用戶達1.28億,移動端月活用戶達1.14億 ;18至35歲用戶佔比達78%。
2020年1月9日,胡潤研究院發佈《2019胡潤中國500強民營企業》,嗶哩嗶哩位列第180位。

爬蟲的背景

隨着網絡的迅速發展,萬維網成爲大量信息的載體,如何有效地提取並利用這些信息成爲一個巨大的挑戰。搜索引擎(Search Engine),例如傳統的通用搜索引擎AltaVista,Yahoo!和Google等,作爲一個輔助人們檢索信息的工具成爲用戶訪問萬維網的入口和指南。但是,這些通用性搜索引擎也存在着一定的侷限性,如:
(1)不同領域、不同背景的用戶往往具有不同的檢索目的和需求,通過搜索引擎所返回的結果包含大量用戶不關心的網頁。
(2)通用搜索引擎的目標是儘可能大的網絡覆蓋率,有限的搜索引擎服務器資源與無限的網絡數據資源之間的矛盾將進一步加深。
(3)萬維網數據形式的豐富和網絡技術的不斷髮展,圖片、數據庫、音頻、視頻多媒體等不同數據大量出現,通用搜索引擎往往對這些信息含量密集且具有一定結構的數據無能爲力,不能很好地發現和獲取。
(4)通用搜索引擎大多提供基於關鍵字的檢索,難以支持根據語義信息提出的查詢。
爲了解決上述問題,定向抓取相關網頁資源的聚焦爬蟲應運而生。聚焦爬蟲是一個自動下載網頁的程序,它根據既定的抓取目標,有選擇的訪問萬維網上的網頁與相關的鏈接,獲取所需要的信息。與通用爬蟲(general purpose web crawler)不同,聚焦爬蟲並不追求大的覆蓋,而將目標定爲抓取與某一特定主題內容相關的網頁,爲面向主題的用戶查詢準備數據資源。
1 聚焦爬蟲工作原理以及關鍵技術概述
網絡爬蟲是一個自動提取網頁的程序,它爲搜索引擎從萬維網上下載網頁,是搜索引擎的重要組成。傳統爬蟲從一個或若干初始網頁的URL開始,獲得初始網頁上的URL,在抓取網頁的過程中,不斷從當前頁面上抽取新的URL放入隊列,直到滿足系統的一定停止條件。聚焦爬蟲的工作流程較爲複雜,需要根據一定的網頁分析算法過濾與主題無關的鏈接,保留有用的鏈接並將其放入等待抓取的URL隊列。然後,它將根據一定的搜索策略從隊列中選擇下一步要抓取的網頁URL,並重覆上述過程,直到達到系統的某一條件時停止。另外,所有被爬蟲抓取的網頁將會被系統存貯,進行一定的分析、過濾,並建立索引,以便之後的查詢和檢索;對於聚焦爬蟲來說,這一過程所得到的分析結果還可能對以後的抓取過程給出反饋和指導。
相對於通用網絡爬蟲,聚焦爬蟲還需要解決三個主要問題:
(1) 對抓取目標的描述或定義;
(2) 對網頁或數據的分析與過濾;
(3) 對URL的搜索策略。
----(百度百科)

該說正事了!

①第一步:這樣這樣
②第二部:那樣那樣
③第三步:run起來了
④第四步:完工

皮一下很開心kkkkkk

來看真正的過程。
或許網絡上的各種爬蟲會用到許多不同的第三方庫,但離不開的還是requests庫和re庫->正則表達式。
此外這裏還要用到json庫。

import json
import re  #正則表達式
import requests	#用來獲取源碼得到請求響應的 response

開始就要模擬瀏覽器的請求,僞裝成在使用瀏覽器瀏覽網頁的亞子。

# 下載頁面
def downloadPage(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'
    }	#配置請求頭,User-Agent:瀏覽器代理(把自己僞裝成瀏覽器請求)
    res = requests.get(url=url, headers=headers)
    return res  #返回響應

可是彈幕都在哪呢?

目前網上很多爬蟲是靜態頁面的爬蟲,類似爬取小說的內容這類,不過現在一大部分是動態的爬蟲,比如我們要做的B站彈幕的爬取,而B站的網頁打開後又會產生超級多眼花繚亂的request和response。
在這裏插入圖片描述不過問題不大,包含着彈幕的response就是這個帶着像是FPS遊戲裏準星一樣的response!
在這裏插入圖片描述
把它打開康康?
在這裏插入圖片描述
雖然這裏有很多亂七八糟的東西,不過不用在意太多,我們瞄準第一行的URL!把ta複製,然後在瀏覽器裏訪問一下。是這個xml文件沒錯了!(看看非酋們的彈幕?
在這裏插入圖片描述
可是B站怎麼獲取到的彈幕呢?這時再來看另一個response
在這裏插入圖片描述
在這裏插入圖片描述
就在包含着彈幕的response的上面不遠處就有一個pagelist開頭的部分這裏的aid號碼和av號是對應的!
而從他的Preview中可以發現,裏面的cid號碼和包含彈幕的文件裏的oid信息也是一樣的!
綜上可以得出,這個過程類似於,請求->pagelist巴拉巴拉->aid->cid->oid->彈幕。

開始肝代碼

首先的任務就是獲取cid,如下

def get_cid(av):
    av = av.strip('av')
    url = f'https://api.bilibili.com/x/player/pagelist?aid={av}&jsonp=jsonp'	#根據av號獲取cid,aid號碼和av號相同,所以可以直接使用
    res = downloadPage(url)
    res_text = res.text	#獲取源碼!
    res_dict = json.loads(res_text)
    cid = res_dict['data'][0]['cid']
    return cid

這之後就要根據cid請求彈幕

# 根據cid請求彈幕
def get_dan_mu(cid):
    url = f'https://api.bilibili.com/x/v1/dm/list.so?oid={cid}'
    res = downloadPage(url)
    res_xml = res.content.decode('utf-8') #因爲是中文所以需要設置編碼格式防止亂碼
    pattern = re.compile('<d.*?>(.*?)</d>') #這裏用到了正則表達式,來獲取我們需要的那一部分內容
    dan_mu_list = pattern.findall(res_xml)
    return dan_mu_list #返回彈幕列表

最後就是要把彈幕寫進我們的文件裏!這個就很簡單了

# 把彈幕寫入到文件中
def save_to_file(dan_mu_list, filename):
	#filename是保存文件的名稱,dan_mu_list就是彈幕列表嘛
    with open(filename, mode='w', encoding='utf-8') as f:
        for one_dan_mu in dan_mu_list:
            f.write(one_dan_mu)
            f.write('\n') #寫入的時候別忘記了回車

主函數

def main(av):
    # 根據視頻av號獲得cid
    cid = get_cid(av)
    # 根據cid爬取彈幕
    dan_mu_list = get_dan_mu(cid)
    # 把彈幕寫入到文件中
    save_to_file(dan_mu_list, f'{av}.txt')

if __name__ == '__main__':
    av = 'avxxxxxxxxx' #"xxxxxxxxx"就是你想要收集彈幕的視頻的av號
    dan_mu_spider(av)

源代碼合併起來就是下面這樣,總的來說還是非常好理解的,參考了不少CSDN大佬和B站的爬蟲入門視頻,Computer Science實在是高深,繼續努力吧

import json
import re
import requests

# 下載頁面
def download_page(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'
    }
    res = requests.get(url=url, headers=headers)
    return res

def get_cid(av):
    av = av.strip('av')
    url = f'https://api.bilibili.com/x/player/pagelist?aid={av}&jsonp=jsonp'
    res = download_page(url)
    res_text = res.text
    res_dict = json.loads(res_text)
    cid = res_dict['data'][0]['cid']
    return cid

# 根據cid請求彈幕
def get_dan_mu(cid):
    url = f'https://api.bilibili.com/x/v1/dm/list.so?oid={cid}'
    res = download_page(url)
    res_xml = res.content.decode('utf-8')
    pattern = re.compile('<d.*?>(.*?)</d>')
    dan_mu_list = pattern.findall(res_xml)
    return dan_mu_list

# 把彈幕寫入到文件中
def save_to_file(dan_mu_list, filename):
    with open(filename, mode='w', encoding='utf-8') as f:
        for one_dan_mu in dan_mu_list:
            f.write(one_dan_mu)
            f.write('\n')

# 彈幕爬蟲主流程
def main(av):
    # 根據視頻av號獲得cid
    cid = get_cid(av)
    # 根據cid爬取彈幕
    dan_mu_list = get_dan_mu(cid)
    # 把彈幕寫入到文件中
    save_to_file(dan_mu_list, f'{av}.txt')

if __name__ == '__main__':
    av = 'av77794648'
    main(av)

最後結果就是這樣的
在這裏插入圖片描述
爬蟲成功!奇怪的知識增加了!考慮之後再出一個生成詞雲的教程。
在這裏插入圖片描述
有喜歡的可以加個關注或者B站加個關注吧,本菜鳥陸續會上傳一些自制的編程的視頻,哈哈哈哈哈就是不知道這麼多大佬看不看得上啦!做的不好的還請不要噴
在這裏插入圖片描述
最後說一下,如果實在是求速度的,可以直接使用Python的you-get庫爬取彈幕、下載視頻,而且應用的範圍也非常廣,特別方便。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章