网页视频抓取脚本(会把v2版本打成exe运行先看v1版本import,,)
优采云 发布时间: 2021-12-06 04:07网页视频抓取脚本(会把v2版本打成exe运行先看v1版本import,,)
编写了两个脚本,分别是 v1 和 v2。
所有python调用mediainfo工具提取视频元数据信息
v1版本在pycharm中使用测试运行,指定视频路径
v2版本终于交付运行运行了,v2版本会以exe的形式运行
先看v1版本
导入 os,subprocess,json,re,locale,sys
导入 xlwt、时间、关闭
#获取当前文件所在的绝对目录路径
# this_path=os.path.abspath('.')
# print('当前路径为----',this_path)
# dir_path=this_path
#视频文件所在目录
dir_path='I:\\3 分钟午餐'
# print(os.listdir(this_path))
打印('---------------------------------')
print('--------------程序即将启动----------------')
# dir_path=this_path
#定义一个列表来存放每个文件的绝对路径,方便后面的操作
init_list=[]
# dir_path='F:\\Dollhouse 总视频'
#创建一个方法,统计每个文件路径,并附加到列表中。这里注释掉递归,不获取子目录,只获取dir_path下的视频
def get_all_file(dir_path,init_list):
对于 os.listdir(dir_path) 中的文件:
# 打印(文件)
filepath=os.path.join(dir_path,file)
# 打印(文件路径)
如果 os.path.isdir(filepath):
print('遇到子目录---%s---此版本暂时不提取子目录视频信息--'%(filepath))
time.sleep(2)
# get_all_file(文件路径)
其他:
如果不是 file.endswith('exe'):
init_list.append(文件路径)
返回init_list
#执行上述方法,将每个文件的绝对路径追加到列表中
file_list=get_all_file(dir_path,init_list)
print("读完文件-----3秒后,开始获取详细视频信息-----")
time.sleep(3)
#定义一个方法来获取单个媒体文件的元数据并作为字典数据返回
#这个程序的核心是调用mediainfo工具提取视频信息
def get_media_info(file):
pname='D:\mediainfo_i386\MediaInfo.exe "%s" --Output=JSON'%(file)
result=subprocess.Popen(pname,shell=False,stdout=subprocess.PIPE).stdout
list_std=result.readlines()
str_tmp=''
对于 list_std 中的项目:
str_tmp+=bytes.decode(item.strip())
json_data=json.loads(str_tmp)
返回json_data
#定义一个传递字典数据的方法,返回你想要的字段数据,返回一个值列表
def get_dict_data(json_data):
#获取文件大小
filesize=json_data['media']['track'][0]['FileSize']
#获取比特率
malv=json_data['media']['track'][0]['OverallBitRate'][0:4]
#获取播放时长
duration=json_data['media']['track'][0]['Duration'].split('.')[0]
#获取文件类型
file_format=json_data['media']['track'][0]['Format']
#获取边框宽度
samp_width=json_data['media']['track'][1]['Sampled_Width']
#获取框架高度
samp_height=json_data['media']['track'][1]['Sampled_Height']
返回 [filesize,malv,duration,file_format,samp_width,samp_height]
#定义一个获取文件名的方法,它是key,它的值是目标列表,返回值是一个字典,参数是文件列表
dict_all={}
#定义保存和提取日志失败的视频文件名
f_fail=open('提取失败 log.log','a',encoding='utf-8') # 追加模式
def get_all_dict(file_list,f_fail):
对于 file_list 中的文件:
filename=os.path.split(file)[1]
打印(文件名)
time.sleep(0.1)
试试:
info_list=get_dict_data(get_media_info(file))
dict_all[文件名]=info_list
例外为 e:
print(filename,'------提取此文件信息失败---------')
f_fail.write(文件名+'\r\n')
f_fail.close()
get_all_dict(file_list,f_fail)
# 用于 dict_all 中的项目:
# print(item,dict_all[item])
#创建一个excel表格存放文件路径信息,第一列是目录,第二列是文件名
wb = xlwt.Workbook()
sh = wb.add_sheet('元数据')
#写第一行
row_count=0
sh.write(row_count,0,"文件名")
sh.write(row_count,1,"文件大小")
sh.write(row_count,2,"比特率")
sh.write(row_count,3,"总持续时间")
sh.write(row_count,4,"视频格式")
sh.write(row_count,5,"帧宽度")
sh.write(row_count,6,"frame height")
#批量写入视频信息
row_count=1
对于 dict_all 中的项目:
sh.write(row_count,0,item)
sh.write(row_count,1,dict_all[item][0])
sh.write(row_count,2,dict_all[item][1])
sh.write(row_count,3,dict_all[item][2])
sh.write(row_count,4,dict_all[item][3])
sh.write(row_count,5,dict_all[item][4])
sh.write(row_count,6,dict_all[item][5])
row_count+=1
#
wb.save("元数据统计.xls")
#
看v2版本
v2版本是提取当前目录下的视频
导入 os,subprocess,json,re,locale,sys
导入 xlwt、时间、关闭
#获取当前文件所在的绝对目录路径
this_path=os.path.abspath('.')
print('当前路径为----', this_path)
dir_path=this_path
# print(os.listdir(this_path))
打印('---------------------------------')
print('--------------程序即将启动----------------')
# dir_path=this_path
#定义一个列表来存放每个文件路径,方便后面的操作
init_list=[]
# dir_path='I:\\3 分钟午餐'
# dir_path='F:\\Dollhouse 总视频'
#创建一个方法,统计每个文件路径,并附加到列表中。使用递归,这里没有获取子目录
def get_all_file(dir_path,init_list):
对于 os.listdir(dir_path) 中的文件:
# 打印(文件)
filepath=os.path.join(dir_path,file)
# 打印(文件路径)
如果 os.path.isdir(filepath):
print('遇到子目录---%s---此版本暂时不提取子目录视频信息--'%(filepath))
time.sleep(2)
# get_all_file(文件路径)
其他:
如果不是 file.endswith('exe'):
init_list.append(文件路径)
返回init_list
#执行上述方法,将每个文件的绝对路径追加到列表中
file_list=get_all_file(dir_path,init_list)
print("读完文件-----3秒后,开始获取详细视频信息-----")
time.sleep(3)
#定义一个方法来获取单个媒体文件的元数据并作为字典数据返回
def get_media_info(file):
pname='D:\mediainfo_i386\MediaInfo.exe "%s" --Output=JSON'%(file)
result=subprocess.Popen(pname,shell=False,stdout=subprocess.PIPE).stdout
list_std=result.readlines()
str_tmp=''
对于 list_std 中的项目:
str_tmp+=bytes.decode(item.strip())
json_data=json.loads(str_tmp)
返回json_data
#定义一个传递字典数据的方法,返回你想要的字段数据,返回一个值列表
def get_dict_data(json_data):
#获取文件大小
filesize=json_data['media']['track'][0]['FileSize']
#获取比特率
malv=json_data['media']['track'][0]['OverallBitRate'][0:4]
#获取播放时长
duration=json_data['media']['track'][0]['Duration'].split('.')[0]
#获取文件类型
file_format=json_data['media']['track'][0]['Format']
#获取边框宽度
samp_width=json_data['media']['track'][1]['Sampled_Width']
#获取框架高度
samp_height=json_data['media']['track'][1]['Sampled_Height']
返回 [filesize,malv,duration,file_format,samp_width,samp_height]
#定义一个获取文件名的方法,它是key,它的值是目标列表,返回值是一个字典,参数是文件列表
dict_all={}
f_fail=open('提取失败 log.log','a',encoding='utf-8') # 追加模式
def get_all_dict(file_list,f_fail):
对于 file_list 中的文件:
filename=os.path.split(file)[1]
打印(文件名)
time.sleep(0.1)
试试:
info_list=get_dict_data(get_media_info(file))
dict_all[文件名]=info_list
例外为 e:
print(filename,'------提取此文件信息失败---------')
f_fail.write(文件名+'\r\n')
f_fail.close()
get_all_dict(file_list,f_fail)
# 用于 dict_all 中的项目:
# print(item,dict_all[item])
#创建一个excel表格存放文件路径信息,第一列是目录,第二列是文件名
wb = xlwt.Workbook()
sh = wb.add_sheet('元数据')
#写第一行
row_count=0
sh.write(row_count,0,"文件名")
sh.write(row_count,1,"文件大小")
sh.write(row_count,2,"比特率")
sh.write(row_count,3,"总持续时间")
sh.write(row_count,4,"视频格式")
sh.write(row_count,5,"帧宽度")
sh.write(row_count,6,"frame height")
row_count=1
对于 dict_all 中的项目:
sh.write(row_count,0,item)
sh.write(row_count,1,dict_all[item][0])
sh.write(row_count,2,dict_all[item][1])
sh.write(row_count,3,dict_all[item][2])
sh.write(row_count,4,dict_all[item][3])
sh.write(row_count,5,dict_all[item][4])
sh.write(row_count,6,dict_all[item][5])
row_count+=1
#
wb.save("元数据统计.xls")
将 v2 版本输入到 exe 文件中
将这个exe文件复制到以下路径
这个程序可以交付给运维同事
测试和验证部分
如何使用,把程序放在视频的同级目录
根据代码缩写,如果视频运行成功:
1、本程序不会处理哈哈目录
2、对于abc.123等无法识别的文件(可能不是视频文件,或损坏的视频文件),本程序会记录日志,不会中断程序的正常运行。
3、程序运行后会有一个失败log.log文件,里面记录了提取信息失败的视频名称,把提取成功的视频文件放在“Metadata Statistics.xls”中
正在测试验证
双击运行
操作结束
Excel 信息
文件大小以字节为单位。如果要以MB或GB显示,可以使用excel表格中的内置公式进行处理。
字段很多,比特率,时长等,这里因为操作只需要下面几个字段,把这些提取出来
如果你把这个exe程序发给你的操作同事,你需要把D盘的mediainfo_i386文件夹一起给他们,这个文件必须放在D盘