网页视频抓取脚本(会把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盘

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线