为了自动采集B站弹幕,我用Python开发了一个下载器!

优采云 发布时间: 2022-05-10 12:41

  为了自动采集B站弹幕,我用Python开发了一个下载器!

  大家好,我是小张!

  在《》文章中简单介绍了B站弹幕的爬取方法,只需找到视频中的参数 cid,就能采集到该视频下的所有弹幕;思路虽然很简单,但个人感觉还是比较麻烦,例如之后的某一天,我想采集B站上的某个视频弹幕,还需要从头开始:找cid参数、写代码等;

  因此我在想有没有可能一步到位,以后采集某个视频弹幕时只需一步操作,比如输入想爬取的视频链接,程序能自动识别下载

  实现效果

  基于此,借助 PyQt5 我写了一个小工具,只需提供目标视频的 url 以及目标 txt 路径,程序对该视频下的弹幕自动采集并把数据保存至目标txt文本,先看一下预览效果:

  

  PS 微信公号对动图帧数有限制,制作动图时我删减了一部分内容,因此效果可能会不太流畅

  工具实现整体分为UI界面、数据采集 两个部分,用到的Python库:

  import requests<br />import re<br />from PyQt5.QtWidgets import *<br />from PyQt5 import QtCore<br />from PyQt5.QtGui import *<br />from PyQt5.QtCore import QThread, pyqtSignal<br />from bs4 import BeautifulSoup<br />

  UI界面

  UI 界面借助了 PyQt5,放置了了两个按钮(开始下载、保存至),输入视频链接 的 editline 控件及调试窗口;

  

  代码如下:

      def __init__(self,parent =None):<br />        super(Ui_From,self).__init__(parent=parent)<br />        self.setWindowTitle("B站弹幕采集")<br />        self.setWindowIcon(QIcon('pic.jpg'))# 图标<br />        self.top_label = QLabel("作者:小张\n 微信公号:小张Python")<br />        self.top_label.setAlignment(QtCore.Qt.AlignHCenter)<br />        self.top_label.setStyleSheet('color:red;font-weight:bold;')<br />        self.label = QLabel("B站视频url")<br />        self.label.setAlignment(QtCore.Qt.AlignHCenter)<br />        self.editline1 = QLineEdit()<br />        self.pushButton = QPushButton("开始下载")<br />        self.pushButton.setEnabled(False)#关闭启动<br />        self.Console = QListWidget()<br />        self.saveButton = QPushButton("保存至")<br />        self.layout = QGridLayout()<br />        self.layout.addWidget(self.top_label,0,0,1,2)<br />        self.layout.addWidget(self.label,1,0)<br />        self.layout.addWidget(self.editline1,1,1)<br />        self.layout.addWidget(self.pushButton,2,0)<br />        self.layout.addWidget(self.saveButton,3,0)<br />        self.layout.addWidget(self.Console,2,1,3,1)<br />        self.setLayout(self.layout)<br />        self.savepath = None<br /><br />        self.pushButton.clicked.connect(self.downButton)<br />        self.saveButton.clicked.connect(self.savePushbutton)<br /><br />        self.editline1.textChanged.connect(self.syns_lineEdit)<br />

  当 url 不为空以及目标文本存放路径已经设置好之后,才能进入数据采集模块

  

  实现此功能的代码:

   def syns_lineEdit(self):<br />        if self.editline1.text():<br />            self.pushButton.setEnabled(True)#打开按钮<br /><br />  def savePushbutton(self):<br />        savePath = QFileDialog.getSaveFileName(self,'Save Path','/','txt(*.txt)')<br />        if savePath[0]:# 选中 txt 文件路径<br />            self.savepath  = str(savePath[0])#进行赋值<br />

  数据采集

  程序获取到 url 之后,第一步就是访问 url 提取当前页面中该视频的cid 参数(一连串数字)

  

  利用cid 参数构造该存放该视频弹幕的 API 接口,随后用常规 requests 和 bs4 包实现文本采集

  数据采集部分代码:

  f = open(self.savepath, 'w+', encoding='utf-8')  # 打开 txt 文件<br />        res = requests.get(url)<br />        res.encoding = 'utf-8'<br />        soup = BeautifulSoup(res.text, 'lxml')<br />        items = soup.find_all('d')  # 找到 d 标签<br /><br />        for item in items:<br />            text = item.text<br />            f.write(text)<br />            f.write('\n')<br />        f.close()<br />

  cid 参数 并不是位于常规 html 的标签上,提取时我选择 re 正则匹配;但这一步骤比较耗机子内存,为了减少对UI界面响应速度的影响,这一步骤单独用一个线程来实现

  class Parsetext(QThread):<br />    trigger = pyqtSignal(str) # 信号发射;<br />    def __init__(self,text,parent = None):<br />        super(Parsetext,self).__init__()<br />        self.text = text<br />    def __del__(self):<br />        self.wait()<br />    def run(self):<br />        print('解析 -----------{}'.format(self.text))<br />        result_url = re.findall('.*?"baseUrl":"(.*?)","base_url".*?', self.text)[0]<br />        self.trigger.emit(result_url)<br />

  小结

  好了,以上就是本篇文章的全部内容了,希望内容能够对你工作或者学习上有所帮助。

  最后感谢大家的阅读,我们下期见~

  源码获取

  关于本篇文章用到的源码,可关注微信公号 小张Python,后台回复关键字 210217 即可获取!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线