爬取B站弹幕的小工具

Fri, Feb 26, 2021 One-minute read

做一个简单的爬取弹幕的小工具

网络爬虫的概念一直很火热

一直没有尝试过

这次通过自己简单的学习

做个简单的爬虫小工具

弹幕爬取

代码原理十分简单

B站视频格式组成为

https://m.bilibili.com/video/+BV

通过输入B站的视频号

爬取任意弹幕

class BiliSpider:
    def __init__(self, BV, FilePath):
        # 构造要爬取的视频url地址

        self.BVurl = "https://m.bilibili.com/video/" + BV

        self.headers = {
            "User-Agent": "Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Mobile Safari/537.36"}
        self.path = FilePath

    def getXml_url(self):
        # 获取该视频网页的内容

        response = requests.get(self.BVurl, headers=self.headers)

        html_str = response.content.decode()

        # 使用正则找出该弹幕地址

        # 格式为:https://comment.bilibili.com/168087953.xml

        # 我们分隔出的是地址中的弹幕文件名,即 168087953

        getWord_url = re.findall(r'"cid":[\d]*', html_str)
        # print(getWord_url)

        getWord_url = getWord_url[0].replace('"cid":', "").replace(" ", "")

        # 组装成要请求的xml地址

        xml_url = "https://comment.bilibili.com/{}.xml".format(getWord_url)

        return xml_url

GUI界面

自己也尝试做了一个简单的GUI界面

使用PyQt5实现

不过界面的效果着实略丑

class Danmu(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        self.review = QLineEdit(self)
        self.file = QLineEdit(self)
        self.outfile = QLineEdit(self)
        self.pic = QLineEdit(self)
        self.danmu = QLabel(self)
        self.lb = QLabel(self)

        btn = QPushButton("获取视频号")
        getbtn = QPushButton("爬取弹幕")
        cloudbtn = QPushButton("生成云图")
        filebtn = QPushButton("打开文件夹")
        outfilebtn = QPushButton("文件名")
        picbtn = QPushButton("图片名")
        # review.textChanged[str].connect(self.onChanged)

        grid = QGridLayout()
        grid.setSpacing(5)

        grid.addWidget(btn, 1, 0)
        grid.addWidget(self.review, 1, 1)

        grid.addWidget(filebtn, 2, 0)
        grid.addWidget(self.file, 2, 1)
        grid.addWidget(outfilebtn, 3, 0)
        grid.addWidget(self.outfile, 3, 1)
        grid.addWidget(picbtn, 4, 0)
        grid.addWidget(self.pic, 4, 1)

        grid.addWidget(getbtn, 5, 0)
        grid.addWidget(self.danmu, 5, 1)
        grid.addWidget(cloudbtn, 6, 0)
        grid.addWidget(self.lb, 6, 1, 4, 1)

        btn.clicked.connect(self.addNum)
        getbtn.clicked.connect(self.get_Danmu1)
        cloudbtn.clicked.connect(self.Getcloud)
        filebtn.clicked.connect(self.openFile)
        outfilebtn.clicked.connect(self.get_name)
        # picbtn.clicked.connect(self.getpic_name)

        self.setLayout(grid)
        self.setGeometry(300, 300, 300, 150)
        self.setWindowTitle('爬取弹幕小工具')
        self.show()

实现效果

将爬取到弹幕保存为csv文件

最后利用wordcloud库实现云图