python 기반 B 사이트 즐겨찾기를 영상 발표 시간에 따라 정렬하는 문제

7075 단어 python시간정렬

앞말


처음에 제 B스테이션 컬렉션은 기본 즐겨찾기에 저장되어 있었지만 동영상이 점점 더 많이 수집되면서 분류되지 않은 동영상이 함께 놓여 있고 많은 동영상에서 원하는 동영상을 찾기가 어려워져서 즐겨찾기 안에 있는 동영상을 분류했습니다.그러나 분류 이후 새로운 문제가 생겼다. 원래 기본 즐겨찾기 폴더에 저장된 동영상의 상대적인 순서가 혼란스러웠다. 분명히 며칠 전에 소장한 동영상은 여러 페이지를 넘겨야 찾을 수 있기 때문에 이 프로그램이 생겼다.

프로그램의 역할


우리가 본 영상은 대부분 추천을 통해 얻은 것이고, 추천된 영상은 대부분 출시된 지 얼마 되지 않았기 때문에 대부분 소장한 영상의 순서도 기본적으로 영상이 발표된 순서에 따른다.그러면 프로그램을 통해 즐겨찾기에 있는 동영상을 발표 시간에 따라 다시 정렬하면 우리가 동영상을 소장하는 순서와 거의 일치한다.

이치


b역의 API를 이용하여 즐겨찾기에 있는 영상의 번호를 얻고python의request 라이브러리로 영상이 대응하는 웹 페이지의 html를 얻은 후 정규 표현식을 이용하여 영상이 발표되는 시간을 얻는다.발표 시간과 영상의 번호를 귀속시키고 영상 발표 시간에 따라 작은 것부터 큰 것까지 정렬하며 b역의 API를 이용하여 영상을 지정된 즐겨찾기에 저장한다.

문제 발생


b역 영상의 av번호가 8위 이하일 때는 영상 발표 순서에 따라 편성되지만 9위에 도달했을 때는 발표 순서에 따라 편성되지 않기 때문에 영상 홈페이지를 방문하여 영상 발표 시간을 얻을 수 밖에 없다.
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) + '
') 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 영상 발표 시간 정렬에 관한 더 많은 자료는 저희 다른 관련 글을 주목해 주십시오!

좋은 웹페이지 즐겨찾기