Python实现B站收藏夹按发布时间重排序

Mason
Mason
发布时间:2026-10-14| 4人浏览过
原创

本文介绍如何使用Python脚本解决B站收藏夹视频顺序混乱问题。通过调用B站API获取视频ID,利用正则表达式解析网页HTML获取发布时间,并将时间与视频ID绑定后按时间排序。脚本包含防封禁机制和断点续传功能,帮助用户将收藏夹按视频发布先后顺序重新整理。

前言

起初,我的B站收藏视频都堆积在默认收藏夹中。随着收藏数量增加,缺乏分类的视频混杂在一起,导致查找特定视频变得极其困难,因此我对收藏夹进行了初步分类。然而,分类操作打乱了原有视频的相对顺序,导致近期收藏的视频反而需要翻阅大量页面才能找到,这促使我开发了该排序程序。

程序的作用

用户通常通过推荐流发现视频,而推荐内容多为近期发布,因此收藏列表大致反映了视频的发布时间顺序。本程序旨在通过脚本对收藏夹内的视频按发布时间进行重新排序,使其顺序与用户实际收藏时的时间线保持一致。

机理

程序首先利用B站API获取收藏夹内所有视频的编号(AV号)。接着,使用Python的requests库请求对应视频网页的HTML源码,并通过正则表达式提取视频的发布时间。随后,将提取到的发布时间与视频编号进行绑定,按照时间从小到大进行排序。最后,再次调用B站API,将排序后的视频重新收藏至目标收藏夹,完成排序操作。

出现的问题

B站视频的AV号在八位数以内时,通常遵循发布顺序编排;但当AV号达到九位数后,不再严格遵循发布顺序。因此,无法直接通过AV号判断新旧,必须通过访问视频主页解析HTML来获取准确的发布时间。

B站API对高频访问有严格限制,长时间高频率调用会触发错误码。为此,程序在每次调用API后设置了随机时长的休眠(sleep),以模拟人工操作频率,避免被限制。

程序运行过程中可能因网络或其他原因中断。为防止重复劳动,程序中加入了中间状态存储功能。即使程序意外挂掉,下次运行时也可从断点继续,否则每次重启都需重新爬取所有数据,效率极低。

使用方法

在创建Sort类实例时,需将userAgent、cookie、fid、toFid和csrf作为参数传入构造函数。初始化完成后,调用类中的sortVideos()方法即可执行视频排序操作。


import requests, json, time, re, datetime, random

class WriteLog(object):
    def __getCurrentTime(self):
        return str(time.ctime(time.time()))

    def writeFile(self, fileName, l):
        with open(self.__getCurrentTime() + fileName, 'w') as f:
            for i in l:
                f.write(str(i) + '\n')

class Sort(WriteLog):
    def __init__(self, fid, toFid, csrf, userAgent, cookie, MinSleepTime=5, MaxSleepTime=10):
        self.MinSleepTime = MinSleepTime
        self.MaxSleepTime = MaxSleepTime
        self.fid = str(fid)
        self.toFid = str(toFid)
        self.csrf = csrf
        self.DeadVideo = []
        self.headers = {'User-Agent': userAgent, 'cookie': cookie}

    def __Sleep(self):
        sleepTime = random.randint(self.MinSleepTime, self.MaxSleepTime)
        time.sleep(sleepTime)

    def __getAllVideoId(self):
        print('Start get all video ID')
        fid = self.fid
        res = []
        cnt = 0
        for i in range(100):
            if i == 0:
                continue
            url = 'https://api.bilibili.com/x/v3/fav/resource/list?media_id=' + fid + '&pn=' + str(i) + '&ps=20&keyword=&order=mtime&type=0&tid=0&platform=web&jsonp=jsonp'
            html = requests.get(url=url, headers=self.headers)
            te = json.loads(html.text)
            te = te['data']['medias']
            if te != None:
                for j in te:
                    res.append(j['id'])
                    print('num: ', cnt, '\tvideoID: ', j['id'])
                    cnt = cnt + 1
                self.__Sleep()
            else:
                break
        print('Finish get all video ID, in total %d' % (len(res)))
        return res

    def __addVideoToFavorite(self, vid):
        fid = self.toFid
        csrf = self.csrf
        url = 'https://api.bilibili.com/x/v3/fav/resource/deal'
        data = {
            'rid': vid,
            'type': '2',
            'add_media_ids': fid,
            'del_media_ids': '',
            'jsonp': 'jsonp',
            'csrf': csrf,
            'platform': 'web',
        }
        requests.post(url=url, data=data, headers=self.headers)
        print('finish add video %s to folder %s' % (vid, fid))

    def __getVideoPostTime(self, vid):
        vid = str(vid)
        url = 'https://www.bilibili.com/video/av' + vid
        text = requests.get(url).text
        '''
        data-vue-meta="true" itemprop="uploadDate" content="2021-04-07 23:29:21"><meta data-vue-meta="true" itemprop="datePublished" c
        '''
        reg = re.compile('content="([0-9]+)-([0-9]+)-([0-9]+)\s([0-9]+):([0-9]+):([0-9]+)"')
        text = reg.findall(text)
        if len(text) == 0:
            return -1
        text = text[0]
        if len(text) < 6:
            return -1
        t = ""
        for i in text:
            t = t + str(i)
        print('finish get video %s post time, it\'s post time is: %s' % (vid, t))
        return int(t)

    def __Unique(self, l):
        size = len(l)
        if size == 0:
            return []
        res = [l[0]]
        for i in range(size):
            if i == 0:
                continue
            if l[i] != l[i - 1]:
                res.append(l[i])
        return res

    def __addVideo(self, res):
        cnt = 0
        for i in res:
            self.__addVideoToFavorite(vid=i)
            self.__Sleep()
            cnt = cnt + 1

    def __getVideosTime(self, res):
        videos = []
        cnt = 0
        for i in res:
            t = self.__getVideoPostTime(i)
            if t == -1:
                continue
            item = {
                'vid': str(i),
                'postTime': t
            }
            videos.append(item)
            cnt = cnt + 1
        return videos

    def sortVideos(self):
        fid = self.fid
        toFid = self.toFid
        res = self.__getAllVideoId()
        self.writeFile('getAllVideoId' + fid + 'to' + toFid, res)
        videos = self.__getVideosTime(res)
        videos = sorted(videos, key=lambda x: x['postTime'])
        res = []
        for i in videos:
            res.append(i['vid'])
        res = self.__Unique(res)
        self.writeFile('getVideosTime' + fid + 'to' + toFid, res)
        self.__addVideo(res)
        self.writeFile('err' + fid + 'to' + toFid, self.DeadVideo)

if __name__=='__main__':
    userAgent = ''
    cookie = ''
    fid = ''
    toFid = ''
    csrf = ''
    sortVideo = Sort(fid=fid, toFid=toFid, csrf=csrf, userAgent=userAgent, cookie=cookie)
    sortVideo.sortVideos()

以上就是基于Python对B站收藏夹按视频发布时间进行排序的完整方案。如需了解更多关于Python视频处理或时间排序的技术细节,请持续关注本站发布的其他相关文章。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。