python 视频下载

网页视频下载,让用户选择,并保存在本地

# -*- coding: utf-8 -*-
import os
import requests
from bs4 import BeautifulSoup


def get_mp4_url(video_id):
    """ 根据视频ID构造视频的下载地址(已破解)"""
    data = requests.get(
        url="https://www.pearvideo.com/videoStatus.jsp?contId={}".format(video_id),
        headers={
            "Referer": "https://www.pearvideo.com/video_{}".format(video_id),
        }
    )
    response = data.json()
    image_url = response['videoInfo']['video_image']
    video_url = response['videoInfo']['videos']['srcUrl']
    middle = image_url.rsplit('/', 1)[-1].rsplit('-', 1)[0]
    before, after = video_url.rsplit('/', 1)
    suffix = after.split('-', 1)[-1]
    url = "{}/{}-{}".format(before, middle, suffix)
    return url


def get_video_list(page):
    """
    获取梨视频最新视频列表
    :param page: 页码
    :return:
    """
    data_list = []
    res = requests.get(
        url="https://www.pearvideo.com/category_loading.jsp?reqType=14&categoryId=&start={}".format(page)
    )
    bs = BeautifulSoup(res.text, 'lxml')
    a_list = bs.find_all("a", attrs={'class': "vervideo-lilink"})
    for tag in a_list:
        title = tag.find('div', attrs={'class': "vervideo-title"}).text.strip()
        video_id = tag.get('href').split('_')[-1]
        mp4_url = get_mp4_url(video_id)
        data_list.append([video_id, title, mp4_url])
    return data_list


def choice(*data):
    """
    获取视频id和视频名称
    :param data: 梨视频最新视频列表
    :return: 视频id,视频名称
    """
    while True:
        download_num = input("请输入下载序号:(退出Q)")
        if download_num.upper() == "Q":
            return
        if not download_num.isdecimal():
            print("请输入正确数字")
            continue
        if int(download_num) > len(data):
            print("请输入正确数字")
            continue
        video_num = data[int(download_num) - 1][0]
        name = data[int(download_num) - 1][1]
        return video_num, name


def save_dir(videonum, videoname):
    """
    创建文件夹,并写入info文件
    :param videonum: 视频id
    :param videoname: 视频名称
    :return: 视频保存文件夹
    """
    filedir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "pearvideo", str(videonum))
    if os.path.exists(filedir):
        print("文件已存在,不再重复下载")
        return
    os.makedirs(filedir)
    f = open("{}{}info.txt".format(filedir, os.path.sep), mode="w", encoding="utf-8")
    f.write(videoname)
    f.close()
    return filedir


def download(file_name, url):
    """
    下载视频
    :param file_name: 视频保存名字
    :param url: 视频下载url
    :return: None
    """
    res = requests.get(
        url=url
    )
    with open(file_name, mode='wb') as file_object:
        # 分块读取下载的视频文件(最多一次读512字节),并逐一写入到文件中。 len(chunk)表示实际读取到每块的视频文件大小。
        for chunk in res.iter_content(512):
            file_object.write(chunk)
            file_object.flush()
        file_object.close()

    res.close()


def run():
    while True:
        page = input("请输入页码:(退出Q)")
        if page.upper() == "Q":
            print("谢谢使用!再见!")
            return
        if not page.isdecimal():
            print("请输入正确数字")
            continue
        data_list = get_video_list(page)
        print("请选择下载视频序号:")
        num = 1
        for item in data_list:
            print("{} {}".format(num, item[1]))
            num += 1
        _ = choice(*data_list)
        if _ is None:
            continue
        video_num, video_name = _
        download_url = get_mp4_url(video_num)
        savedir = save_dir(video_num, video_name)
        if savedir is None:
            return
        filename = "{}{}{}".format(savedir, os.path.sep, download_url.split("/")[-1])
        download(filename, download_url)
        print("下载完成!")
        return


if __name__ == '__main__':
    run()

执行结果:
image
文件保存状态
image

posted @ 2021-12-09 11:38  咖啡馆  阅读(100)  评论(0编辑  收藏  举报