1. 程式人生 > 實用技巧 >爬取b站《守護解放西》彈幕

爬取b站《守護解放西》彈幕

此文轉載自:https://blog.csdn.net/xtreallydance/article/details/112399856#commentBox

守護解放西,失控與自控

最近在b站追一部名為"守護解放西"的紀錄片,主要是記錄以長沙坡子街派出所為核心的核心商圈城市警察的日常工作,因為這部紀錄片蠻火的,然後那個彈幕也是挺多的,恰好最近自己在學爬蟲,想著能不能把b站這部好看又有價值的紀錄片彈幕爬取下來!

這次爬取的核心過程步驟大致可以列為:

  1. 找到彈幕資訊存放的api介面
  2. 對介面進行分析,然後將想要獲得的彈幕資訊爬取下來
  3. 最終對資訊進行持久化儲存,可以存放為csv形式,也能是txt文字形式

本次爬取所需用到的爬蟲模組主要為: r e q u e s t s requests

requests模組

記住,先要載入那個彈幕列表的資訊,選擇日期,如下圖所示!否則等下找api的時候介面有可能找不到

好!首先讓我們一起來找api介面,首先按下F12或者右鍵檢查元素,然後點選到NetWork,進入到如下所示的介面;

  • 首先按下ctrl + F, 輸入history
  • 找到api介面,如下圖所示


將介面的url複製下來為:

https://api.bilibili.com/x/v2/dm/history?type=1&oid=260418892&date=2021-01-04

複製到瀏覽器網址裡面,發現真的就是我們想要獲取到的彈幕資訊介面!如下圖所示:

以上操作,讓我們找到了彈幕資訊所在網址的api介面,然後我通過分析發現,這個彈幕資訊都儲存在一個標籤<d裡面,如下圖:

下面讓我們開始寫程式碼進行愉快的資料爬取吧!

import requests
from bs4 import BeautifulSoup


# ua偽裝
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.66',
    "cookie": "_uuid=A366B5AD-0770-4D1E-F71B-2587760CAC6094820infoc; buvid3=8F1DB121-7BFB-4923-B5FA-9306898396A3143073infoc; sid=joozhe7k; DedeUserID=475936847; DedeUserID__ckMd5=ad02dfc55e996305; SESSDATA=988c9033%2C1613607061%2C29c31*81; bili_jct=974f12a39465683da26ee0da6ac4f5e1; rpdid=|(YuJ~|kJkk0J'ulm)|ll|)l; blackside_state=1; CURRENT_FNVAL=80; LIVE_BUVID=AUTO8615998250958107; fingerprint3=4517ff2ee6999d14f1b6c58b6b8256c3; fingerprint=00c1dd6c5cd06dc20c37736594a5e450; buivd_fp=8F1DB121-7BFB-4923-B5FA-9306898396A3143073infoc; buvid_fp_plain=8F1DB121-7BFB-4923-B5FA-9306898396A3143073infoc; fingerprint_s=7f4554ba1eba2e3390474eb2c577c79d; CURRENT_QUALITY=0; PVID=1; bsource=search_sougo; bfe_id=fdfaf33a01b88dd4692ca80f00c2de7f"
} # api 介面 url = 'https://api.bilibili.com/x/v2/dm/history?type=1&oid=260418892&date=2021-01-04' # 發起請求 response = requests.get(url=url, headers=headers) # 編碼 response.encoding = response.apparent_encoding # 獲取文字資訊 content = response.text # 列印文字資訊 # print(content) # 熬湯,bs4解析的常用說法 soup = BeautifulSoup(content, 'lxml') # 找到所有的d標籤 d_list = soup.find_all('d') # 列印p標籤的列表 # print(d_list) # 彈幕列表承接資訊 dm_list = [] # 變數每個d標籤,獲取d標籤內容 for d in d_list: # 將每一條彈幕資訊儲存到dm_list列表中 dm_list.append(d.string) # 然後將資訊進行持久化儲存 with open('./解放西彈幕.txt', 'w', encoding='utf-8') as f: for dm in dm_list: f.write(dm) f.write('\n')

