排行榜视频生产过程大揭秘

第一步:获取演奏区当天所有口琴投稿信息

  • 连接上mysql数据库之后使用下列sql语句来获取当天的b站口琴投稿信息。(我们使用的是霜落XXS开发并维护的爬虫数据库)
SELECT  s.aid,s.title,s.pubdate,up.name,s.mid,s.duration,d.view, s.videos,d.danmaku,d.favorite,d.coin,d.SHARE,d.reply,d.like,d.dislike  FROM 
(SELECT aid, VIEW,danmaku,reply,favorite,coin,SHARE,`like`,dislike FROM video_dynamic_180924 ) AS d, 
(SELECT aid,MID,pubdate,tid,title,duration,videos FROM video_static WHERE ((tid=59) AND (title LIKE '%口琴%') AND(pubdate BETWEEN '2018-08-08' AND '2018-08-15')) )AS s,
(SELECT MID, NAME FROM up_data) AS up 
WHERE d.aid=s.aid AND s.mid = up.mid 
ORDER BY  DATE(pubdate) ASC LIMIT 10000000;
  • 将获取到的数据储存为CSV格式,如下图:


第二步:计算得分

  • 对于历史投稿,首先计算该月数据与上月数据的差值,然后计算分数。
  • 对于新增投稿,直接计算分数。

import time
import sys
import importlib
import math
import pandas as pd 
import numpy as np
import threading
import queue

aid1 = []
title1 = []
name1 = []
view1 = []
score1 = []
mid1 = []
duration1 = []
videos1 = []
danmaku1 = []
favorite1 = []
coin1 = []
share1 = []
reply1 = []
like1 = []
alpha1 = []
pubdate1 = []

df=pd.read_csv('test1.csv', encoding="GBK")
df1 = pd.read_csv('20180923.csv', encoding="GBK")
df2 = pd.read_csv('20180826.csv', encoding="GBK")
df3=pd.merge(df1,df2,on='aid',how='left')
df3.to_csv('20180826-20180923.csv', encoding="GBK")


