当前位置:   article > 正文

Python实现下载视频_python下载视频

python下载视频

        首先

我爬取的是茶杯狐网站的视频,视频为m3u8格式,需要下载多个小片段最后再进行拼接。

网址为   

茶杯狐 cupfox官网-最新电影电视剧免费在线观看 (shjhbox.com)icon-default.png?t=N6B9https://www.shjhbox.com/

因为拼接过程中需要使用到ffmpeg软件,所以要在系统中进行环境变量的配置,具体参考如下

windows安装ffmpeg并配置环境变量_ffmpeg环境变量配置_wanggangname的博客-CSDN博客icon-default.png?t=N6B9https://blog.csdn.net/wanggangname/article/details/126335944

需要注意的是,配置完成后,应在命令行中输入ffmpeg -version命令检测是否配置成功,有些电脑的python编译器可能无法立即检测到环境变量是否配置,重启之后即可解决。

配置完成如下

 

接下来是Python代码

  1. import os
  2. import re
  3. import threading
  4. import time
  5. from concurrent.futures import ThreadPoolExecutor, wait
  6. import requests
  7. # 定义全局变量,记录ts文件下载数
  8. num = 0
  9. headers = {
  10. "User-Agent":
  11. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"
  12. }
  13. # 电影名称
  14. name = ''
  15. def get_m3u8_list(url):
  16. global name
  17. session = requests.Session()
  18. # 获取网页内容
  19. resp = session.get(url, headers=headers).text
  20. # 获取标题
  21. name = re.findall("var vod_name = '(.*?)'", resp)[0].replace(' ', '')
  22. # 获取第一个m3u8的内容
  23. first_m3u8_url = re.findall('"link_pre":"","url":"(.+?index.m3u8)"', resp)[0].replace('\\', '')
  24. first_m3u8 = session.get(first_m3u8_url, headers=headers)
  25. # 获取第二个m3u8的内容
  26. if 'http' in first_m3u8.text:
  27. second_m3u8_url = re.findall('(http.*?m3u8)', first_m3u8.text)[0]
  28. else:
  29. second_m3u8_url = 'https:' + '//' + first_m3u8_url.split('/')[2] + '/' + \
  30. re.findall('/(.*?m3u8)', first_m3u8.text)[
  31. 0]
  32. second_m3u8 = session.get(second_m3u8_url, headers=headers)
  33. m3u8_url_list = re.findall('(htt.*?ts)', second_m3u8.text)
  34. return m3u8_url_list
  35. # 下载单个ts文件
  36. def download_one_m3u8(m3u8_url, path, i):
  37. global num
  38. m3u8 = requests.get(m3u8_url, headers=headers)
  39. print(i, '开始下载')
  40. with open(path + f'/{i}.ts', mode='wb') as f:
  41. f.write(m3u8.content)
  42. print(i, '下载完成')
  43. # 每下载一个文件,数量加1
  44. num += 1
  45. # 下载全部ts文件
  46. def download_all_m3u8(lists):
  47. path = './' + name
  48. if not os.path.exists(path):
  49. os.mkdir(path)
  50. # 创建线程池
  51. pool = ThreadPoolExecutor(200)
  52. i = 0
  53. tasks = []
  54. for item in lists:
  55. tasks.append(pool.submit(download_one_m3u8, item, path, i))
  56. i += 1
  57. # 等待下载完毕
  58. wait(tasks)
  59. merge(path)
  60. def merge(filePath, filename='output'):
  61. '''
  62. 进行ts文件合并 解决视频音频不同步的问题 建议使用这种
  63. :param filePath:
  64. :return:
  65. '''
  66. # 根据当前文件名称的数字进行排序
  67. file_list = sorted(os.listdir(filePath), key=lambda x: int(x.split('.')[0]))
  68. length = len(file_list)
  69. # ./ts/1.ts|./ts/2.ts ...
  70. # ffmpeg 无法一次拼接过多文件,应分开拼接,最后合并
  71. for i in range(int(length / 100) + 1):
  72. Str = ''
  73. # 一次拼接100个
  74. for j in range(i * 100, (i + 1) * 100):
  75. if j == length:
  76. break
  77. Str += f'{filePath}/' + file_list[j] + '|'
  78. cmd = f'ffmpeg -i "concat:{Str}" -c copy "{name + str(i)}.ts"'
  79. print(os.system(cmd))
  80. mp4 = ''
  81. # 拼接最终的文件
  82. for i in range(int(length / 100) + 1):
  83. mp4 += f'./{name + str(i)}.ts|'
  84. cmd = f'ffmpeg -i "concat:{mp4}" -c copy "./电影/{name}.mp4"'
  85. print(os.system(cmd))
  86. # 删除中间过程中产生的ts文件
  87. for i in range(int(length / 100) + 1):
  88. remove = f'del {name + str(i)}.ts'
  89. os.system(remove)
  90. # 删除所有ts文件
  91. os.system(f'rd {name} /s /q ')
  92. merge(f'./{name}')
  93. # 定时执行结束函数,强制程序退出
  94. def jieshu():
  95. global num
  96. # 循环检查当前是否在下载文件,如果超出30秒未下载文件,则停止下载,并将已下载的文件拼接完整
  97. while 1:
  98. num1 = num
  99. print('已下载', num)
  100. time.sleep(30)
  101. if num1 == num:
  102. merge(f'./{name}')
  103. print('下载结束')
  104. os.system("taskkill /f /t /im python.exe")
  105. if __name__ == '__main__':
  106. url = input('请输入url')
  107. print('开始下载')
  108. # url = 'https://www.shjhbox.com/vodplay/66776-1-1.html'
  109. # 创建文件夹
  110. if not os.path.exists('./电影'):
  111. os.mkdir('./电影')
  112. # 获取下载文件目录
  113. m3u8_url_list = get_m3u8_list(url)
  114. # 开始计时
  115. threading.Thread(target=jieshu).start()
  116. print('over')
  117. # 开始下载
  118. download_all_m3u8(m3u8_url_list)

 有些软件包可能需要自己下载,如果无法下载的话建议使用阿里的源进行下载。

效果展示

 

而且,这个网站可能会比较卡,所以建议线程开的少一点,代码中同时开了100个线程,

并且设置了如果30秒没有下载任何文件,则直接停止下载,并将已下载好的视频拼接完成,

也可以适当延长时间

url的输入格式为播放页的地址,如下

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/154632
推荐阅读
相关标签
  

闽ICP备14008679号