Python实现B站收藏夹按发布时间重排序
本文介绍如何使用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视频处理或时间排序的技术细节,请持续关注本站发布的其他相关文章。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