爬取的結果儲存到了解放西彈幕.txt文字中,如下圖所示:

  • 上述程式碼僅僅只是將一個api介面爬取了下來,但是彈幕資訊肯定不僅僅存在於一個介面當中,通過對介面進行分析我發現,有一個date引數,不同的date引數api內部的介面不同,date的意思就是日期,意味著不同的日期彈幕資訊不同吧!
  • 下面我們重構程式碼,讓其能夠爬取多個api介面,程式碼如下:
import requests
from bs4 import BeautifulSoup
import pandas


def get_info(date):
    # ua偽裝
    # cookie要填入你自己本人登入b站的cookie,找到後複製貼上上來就行
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.66',
        "cookie": "_uuid=A366B5AD-0770-4D1E-F71B-2587760CAC6094820infoc; buvid3=8F1DB121-7BFB-4923-B5FA-9306898396A3143073infoc; sid=joozhe7k; DedeUserID=475936847; DedeUserID__ckMd5=ad02dfc55e996305; SESSDATA=988c9033%2C1613607061%2C29c31*81; bili_jct=974f12a39465683da26ee0da6ac4f5e1; rpdid=|(YuJ~|kJkk0J'ulm)|ll|)l; blackside_state=1; CURRENT_FNVAL=80; LIVE_BUVID=AUTO8615998250958107; fingerprint3=4517ff2ee6999d14f1b6c58b6b8256c3; fingerprint=00c1dd6c5cd06dc20c37736594a5e450; buivd_fp=8F1DB121-7BFB-4923-B5FA-9306898396A3143073infoc; buvid_fp_plain=8F1DB121-7BFB-4923-B5FA-9306898396A3143073infoc; fingerprint_s=7f4554ba1eba2e3390474eb2c577c79d; CURRENT_QUALITY=0; PVID=1; bsource=search_sougo; bfe_id=fdfaf33a01b88dd4692ca80f00c2de7f"
    }
    # api 介面
    url = 'https://api.bilibili.com/x/v2/dm/history?type=1&oid=260418892&date={}'.format(date)
    print(url)
    # 發起請求
    response = requests.get(url=url, headers=headers)
    # 編碼
    response.encoding = response.apparent_encoding
    # 獲取文字資訊
    content = response.text
    # 列印文字資訊
    # print(content)
    # 熬湯,bs4解析的常用說法
    soup = BeautifulSoup(content, 'lxml')
    # 找到所有的d標籤
    d_list = soup.find_all('d')
    # 列印p標籤的列表
    # print(d_list)
    # 彈幕列表承接資訊
    dm_list = []
    # 變數每個d標籤,獲取d標籤內容
    for d in d_list:
        # 將每一條彈幕資訊儲存到dm_list列表中
        dm_list.append(d.string)

    # 然後將資訊進行持久化儲存
    with open('./解放西彈幕_all.txt', 'a', encoding='utf-8') as f:
        for dm in dm_list:
            f.write(dm)
            f.write('\n')


if __name__ == '__main__':
    date_start = input('輸入你想要的開始的時間,格式為: 2021-01-04: ')
    date_end = input('輸入你想要結束的時間, 格式為: 2021-01-07: ')
    # 調一下如期格式如: 2021-01-04 
    date_list = pandas.date_range(start=date_start, end=date_end).strftime("%Y-%m-%d")
    for date in date_list:
        get_info(date)

'''
結果如下: 
輸入你想要的開始的時間,格式為: 2021-01-04: 2021-01-04
輸入你想要結束的時間, 格式為: 2021-01-07: 2021-01-08
https://api.bilibili.com/x/v2/dm/history?type=1&oid=260418892&date=2021-01-04
https://api.bilibili.com/x/v2/dm/history?type=1&oid=260418892&date=2021-01-05
https://api.bilibili.com/x/v2/dm/history?type=1&oid=260418892&date=2021-01-06
https://api.bilibili.com/x/v2/dm/history?type=1&oid=260418892&date=2021-01-07
https://api.bilibili.com/x/v2/dm/history?type=1&oid=260418892&date=2021-01-08

Process finished with exit code 0
'''

震驚! 總共才設定了才4天

竟然有足足30000萬條彈幕!

  • 以上則是對"守護解放西"這部紀錄片彈幕爬取的全部流程,如果喜歡的話,不妨動動小手,點個贊在走唄!

  • 在這個星球上,你很重要,請珍惜你的珍貴! ~~~夜鬥小神社