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

1.下载视频的源码如下:
import os
import requests
from bs4 import BeautifulSoup
import threading
from bj.models import Video

# globals(repo_dir = './../tmp')
repo_dir = './../tmp/video'

# 定义请求数据的返回结果的函数
def get_response(url):
    # 为了防止被网站禁止访问,携带浏览器参数,假装浏览器请求
    headers = {
        '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'
    }

    # 取出返回的数据
    response =requests.get(url=url,headers=headers).content
    return response


# 解析网页数据获取视频描述和视频下载url
def get_content_video(html):
# 通过bs4解析,用内置的解析器html.parser
    soup=BeautifulSoup(html,'html.parser')
    # 获取每个视频模块的信息
    cont=soup.select('.j-r-list-c')
    # 定义一个数组存放视频desc+url
    urlList=[]
    for item in cont:
        # 查找第一个a标签的内容,作为我们后面保存MP4的文件名
        name=item.find('a').text
        # 查找视频url
        pmUrl=item.select('.j-video')[0].get('data-mp4')

        # 提取视频id用于后期生成文件名
        video_id=item.select('.j-video')[0].get('data-id')
        #以元组的形式添加到数组
        urlList.append((name,pmUrl,video_id))
    return urlList

# 使用threading异步下载视频
def download(urlList,page):
    #判断'./../tmp/vodeo'文件夹是否存在
    f_path=os.path.join(repo_dir,page)
    if not os._exists(f_path):
        print('路径不存在,马上创建!')
        os.makedirs(f_path)
    for item in urlList:
        #判断当前视频是否有url
        if item[1] is None:
            continue
        # 创建视频的路径-->[-3:]截取文件名后缀
        f_path_video=os.path.join(f_path,'%s.%s'%(item[2],item[1][-3:]))

        #通过多线程的方式下载文件,增加下载速度
        thread=threading.Thread(target=save_video,args=(f_path_video,item[1]))
        #启动线程
        thread.start()

        #如果下载正常则将视频数据存入数据库中
        Video.objects.create(
            video_id=item[2],
            video_url=item[1],
            video_desc=item[0],
        )


# 正式下载视频文件
def save_video(f_path_video,video_url):
    response=get_response(video_url)#调用方法返回MP4文件的二进制流数据
    # 通过文件写入的方式保存成文件
    with open(f_path_video,'wb') as f:
        f.write(response)



#主函数
def main():
    for i in range(1,50):
        print("第" + i + "页")
        url = 'http://www.budejie.com/video/%s' % str(i)
        html = get_response(url)
        urlList=get_content_video(html)
        download(urlList,str(i))

#
# if __name__=="__main__":
#     main()


'''
    ** 由于我们这里仅用于测试,所以我们之抓取一页
    ** 链接最后的数字表示抓取的数据页码,由于首页的1可以不写,也可以写上
    ** 为了大家更好的理解多页的表示,这里我们仅抓取一页,并且链接后面写有页码1
'''
def test():
    url = 'http://www.budejie.com/video/1'
    html = get_response(url)
    urlList = get_content_video(html)
    download(urlList, str(1))

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

import os
import subprocess
import datetime
def substring(date):
    r=date.decode()
    r=r.strip()
    rlist=r.split(":")
    result=(int(rlist[0])*60*60)+(int(rlist[1])*60)+(float(rlist[2]))
    return result


def sub_video():
    # url="/home/facelive/Downloads/videos/"
    # url2="/home/facelive/Downloads/sub_videos/"

    # 硬盘路径(原视频存放路径)
    url="/media/facelive/Elements/videos/"
    # 切割后的视频存放路径
    url2="/media/facelive/Elements/sub_videos/"
    fileList= os.listdir(url)


    for file in fileList:
        #获取当前文件的视频长度
        strcmd=["ffmpeg -i "+url+file+" 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//"]
        result=subprocess.run(args=strcmd,stdout=subprocess.PIPE,shell=True)
        date=result.stdout
        print(type(date))
        print(date)
        time=substring(date)
        end=time-4
        sub="ffmpeg -ss 0 -t "+str(end)+" -accurate_seek -i "+url+file+" -codec copy -avoid_negative_ts 1 "+url2+file+''

        videoresult=subprocess.run(args=sub,shell=True)
        print(time)
    print("视频截取完成!!")


def test():
    url = "/home/facelive/Downloads/videos/"
    fileList = os.listdir(url)
    for file in fileList:
        print(file)
3.加入水印

import os
import subprocess
import datetime

def logo_video():
   
    # 硬盘路径
    url = "/media/facelive/Elements/videos/"
    url3="/media/facelive/Elements/logo_videos/"
    fileList = os.listdir(url)

    for file in fileList:

        sub = "ffmpeg -i "+url+file+" -i /home/facelive/Downloads/image/11.png -filter_complex overlay=W-w " + url3 + file + ''

        videoresult = subprocess.run(args=sub, shell=True)
    print("视频logo完成!!")



  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值