基于python对B站收藏夹按照视频发布时间进行排序的问题

前言

在最一开始,我的B站收藏一直是存放在默认收藏夹中,但是随着视频收藏的越来越多,没有分类的视频放在一起,想在众多视频中找到想要的视频非常困难,因此就对收藏夹里面的视频进行了分类。但是分类之后紧接着又出现了一个新的问题:原来存放在默认收藏夹里面视频的相对顺序被打乱了——明明前几天刚收藏的视频却要翻很多很多页才能找到,因此有了这个程序。

程序的作用

因为我们看到的视频大部分都是通过推荐得到的,而推荐的视频大部分都是刚发布不久,因此大部分收藏的视频的顺序也基本是按照视频发布的顺序来的。那么通过程序对收藏夹中的视频按照发布时间重新排序,那么就和我们收藏视频的顺序几乎一致了。

机理

利用b站的API获取收藏夹中视频的视频的编号,用python中的request库获得视频对应网页的html,之后利用正则表达式得到视频发布的时间。将发布时间和视频的编号绑定,按照视频发布时间从小到大排序,再次利用b站的API将视频收藏到指定收藏夹。

出现的问题

b站视频的av号在八位以下的时候是按照视频发布顺序编排的,但是当到达九位的时候就不是按照发布顺序编排的了,因此只能通过访问视频主页来得到视频发布时间。

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视频发布时间排序的资料请关注我们其它相关文章!

(0)