class myThread (threading.Thread):   
    def __init__(self, thread_id, q):
        threading.Thread.__init__(self)
        self.thread_id = thread_id
        self.q = q

    def run(self):
        while True:
            try:
                t = self.q.get(block=True, timeout=0)
            except queue.Empty:
                break
            try: 
                if  not math.isnan(df3.MID_y[t]) :
                    aid=df3.aid[t]
                    title=df3.title_x[t]
                    pubdate=df3.pubdate_x[t]
                    name=df3.NAME_x[t]
                    mid=df3.MID_x[t]
                    duration=time.strftime("%M:%S", time.localtime(df3.duration_x[t]))
                    videos=df3.videos_x[t]
                    view=df3.VIEW_x[t]-df3.VIEW_y[t]
                    danmaku=df3.danmaku_x[t]-df3.danmaku_y[t]
                    favorite=df3.favorite_x[t]-df3.favorite_y[t]
                    coin=df3.coin_x[t]-df3.coin_y[t]
                    share=df3.SHARE_x[t]-df3.SHARE_y[t]
                    reply=df3.reply_x[t]-df3.reply_y[t]
                    like=df3.like_x[t]-df3.like_y[t]

                    if ((view>0)and(danmaku>=0)and(favorite>=0)and(coin>=0)and(share>=0)and(reply>=0)and(like>=0)):
                        view_fixed=math.sqrt(10000*view)*(4/(videos+3))
                        k=(coin*favorite*400)/(view**2)
                        alpha=k if k<1 else 1
                        favorite_alpha=round(alpha*30, 2)
                        coin_alpha=round(alpha*20, 2)
                        share_alpha=round(alpha*50, 2)
                        reply_alpha=round(alpha*10, 2)
                        score=round(view_fixed+(share*50+favorite*30+coin*20+reply*10)*alpha, 2)
                        aid1.append(aid)
                        title1.append(title)
                        name1.append(name)
                        pubdate1.append(pubdate)
                        view1.append(view)
                        score1.append(score)
                        mid1.append(mid)
                        duration1.append(duration)
                        videos1.append(videos)
                        danmaku1.append(danmaku)
                        favorite1.append(favorite)
                        coin1.append(coin)
                        share1.append(share)
                        reply1.append(reply)
                        like1.append(like)
                        alpha1.append(alpha)   


                            
                else:
                    aid=df3.aid[t]
                    title=df3.title_x[t]
                    pubdate=df3.pubdate_x[t]
                    name=df3.NAME_x[t]
                    mid=df3.MID_x[t]
                    duration=time.strftime("%M:%S", time.localtime(df3.duration_x[t]))
                    videos=df3.videos_x[t]
                    view=df3.VIEW_x[t]
                    danmaku=df3.danmaku_x[t]
                    favorite=df3.favorite_x[t]
                    coin=df3.coin_x[t]
                    share=df3.SHARE_x[t]
                    reply=df3.reply_x[t]
                    like=df3.like_x[t]


                    view_fixed=math.sqrt(10000*view)*(4/(videos+3))
                    k=(coin*favorite*400)/(view**2)
                    alpha=k if k<1 else 1
                    favorite_alpha=round(alpha*30, 2)
                    coin_alpha=round(alpha*20, 2)
                    share_alpha=round(alpha*50, 2)
                    reply_alpha=round(alpha*10, 2)
                    score=round(view_fixed+(share*50+favorite*30+coin*20+reply*10)*alpha, 2)
                    aid1.append(aid)
                    title1.append(title)
                    name1.append(name)
                    pubdate1.append(pubdate)
                    view1.append(view)
                    score1.append(score)
                    mid1.append(mid)
                    duration1.append(duration)
                    videos1.append(videos)
                    danmaku1.append(danmaku)
                    favorite1.append(favorite)
                    coin1.append(coin)
                    share1.append(share)
                    reply1.append(reply)
                    like1.append(like)
                    alpha1.append(alpha)
                        

                print(t)

                
            except:
                pass     

q = queue.Queue()



#把JOBS排入队列
for i in range(0,df3.shape[0]-1):
    q.put(i)

n = 16
thread_list = [myThread(i, q) for i in range(n)]


#fork NUM个线程等待队列
for i in range(n):
    thread_list[i].start()

#等待所有JOBS完成
for i in range(n):
    thread_list[i].join()
    
    


columns = {'aid': aid1, 'title': title1, 'pubdate':pubdate1,'name': name1,'mid':mid1,'duration':duration1,'view': view1,'danmaku':danmaku1,'favorite':favorite1,'coin':coin1,'share':share1,'reply':reply1,'like':like1,'alpha':alpha1,'score':score1 }
df = pd.DataFrame(columns)
df = df[['aid','title','pubdate','name','mid','duration','view','danmaku','favorite','coin','share','reply','like','alpha','score']]
df.to_csv('【20180826-20180923】.csv', encoding="GBK")   

  • 处理后的数据如下:


第三步:制作模板图片

首先准备好空白模板


  • 按照排名往里面填充对应数据
from PIL import Image,ImageFont,ImageDraw #引入相关库
import pandas as pd

df=pd.read_csv('【20180826-20180923】.csv', encoding="GBK")
i=0
##前十

