您好,登錄后才能下訂單哦!
Python編程如何實(shí)現(xiàn)下載器自動(dòng)爬取采集B站彈幕,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
因此我在想有沒有可能一步到位,以后采集某個(gè)視頻彈幕時(shí)只需一步操作,比如輸入想爬取的視頻鏈接,程序能自動(dòng)識(shí)別下載
基于此,借助 PyQt5 我寫了一個(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庫:
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 界面借助了 PyQt5,放置了了兩個(gè)按鈕(開始下載、保存至),輸入視頻鏈接 的 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("開始下載") 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)#打開按鈕 def savePushbutton(self): savePath = QFileDialog.getSaveFileName(self,'Save Path','/','txt(*.txt)') if savePath[0]:# 選中 txt 文件路徑 self.savepath = str(savePath[0])#進(jìn)行賦值
程序獲取到 url 之后,第一步就是訪問 url 提取當(dāng)前頁面中該視頻的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') # 打開 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è)線程來實(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)
看完上述內(nèi)容,你們掌握Python編程如何實(shí)現(xiàn)下載器自動(dòng)爬取采集B站彈幕的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。