相关推荐

  • python 对key为时间的dict排序方法

    如下所示: import time def date_compare(item1, item2): t1 = time.mktime(time.strptime(item1, '%Y/%m/%d')) t2 = time.mktime(time.strptime(item2, '%Y/%m/%d')) print(t1, t2) if t1 < t2: return -1 elif t1 > t2: return 1 else: return 0 if __name__ == '__main_

  • python让图片按照exif信息里的创建时间进行排序的方法

    本文实例讲述了python让图片按照exif信息里的创建时间进行排序的方法.分享给大家供大家参考.具体分析如下: 我们经常会从不同的设备里取出照片,比如照相机,手机,iphone等等,操作系统记录的创建日期经常 会因为拷贝等原因变动,下面的代码可以给图片按照exif里的创建时间进行排序,非常有用. 复制代码 代码如下: import os import shutil import Image from PIL.ExifTags import TAGS def print_all_known_ex

  • python快速排序的实现及运行时间比较

    快速排序的基本思想:首先选定一个数组中的一个初始值,将数组中比该值小的放在左边,比该值大的放在右边,然后分别对左边的数组进行如上的操作,对右边的数组进行如上的操作.(分治+递归) 1.利用匿名函数lambda 匿名函数的基本用法func_name  = lambda x:array,冒号左边的x代表传入的参数,冒号右边的array代表返回值,当然名字是可以自己取的. quick_sort = lambda array: \ array if len(array) <= 1 \ else quic

  • Python八大常见排序算法定义、实现及时间消耗效率分析

    本文实例讲述了Python八大常见排序算法定义.实现及时间消耗效率分析.分享给大家供大家参考,具体如下: 昨晚上开始总结了一下常见的几种排序算法,由于之前我已经写了好几篇排序的算法的相关博文了现在总结一下的话可以说是很方便的,这里的目的是为了更加完整详尽的总结一下这些排序算法,为了复习基础的东西,从冒泡排序.直接插入排序.选择排序.归并排序.希尔排序.桶排序.堆排序.快速排序入手来分析和实现,在最后也给出来了简单的时间统计,重在原理.算法基础,其他的次之,这些东西的熟练掌握不算是对之后的工作或者

  • python按时间排序目录下的文件实现方法

    废话不多说,直接上代码: python文件夹遍历,文件操作,获取文件修改创建时间可以去网上参考其他文章. 如: os.path.getmtime() 函数是获取文件最后修改时间 os.path.getctime() 函数是获取文件最后创建时间 def get_file_list(file_path): dir_list = os.listdir(file_path) if not dir_list: return else: # 注意,这里使用lambda表达式,将文件按照最后修改时间顺序升序排

  • 基于python对B站收藏夹按照视频发布时间进行排序的问题

    前言 在最一开始,我的B站收藏一直是存放在默认收藏夹中,但是随着视频收藏的越来越多,没有分类的视频放在一起,想在众多视频中找到想要的视频非常困难,因此就对收藏夹里面的视频进行了分类.但是分类之后紧接着又出现了一个新的问题:原来存放在默认收藏夹里面视频的相对顺序被打乱了--明明前几天刚收藏的视频却要翻很多很多页才能找到,因此有了这个程序. 程序的作用 因为我们看到的视频大部分都是通过推荐得到的,而推荐的视频大部分都是刚发布不久,因此大部分收藏的视频的顺序也基本是按照视频发布的顺序来的.那么通过程序

  • 基于Python制作B站视频下载小工具

    目录 1. 原理简介 2. 网页分析 3. 视频爬取 4. 存入本地 5. GUI工具制作 1. 原理简介 原理很简单,就是获取视频资源的源地址,然后爬取视频的二进制内容,再写入到本地即可. 2. 网页分析 打开该网页,然后F12进入开发者模式,接着点开网络—>全部,因为视频资源一般比较大,我这里根据大小进行了从大到小的排序,找到了第一条这些可能和视频源地址有关. 然后,我们复制找到的这条里的url部分不变的部分,回到元素中ctrl+F搜索,找到了可能和视频源地址有关的节点. 果然,我们复制这部

  • 基于Python实现捕获,播放和保存摄像头视频

    目录 读取视频 从相机中读取视频 从文件中播放视频 保存视频 前几天有个读者在粉丝群里面提了一个问题: Python 怎样提高视频清晰度和对比度? 我之前没有涉及到使用 Python 操作视频这一方面,所以当时很抱歉地跟读者朋友说暂未涉及. 这两天想了下,感觉应该补一下这一块的内容,一方面是增加自己涉猎的广度,另一方面也可以给粉丝答疑解惑. 今天先分享一下 Python 操作视频最基本的操作,包括读取和播放视频和保存视频. 读取视频 要捕获视频,你需要创建一个 VideoCapture 对象.它

  • 基于python实现的抓取腾讯视频所有电影的爬虫

    我搜集了国内10几个电影网站的数据,里面近几十W条记录,用文本没法存,mongodb学习成本非常低,安装.下载.运行起来不会花你5分钟时间. # -*- coding: utf-8 -*- # by awakenjoys. my site: www.dianying.at import re import urllib2 from bs4 import BeautifulSoup import string, time import pymongo NUM = 0 #全局变量,电影数量 m_ty

  • 基于python + django + whoosh + jieba 分词器实现站内检索功能

    基于 python django 源码 前期准备 安装库: pip install django-haystack pip install whoosh pip install jieba 如果pip 安装超时,可配置pip国内源下载,如下: pip install -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com <安装的库> pip install -i http://mirrors.al

  • 基于Bootstrap的Metronic框架实现页面链接收藏夹功能

    在一个系统里面,往往有很多菜单项目,每个菜单项对应一个页面,一般用户只需要用到一些常用的功能,如果每次都需要去各个层次的菜单里面去找对应的功能,那确实有点繁琐.特别是在菜单繁多,而客户又对系统整体不熟悉的情况下,如果有一个类似浏览器的收藏夹模块,把一些常用的菜单连接保存起来,每次从这个收藏夹主页去找对应的页面,那样确实是省事省力,非常方便.本篇随笔就是介绍在基于Metronic的Bootstrap开发框架里面实现这个收藏夹的思路. 1.系统的收藏夹界面处理效果 为了实现这个收藏夹功能,我们也需要

  • 基于BootStrap的Metronic框架实现页面链接收藏夹功能按钮移动收藏记录(使用Sortable进行拖动排序)

    在上篇文章:基于Bootstrap的Metronic框架实现页面链接收藏夹功能,介绍了链接收藏夹功能的实现,以及对收藏记录的排序处理.该篇随笔主要使用功能按钮的方式移动收藏记录,功能虽然实现的还算不错,不过文章出来后,有读者同行指出可以利用直接拖动的方式实现排序更方便,因此对其中列表记录的排序进行了研究,从而介绍了如何利用Sortable开源JS组件实现拖动排序的处理,本篇随笔介绍了该组件在连接收藏夹排序中的应用. 1.收藏记录的排序处理回顾 上篇随笔介绍的收藏夹处理,主要就是为了方便用户快速进

  • 使用 Python 清理收藏夹里已失效的网站

    失效的书签们 我们日常浏览网站的时候,时不时会遇到些新奇的东西( 你懂的.jpg ),于是我们就默默的点了个收藏或者加书签.然而当我们面对成百上千的书签和收藏夹的时候,总会头疼不已-- 尤其是昨天还在更新的程序设计博客,今天就挂了永不更新.或者是昨天看的起劲的电影网站,今天直接404.失效页面这么多,每次我打开才知道失效了,并且需要手动删除,这能是一个程序员干的事情吗? 可是无论是Google浏览器还是国内浏览器,最多也就提供一个对于收藏夹的备份服务,那只能Python走起了. Python支持

  • 如何基于Python创建目录文件夹

    这篇文章主要介绍了如何基于Python创建目录文件夹,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Python对文件的操作还算是方便的,只需要包含os模块进来,使用相关函数即可实现目录的创建. 主要涉及到三个函数 1.os.path.exists(path) 判断一个目录是否存在 2.os.makedirs(path) 多层创建目录 3.os.mkdir(path) 创建目录 DEMO 直接上代码 def mkdir(path): # 引入模

随机推荐