Python編程實(shí)現(xiàn)下載器自動(dòng)爬取采集B站彈幕示例
大家好,我是小張!
在《Python編程實(shí)現(xiàn)小姐姐跳舞并生成詞云視頻示例》文章中簡(jiǎn)單介紹了B站彈幕的爬取方法,只需找到視頻中的參數(shù) cid,就能采集到該視頻下的所有彈幕;思路雖然很簡(jiǎn)單,但個(gè)人感覺(jué)還是比較麻煩,例如之后的某一天,我想采集B站上的某個(gè)視頻彈幕,還需要從頭開(kāi)始:找cid參數(shù)、寫(xiě)代碼,重復(fù)單調(diào);
因此我在想有沒(méi)有可能一步到位,以后采集某個(gè)視頻彈幕時(shí)只需一步操作,比如輸入想爬取的視頻鏈接,程序能自動(dòng)識(shí)別下載
實(shí)現(xiàn)效果
基于此,借助 PyQt5 我寫(xiě)了一個(gè)小工具,只需提供目標(biāo)視頻的 url 以及目標(biāo) txt 路徑,程序?qū)υ撘曨l下的彈幕自動(dòng)采集并把數(shù)據(jù)保存至目標(biāo)txt文本,先看一下預(yù)覽效果:

PS 微信公號(hào)對(duì)動(dòng)圖幀數(shù)有限制,制作動(dòng)圖時(shí)我刪減了一部分內(nèi)容,因此效果可能會(huì)不太流暢
工具實(shí)現(xiàn)整體分為UI界面、數(shù)據(jù)采集 兩個(gè)部分,用到的Python庫(kù):
import requests import re from PyQt5.QtWidgets import * from PyQt5 import QtCore from PyQt5.QtGui import * from PyQt5.QtCore import QThread, pyqtSignal from bs4 import BeautifulSoup
UI界面
UI 界面借助了 PyQt5,放置了了兩個(gè)按鈕(開(kāi)始下載、保存至),輸入視頻鏈接 的 editline 控件及調(diào)試窗口;

代碼如下:
def __init__(self,parent =None):
super(Ui_From,self).__init__(parent=parent)
self.setWindowTitle("B站彈幕采集")
self.setWindowIcon(QIcon('pic.jpg'))# 圖標(biāo)
self.top_label = QLabel("作者:小張\n 微信公號(hào):小張Python")
self.top_label.setAlignment(QtCore.Qt.AlignHCenter)
self.top_label.setStyleSheet('color:red;font-weight:bold;')
self.label = QLabel("B站視頻url")
self.label.setAlignment(QtCore.Qt.AlignHCenter)
self.editline1 = QLineEdit()
self.pushButton = QPushButton("開(kāi)始下載")
self.pushButton.setEnabled(False)#關(guān)閉啟動(dòng)
self.Console = QListWidget()
self.saveButton = QPushButton("保存至")
self.layout = QGridLayout()
self.layout.addWidget(self.top_label,0,0,1,2)
self.layout.addWidget(self.label,1,0)
self.layout.addWidget(self.editline1,1,1)
self.layout.addWidget(self.pushButton,2,0)
self.layout.addWidget(self.saveButton,3,0)
self.layout.addWidget(self.Console,2,1,3,1)
self.setLayout(self.layout)
self.savepath = None
self.pushButton.clicked.connect(self.downButton)
self.saveButton.clicked.connect(self.savePushbutton)
self.editline1.textChanged.connect(self.syns_lineEdit)
當(dāng) url 不為空以及目標(biāo)文本存放路徑已經(jīng)設(shè)置好之后,才能進(jìn)入數(shù)據(jù)采集模塊

實(shí)現(xiàn)此功能的代碼:
def syns_lineEdit(self):
if self.editline1.text():
self.pushButton.setEnabled(True)#打開(kāi)按鈕
def savePushbutton(self):
savePath = QFileDialog.getSaveFileName(self,'Save Path','/','txt(*.txt)')
if savePath[0]:# 選中 txt 文件路徑
self.savepath = str(savePath[0])#進(jìn)行賦值
數(shù)據(jù)采集
程序獲取到 url 之后,第一步就是訪問(wèn) url 提取當(dāng)前頁(yè)面中該視頻的cid 參數(shù)(一連串?dāng)?shù)字)

利用cid 參數(shù)構(gòu)造該存放該視頻彈幕的 API 接口,隨后用常規(guī) requests 和 bs4 包實(shí)現(xiàn)文本采集

