用工具批量下载哔哩哔哩视频并且将内容转换成pdf

6 篇文章 1 订阅

网上的b站视频下载工具其实已经是一箩筐了,但是大部分有个问题,就是不支持批量下载。

不废话,直接说搜索的结果,目前发现的两个可用的:

b站下载姬:https://github.com/FlySelfLog/downkyi 最好用的就是这个了,我也是用这个。

自己号称东半球第二快的用go语言实现的程序:https://github.com/sodaling/FastestBilibiliDownloader 这个东西,首先因为作者太懒,没有打包成exe,所以导致配置起来相当麻烦,你直接下载下来跑的话会各种报错,需要下载很多go的库,同时,需要你有一点go语言基础。然后是,这个东西本身是有问题的,下载一个up主的视频会少了最后一页,大概是他的代码的for循环少了个+1吧。因为代码很凌乱很绕,感觉像在炫技一样,我对go语言的研究也不深,所以就不改他的代码了,直接pass。

用b站下载姬批量下载完某up主的视频之后就是转换问题了。为什么要转换呢,这是因为我在b站上面看up主兔肉菌的绘画类视频觉得很有意思,很有学习价值,所以想要弄成pdf来临摹,这样也方便我打印嘛。

于是想到了python是可以用opencv库来截图的。那就好办了:)

上代码,第一个是单个的版本,第二个是批量转换:

import os
import time
import cv2
import shutil
from fpdf import FPDF

filename = input("请输入下载的文件名(注意不要添加文件名后缀):")

try:
	cap = cv2.VideoCapture(os.path.dirname(os.path.abspath(__file__)) + '\\' + filename + '.flv')
	print("读取视频成功...")
except:
	print("读取视频失败,请检查文件名或文件路径是否正确...")

outputpath = os.path.dirname(os.path.abspath(__file__)) + '\\output'
if not os.path.exists(outputpath):
	print("创建临时文件夹output...")
	os.makedirs(outputpath)
else:
	print("检测到临时文件夹output...")

count = 0
num = 1
print("开始截屏...")
while cap.isOpened():
    ret, frame = cap.read()

    if ret:
        cv2.imwrite(os.path.dirname(os.path.abspath(__file__)) + '\\output\\frame{:d}.jpg'.format(count), frame)
        count += 100 # i.e. at 300 fps, this advances one second
        print("正在截取第"+str(num)+"张")
        num += 1
        cap.set(1, count)
    else:
        cap.release()
        print("截屏完成,共计"+str(num)+"张~")
        break

imagelist = os.listdir(outputpath)
print("开始将图片合并后pdf,请耐心等待几秒钟...")
#format 后面的是尺寸,我们的视频默认就是这个尺寸,所以不用改了
pdf = FPDF(unit = "pt", format = [1920, 1080])
# imagelist is the list with all image filenames
for image in imagelist:
    pdf.add_page()
    pdf.image(outputpath + "\\" + image,0,0)
pdf.output(os.path.dirname(os.path.abspath(__file__)) + '\\'+ filename +'.pdf', "F")
print("pdf合成完成!")

filelist=os.listdir(outputpath)                #列出该目录下的所有文件名
for f in filelist:
	filepath = os.path.join(outputpath,f)   #将文件名映射成绝对路劲
	if os.path.isfile(filepath):            #判断该文件是否为文件或者文件夹
		os.remove(filepath)                 #若为文件,则直接删除
	elif os.path.isdir(filepath):
		shutil.rmtree(filepath,True)        #若为文件夹,则删除该文件夹及文件夹内所有文件
shutil.rmtree(outputpath,True)
print("清空并删除临时文件夹output...")

t = 5
while t:
	print(str(t) + "秒后关闭...")
	t -= 1
	time.sleep(1)
print("关闭,下次见~")
import os
import datetime
import cv2
import shutil
from fpdf import FPDF

rootdir = os.getcwd() + '\\全部'

li = os.listdir(rootdir)

if not os.path.exists(os.getcwd() + '\\output'):
	os.makedirs(os.getcwd() + '\\output')

def mprint(s):
	print(str(datetime.datetime.now())+" " + s)

def convert(index,whole,lii,f):
	mprint('处理第'+str(index)+'个视频,共'+str(whole)+'个')
	temp = os.getcwd() + '\\output\\'+lii
	try:
		cap = cv2.VideoCapture(rootdir + "\\" + lii + "\\" + f)
		count = 0
		num = 1
		if not os.path.exists(temp):
			os.makedirs(temp)
		while cap.isOpened():
			ret, frame = cap.read()
			if ret:
				cv2.imencode('.jpg',frame)[1].tofile(temp+'\\frame{:d}.jpg'.format(count))
				count += 100 # i.e. at 300 fps, this advances one second
				mprint("正在截取第"+str(index)+"个视频第"+str(num)+"张")
				num += 1
				cap.set(1, count)
			else:
				cap.release()
				mprint("截屏完成,共计"+str(num)+"张~")
				break
	except:
		mprint("读取视频失败,请检查文件名或文件路径是否正确...")
	imagelist = os.listdir(temp)
	mprint("开始制作第"+str(index)+"个pdf,请耐心等待几秒钟...")
	#format 后面的是尺寸,我们的视频默认就是这个尺寸,所以不用改了
	pdf = FPDF(unit = "pt", format = [1920, 1080])
	# imagelist is the list with all image filenames
	for image in imagelist:
	    pdf.add_page()
	    pdf.image(temp + "\\" + image,0,0)
	pdf.output(temp +'.pdf', "F")
	mprint("第"+str(index)+"个pdf合成完成!")
	filelist=os.listdir(temp)                #列出该目录下的所有文件名
	for f in filelist:
		filepath = os.path.join(temp,f)   #将文件名映射成绝对路劲
		if os.path.isfile(filepath):            #判断该文件是否为文件或者文件夹
			os.remove(filepath)                 #若为文件,则直接删除
		elif os.path.isdir(filepath):
			shutil.rmtree(filepath,True)        #若为文件夹,则删除该文件夹及文件夹内所有文件
	shutil.rmtree(temp,True)


for i in range(0,len(li)):
	for root,dirs,files in os.walk(os.path.join(rootdir,li[i])):
		for f in files:
			if f.endswith(".mp4"):
				convert(i+1,len(li),li[i],f)
				break

 第二个脚本需要放在下载姬下载的视频的那个download文件夹里面才能跑。

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值