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()
执行结果:
文件保存状态