while i<10:
    t=i+1
    k1="NEW !!" if df.pubdate[i] > '2018/8/26 00:00' else "Old !!"
    k3=df.duration[i]
    k4=df.score[i]
    k5=df.aid[i]
    k6=df.pubdate[i]
    k7=df.title[i]
    k8=df.name[i]
    k9=df.reply[i]
    k10=df.view[i]
    k11=df.favorite[i]
    k12=df.share[i]
    k13=df.coin[i]

    font1=ImageFont.truetype('1.TTF',150) #名次
    font2=ImageFont.truetype('BRDWAYN.TTF',60) #NEW&Old
    font3=ImageFont.truetype('1.TTF',60) #time
    font4=ImageFont.truetype('1.TTF',50) #right-white
    font5=ImageFont.truetype('1.TTF',40)



    def mytext(self, pos, text, font, fill, border='black', bp=1):
            x, y = pos
            shadowcolor = border
            self.text((x-bp, y), text, font=font, fill=shadowcolor)
            self.text((x+bp, y), text, font=font, fill=shadowcolor)
            self.text((x, y-bp), text, font=font, fill=shadowcolor)
            self.text((x, y+bp), text, font=font, fill=shadowcolor)
            # thicker border
            self.text((x-bp, y-bp), text, font=font, fill=shadowcolor)
            self.text((x+bp, y-bp), text, font=font, fill=shadowcolor)
            self.text((x-bp, y+bp), text, font=font, fill=shadowcolor)
            self.text((x+bp, y+bp), text, font=font, fill=shadowcolor)
            # now draw the text over it
            self.text((x, y), text, font=font, fill=fill)


    im=Image.open('10.png')
    draw=ImageDraw.Draw(im)


    mytext(draw, (1580,20), '{}'.format(t), font=font1, fill='red', border='white', bp=4)   # order
    mytext(draw, (1610,185), '{}'.format(k1), font=font2, fill=(255,240,0), border='white', bp=0)   # NEW
    mytext(draw, (1610,300), '{}'.format(k3), font=font3, fill='white', border='white', bp=0)   # time
    mytext(draw, (1170,873), '{}'.format(k4), font=font4, fill='red', border='white', bp=2) # score
    mytext(draw, (230,880), '{}'.format(k5), font=font5, fill='white', border='white', bp=0) # aid
    mytext(draw, (620,880), '{}'.format(k6), font=font5, fill='white', border='white', bp=0) # date
    mytext(draw, (100,965), '{}'.format(k7), font=font5, fill='black', border='black', bp=0) # title
    mytext(draw, (620,1035), '{}'.format(k8), font=font5, fill='white', border='white', bp=0) # up
    mytext(draw, (1750,484), '{}'.format(k9), font=font4, fill='white', border='white', bp=0) # reply
    mytext(draw, (1750,638), '{}'.format(k12), font=font4, fill='white', border='white', bp=0) # share
    mytext(draw, (1710,405), '{}'.format(k10), font=font4, fill='black', border='black', bp=0) # view
    mytext(draw, (1710,560), '{}'.format(k11), font=font4, fill='black', border='black', bp=0) # favorite
    mytext(draw, (1710,715), '{}'.format(k13), font=font4, fill='black', border='black', bp=0) # coin

    im.save('target{}.png'.format(i) )
    i+=1
  • 得到最终图片


  • 副榜同理
##副榜31-110

i=0

