Python編程實現下載器自動爬取采集B站彈幕示例
大傢好,我是小張!
在《Python編程實現小姐姐跳舞並生成詞雲視頻示例》文章中簡單介紹瞭B站彈幕的爬取方法,隻需找到視頻中的參數 cid,就能采集到該視頻下的所有彈幕;思路雖然很簡單,但個人感覺還是比較麻煩,例如之後的某一天,我想采集B站上的某個視頻彈幕,還需要從頭開始:找cid參數、寫代碼,重復單調;
因此我在想有沒有可能一步到位,以後采集某個視頻彈幕時隻需一步操作,比如輸入想爬取的視頻鏈接,程序能自動識別下載
實現效果
基於此,借助 PyQt5 我寫瞭一個小工具,隻需提供目標視頻的 url 以及目標 txt 路徑,程序對該視頻下的彈幕自動采集並把數據保存至目標txt文本,先看一下預覽效果:
PS 微信公號對動圖幀數有限制,制作動圖時我刪減瞭一部分內容,因此效果可能會不太流暢
工具實現整體分為UI界面、數據采集 兩個部分,用到的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界面
UI 界面借助瞭 PyQt5,放置瞭瞭兩個按鈕(開始下載、保存至),輸入視頻鏈接 的 editline 控件及調試窗口;
代碼如下:
def __init__(self,parent =None): super(Ui_From,self).__init__(parent=parent) self.setWindowTitle("B站彈幕采集") self.setWindowIcon(QIcon('pic.jpg'))# 圖標 self.top_label = QLabel("作者:小張\n 微信公號:小張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)#關閉啟動 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)
當 url 不為空以及目標文本存放路徑已經設置好之後,才能進入數據采集模塊
實現此功能的代碼:
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])#進行賦值
數據采集
程序獲取到 url 之後,第一步就是訪問 url 提取當前頁面中該視頻的cid 參數(一連串數字)
利用cid 參數構造該存放該視頻彈幕的 API 接口,隨後用常規 requests 和 bs4 包實現文本采集
數據采集部分代碼:
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 標簽 for item in items: text = item.text f.write(text) f.write('\n') f.close()
cid 參數 並不是位於常規 html 的標簽上,提取時我選擇 re 正則匹配;但這一步驟比較耗機子內存,為瞭減少對UI界面響應速度的影響,這一步驟單獨用一個線程來實現
class Parsetext(QThread): trigger = pyqtSignal(str) # 信號發射; 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)
小結
好瞭,以上就是本篇文章的全部內容瞭,希望內容能夠對你工作或者學習上有所幫助。
最後感謝大傢的閱讀,我們下期見
以上就是Python編程實現下載器自動采集B站彈幕示例的詳細內容,更多關於Python實現自動爬取的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- python通過PyQt5實現登錄界面的示例代碼
- PyQt5中QTimer定時器的實例代碼
- PyQt5信號與槽機制案例詳解
- PyQt5 在QListWidget自定義Item的操作
- 利用PyQt5生成過年春聯