自动采集文章文章(《》B站弹幕的爬取方法,只需一步操作)
优采云 发布时间: 2022-03-22 20:29自动采集文章文章(《》B站弹幕的爬取方法,只需一步操作)
大家好,我是小张!
《》文章中简单介绍了爬取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
用户界面界面
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)
当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])#进行赋值
数据采集
程序获取到url后,第一步是访问url提取当前页面视频的cid参数(一串数字)
使用cid参数构造存储视频弹幕的API接口,然后使用正则requests和bs4包实现text采集
数据采集部分代码:
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()
cid 参数不在常规 html 标记上。提取时,我选择重新正则匹配;但是这一步会消耗更多的内存。为了减少对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)
概括
好了,以上就是本文的全部内容文章,希望内容对你的工作或学习有所帮助。
最后感谢大家的阅读,下期再见~
源码获取
本文使用的源码文章,可以关注微信公众号小张Python,后台回复关键字210217即可获取!
我觉得文章不错,分享给更多人吧~
~