數(shù)據(jù)采集部分代碼:
f = open(self.savepath, 'w+', encoding='utf-8') # 打開(kāi) txt 文件
res = requests.get(url)
res.encoding = 'utf-8'
soup = BeautifulSoup(res.text, 'lxml')
items = soup.find_all('d') # 找到 d 標(biāo)簽
for item in items:
text = item.text
f.write(text)
f.write('\n')
f.close()
cid 參數(shù) 并不是位于常規(guī) html 的標(biāo)簽上,提取時(shí)我選擇 re 正則匹配;但這一步驟比較耗機(jī)子內(nèi)存,為了減少對(duì)UI界面響應(yīng)速度的影響,這一步驟單獨(dú)用一個(gè)線程來(lái)實(shí)現(xiàn)
class Parsetext(QThread):
trigger = pyqtSignal(str) # 信號(hào)發(fā)射;
def __init__(self,text,parent = None):
super(Parsetext,self).__init__()
self.text = text
def __del__(self):
self.wait()
def run(self):
print('解析 -----------{}'.format(self.text))
result_url = re.findall('.*?"baseUrl":"(.*?)","base_url".*?', self.text)[0]
self.trigger.emit(result_url)
小結(jié)
好了,以上就是本篇文章的全部?jī)?nèi)容了,希望內(nèi)容能夠?qū)δ愎ぷ骰蛘邔W(xué)習(xí)上有所幫助。
最后感謝大家的閱讀,我們下期見(jiàn)
以上就是Python編程實(shí)現(xiàn)下載器自動(dòng)采集B站彈幕示例的詳細(xì)內(nèi)容,更多關(guān)于Python實(shí)現(xiàn)自動(dòng)爬取的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python使用tkinter實(shí)現(xiàn)小時(shí)鐘效果
這篇文章主要為大家詳細(xì)介紹了Python使用tkinter實(shí)現(xiàn)小時(shí)鐘效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-02-02
django 多數(shù)據(jù)庫(kù)及分庫(kù)實(shí)現(xiàn)方式
這篇文章主要介紹了django 多數(shù)據(jù)庫(kù)及分庫(kù)實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04
Python實(shí)現(xiàn)自動(dòng)運(yùn)行代碼的方法詳解
在軟件開(kāi)發(fā)和數(shù)據(jù)科學(xué)領(lǐng)域,自動(dòng)運(yùn)行代碼是提高效率和確保一致性的關(guān)鍵,本文將深入探討如何使用Python實(shí)現(xiàn)自動(dòng)運(yùn)行代碼的各種方法,希望對(duì)大家有所幫助2023-12-12
python單星號(hào)(*)與雙星號(hào)(**)使用示例demo
這篇文章詳細(xì)介紹了Python中*與**操作符的使用場(chǎng)景及注意事項(xiàng),并通過(guò)示例代碼展示了它們?cè)诤瘮?shù)形參和實(shí)參、序列解包以及函數(shù)參數(shù)順序中的應(yīng)用,需要的朋友可以參考下2024-12-12
Python實(shí)現(xiàn)快速提取PDF文檔中的圖片
提取PDF文檔中的圖片是一項(xiàng)常見(jiàn)的任務(wù),本文將介紹如何使用PyPDF2和pdfminer.six這兩個(gè)庫(kù)來(lái)提取PDF文檔中的圖片,感興趣的可以了解一下2023-06-06
正確理解python中的關(guān)鍵字“with”與上下文管理器
這篇文章主要介紹了關(guān)于python中關(guān)鍵字"with"和上下文管理器的相關(guān)資料,文中介紹的非常詳細(xì),相信對(duì)大家學(xué)習(xí)或者使用python具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-04-04
web自動(dòng)化測(cè)試Selenium點(diǎn)擊元素的常用方法
在Web自動(dòng)化測(cè)試中,Selenium提供多種點(diǎn)擊方法,常用的click()方法通過(guò)選中元素并觸發(fā)點(diǎn)擊事件,若click()方法不穩(wěn)定,可以采用JavaScript執(zhí)行點(diǎn)擊或使用ActionChains類模擬鼠標(biāo)點(diǎn)擊,需要的朋友可以參考下2024-09-09
Python中如何調(diào)用系統(tǒng)命令和進(jìn)程
在Python編程中,subprocess庫(kù)是一個(gè)功能強(qiáng)大的工具,本文將詳細(xì)介紹subprocess庫(kù)的功能和應(yīng)用場(chǎng)景,并通過(guò)代碼示例進(jìn)行說(shuō)明,需要的可以了解下2025-02-02
padas 生成excel 增加sheet表的實(shí)例
今天小編就為大家分享一篇padas 生成excel 增加sheet表的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12

