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()
执行结果:
文件保存状态
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了