while i<1:


    font1=ImageFont.truetype('1.TTF',150) #名次
    font2=ImageFont.truetype('BRDWAYN.TTF',30) #NEW&Old
    font3=ImageFont.truetype('1.TTF',60) #time
    font4=ImageFont.truetype('1.TTF',50) #right-white
    font5=ImageFont.truetype('1.TTF',40)
    font6=ImageFont.truetype('1.TTF',30)
    font7=ImageFont.truetype('1.TTF',20)



    def mytext(self, pos, text, font, fill, border='black', bp=1):  #字体描边函数
            x, y = pos
            shadowcolor = border
            self.text((x-bp, y), text, font=font, fill=shadowcolor)
            self.text((x+bp, y), text, font=font, fill=shadowcolor)
            self.text((x, y-bp), text, font=font, fill=shadowcolor)
            self.text((x, y+bp), text, font=font, fill=shadowcolor)
            # thicker border
            self.text((x-bp, y-bp), text, font=font, fill=shadowcolor)
            self.text((x+bp, y-bp), text, font=font, fill=shadowcolor)
            self.text((x-bp, y+bp), text, font=font, fill=shadowcolor)
            self.text((x+bp, y+bp), text, font=font, fill=shadowcolor)
            # now draw the text over it
            self.text((x, y), text, font=font, fill=fill)


    im=Image.open('110.png')
    draw=ImageDraw.Draw(im)
    j=0
    
    while j<8:
        t=30+(i)*8+j+1
        k1="NEW !!" if df.pubdate[i] > '2018/8/26 00:00' else ""
        k3=df.duration[30+(i)*8+j+1]
        k4=df.score[30+(i)*8+j+1]
        k5='av{}'.format(df.aid[30+(i)*8+j+1])
        k6=df.pubdate[30+(i)*8+j+1]
        k7=df.title[30+(i)*8+j+1]
        k8=df.name[30+(i)*8+j+1]
        k9=df.reply[30+(i)*8+j+1]
        k10='播放增量:{}'.format(df.view[30+(i)*8+j+1])
        k11='收藏增量:{}'.format(df.favorite[30+(i)*8+j+1])
        k12=df.share[30+(i)*8+j+1]
        k13='硬币增量:{}'.format(df.coin[30+(i)*8+j+1])

        mytext(draw, (1770,80+120*j), '{}'.format(t), font=font3, fill='red', border='white', bp=4)   # 名次
        mytext(draw, (1835,90+120*j), '{}'.format(k1), font=font2, fill='green', border='white', bp=0)   # NEW
        # mytext(draw, (1650,185), '{}'.format(k2), font=font2, fill=(255,240,0), border='white', bp=0) 
#        mytext(draw, (630,130+120*j), '{}'.format(k3), font=font7, fill='black', border='black', bp=0)   # time
        mytext(draw, (1600,90+120*j), '{}'.format(k4), font=font5, fill='black', border='black', bp=0) #score
        mytext(draw, (430,130+120*j), '{}'.format(k5), font=font7, fill='black', border='black', bp=0) #aid
        mytext(draw, (750,130+120*j), '{}'.format(k6), font=font7, fill='black', border='black', bp=0) #date
        mytext(draw, (420,80+120*j), '{}'.format(k7), font=font6, fill='black', border='black', bp=0) #title
        mytext(draw, (540,130+120*j), '{}'.format(k8), font=font7, fill='black', border='black', bp=0) #up
#         mytext(draw, (1750,484), '{}'.format(k9), font=font4, fill='white', border='white', bp=0) #评论
#         mytext(draw, (1750,638), '{}'.format(k12), font=font4, fill='white', border='white', bp=0) #分享
        mytext(draw, (1000,130+120*j), '{}'.format(k10), font=font7, fill='green', border='green', bp=0) #播放
        mytext(draw, (1200,130+120*j), '{}'.format(k11), font=font7, fill='green', border='green', bp=0) #收藏
        mytext(draw, (1400,130+120*j), '{}'.format(k13), font=font7, fill='green', border='green', bp=0) #硬币
        j+=1
    im.save('target{}.png'.format(30+i) )
    i+=1

副榜效果图


第四步:选取视频片段

  • 下载视频


    image.png
  • 选取片段(一般为高潮部分)

第五步:剪辑视频

  • 用PR剪辑视频


  • 渲染生成最终作品
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生_x阅读 15,967评论 3 119
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,894评论 2 89
  • 今天在做事情的空暇时间里,自己去敲了一会儿胆经和肝经。 当拳头落在腿上,会感觉到一丝丝的酸痛。然而,当你坚持敲过几...
    精灵儿飞阅读 773评论 4 8
  • 之前在一家叫做Today bookstore的书店,第一次遇见了松浦弥太郎的书,碍于价格如果都买下来的话大概会没饭...
    不着子阅读 205评论 0 0
  • 参考文档1:iOS时间类型转换和各种数据类型进行转换 参考文档2:iOS开发中的时间与日期(上) 转换工具:时间戳...
    达_Ambition阅读 22,008评论 0 5