Python编程如何实现下载器自动爬取采集B站弹幕,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
因此我在想有没有可能一步到位,以后采集某个视频弹幕时只需一步操作,比如输入想爬取的视频链接,程序能自动识别下载
基于此,借助 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 界面借助了 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站弹幕的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。