20190728-Python爬取视频&切割视频&视频加水印

1.视频爬取

  1 1.下载视频的源码如下:
  2 import os
  3 import requests
  4 from bs4 import BeautifulSoup
  5 import threading
  6 from bj.models import Video
  7  
  8 # globals(repo_dir = './../tmp')
  9 repo_dir = './../tmp/video'
 10  
 11 # 定义请求数据的返回结果的函数
 12 def get_response(url):
 13     # 为了防止被网站禁止访问,携带浏览器参数,假装浏览器请求
 14     headers = {
 15         'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
 16     }
 17  
 18     # 取出返回的数据
 19     response =requests.get(url=url,headers=headers).content
 20     return response
 21  
 22  
 23 # 解析网页数据获取视频描述和视频下载url
 24 def get_content_video(html):
 25 # 通过bs4解析,用内置的解析器html.parser
 26     soup=BeautifulSoup(html,'html.parser')
 27     # 获取每个视频模块的信息
 28     cont=soup.select('.j-r-list-c')
 29     # 定义一个数组存放视频desc+url
 30     urlList=[]
 31     for item in cont:
 32         # 查找第一个a标签的内容,作为我们后面保存MP4的文件名
 33         name=item.find('a').text
 34         # 查找视频url
 35         pmUrl=item.select('.j-video')[0].get('data-mp4')
 36  
 37         # 提取视频id用于后期生成文件名
 38         video_id=item.select('.j-video')[0].get('data-id')
 39         #以元组的形式添加到数组
 40         urlList.append((name,pmUrl,video_id))
 41     return urlList
 42  
 43 # 使用threading异步下载视频
 44 def download(urlList,page):
 45     #判断'./../tmp/vodeo'文件夹是否存在
 46     f_path=os.path.join(repo_dir,page)
 47     if not os._exists(f_path):
 48         print('路径不存在,马上创建!')
 49         os.makedirs(f_path)
 50     for item in urlList:
 51         #判断当前视频是否有url
 52         if item[1] is None:
 53             continue
 54         # 创建视频的路径-->[-3:]截取文件名后缀
 55         f_path_video=os.path.join(f_path,'%s.%s'%(item[2],item[1][-3:]))
 56  
 57         #通过多线程的方式下载文件,增加下载速度
 58         thread=threading.Thread(target=save_video,args=(f_path_video,item[1]))
 59         #启动线程
 60         thread.start()
 61  
 62         #如果下载正常则将视频数据存入数据库中
 63         Video.objects.create(
 64             video_id=item[2],
 65             video_url=item[1],
 66             video_desc=item[0],
 67         )
 68  
 69  
 70 # 正式下载视频文件
 71 def save_video(f_path_video,video_url):
 72     response=get_response(video_url)#调用方法返回MP4文件的二进制流数据
 73     # 通过文件写入的方式保存成文件
 74     with open(f_path_video,'wb') as f:
 75         f.write(response)
 76  
 77  
 78  
 79 #主函数
 80 def main():
 81     for i in range(1,50):
 82         print("" + i + "")
 83         url = 'http://www.budejie.com/video/%s' % str(i)
 84         html = get_response(url)
 85         urlList=get_content_video(html)
 86         download(urlList,str(i))
 87  
 88 #
 89 # if __name__=="__main__":
 90 #     main()
 91  
 92  
 93 '''
 94     ** 由于我们这里仅用于测试,所以我们之抓取一页
 95     ** 链接最后的数字表示抓取的数据页码,由于首页的1可以不写,也可以写上
 96     ** 为了大家更好的理解多页的表示,这里我们仅抓取一页,并且链接后面写有页码1
 97 '''
 98 def test():
 99     url = 'http://www.budejie.com/video/1'
100     html = get_response(url)
101     urlList = get_content_video(html)
102     download(urlList, str(1))
103  

2. 切割视频 - 视频尾部多余部分的切割(这里需要安装ffmpeg很简单,问度娘)

 1 import os
 2 import subprocess
 3 import datetime
 4 def substring(date):
 5     r=date.decode()
 6     r=r.strip()
 7     rlist=r.split(":")
 8     result=(int(rlist[0])*60*60)+(int(rlist[1])*60)+(float(rlist[2]))
 9     return result
10  
11  
12 def sub_video():
13     # url="/home/facelive/Downloads/videos/"
14     # url2="/home/facelive/Downloads/sub_videos/"
15  
16     # 硬盘路径(原视频存放路径)
17     url="/media/facelive/Elements/videos/"
18     # 切割后的视频存放路径
19     url2="/media/facelive/Elements/sub_videos/"
20     fileList= os.listdir(url)
21  
22  
23     for file in fileList:
24         #获取当前文件的视频长度
25         strcmd=["ffmpeg -i "+url+file+" 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//"]
26         result=subprocess.run(args=strcmd,stdout=subprocess.PIPE,shell=True)
27         date=result.stdout
28         print(type(date))
29         print(date)
30         time=substring(date)
31         end=time-4
32         sub="ffmpeg -ss 0 -t "+str(end)+" -accurate_seek -i "+url+file+" -codec copy -avoid_negative_ts 1 "+url2+file+''
33  
34         videoresult=subprocess.run(args=sub,shell=True)
35         print(time)
36     print("视频截取完成!!")
37  
38  
39 def test():
40     url = "/home/facelive/Downloads/videos/"
41     fileList = os.listdir(url)
42     for file in fileList:
43         print(file)

3. 视频加水印

 1 import os
 2 import subprocess
 3 import datetime
 4  
 5 def logo_video():
 6    
 7     # 硬盘路径
 8     url = "/media/facelive/Elements/videos/"
 9     url3="/media/facelive/Elements/logo_videos/"
10     fileList = os.listdir(url)
11  
12     for file in fileList:
13  
14         sub = "ffmpeg -i "+url+file+" -i /home/facelive/Downloads/image/11.png -filter_complex overlay=W-w " + url3 + file + ''
15  
16         videoresult = subprocess.run(args=sub, shell=True)
17     print("视频logo完成!!")

转载:https://blog.csdn.net/wsywb111/article/details/78855145 

Python爬取百思不得姐的视频+视频的切割+给视频添加水印

 

posted @ 2019-07-28 14:40  ElonJiang  阅读(1371)  评论(0编辑  收藏  举报