Python实现一键下载视频脚本
作者:OpenHacker 发布时间:2023-08-26 18:51:17
需求
小编通常会上一些专业的视频网站比如腾讯视频、优酷,在上面看电影、电视剧。这些网站有个优点,可以缓存视频,在通勤路上比如地铁就可以愉快的刷剧了,因为地铁上的网速通常不怎么好。
但是有一些经典电影或者电视剧,这些视频并没有提供,那么我们只能上一些 * 网站看了,资源是有了,但是问题来了,这些 * 网站大多数都没有视频下载功能,那在地铁上就没法看了。
如果可以把这些视频下载下来,再传输到手机里不就可以离线看了吗?
接下来小编就演示下如何用 python 脚本来实现一键下载 * 网站的视频。
以下脚本可以学习到
python selenium 的使用
python requests 的使用
分片下载视频存储本地
实时输出视频下载进度
注意:
这里的脚本主要用于测试学习目的,切勿用于生产环境等商业目的
推荐大家访问官方指定平台或专业视频网站,支持正版
解决方案
小编以经常看的在线之家为例,这个网站可以找到很多美剧资源。
首先,我们用谷歌浏览器打开一个视频地址,比如https://www.zxzj.fun/video/1529-1-1.html,按F12或者右击“检查”打开浏览器控制台
然后,点击控制台最左边的选择元素按钮,或者按Ctrl + Shift + C,选择网页的视频区域,就能看到video
标签
<video
class="dplayer-video dplayer-video-current lwebapp.com"
webkit-playsinline=""
playsinline=""
preload="metadata"
src="https://vod.pipi.cn/8f6897d9vodgzp1251246104/1881b495387702292624167851/f0.mp4"
></video>
可以发现src
属性值就是视频链接,并且是采用单独的.mp4
视频地址,这种地址原理上可以直接从浏览器下载的,直接复制这个地址在浏览器打开,就可以右击下载。但是电视剧通常有很多集,每次都手动打开网页-打开控制台-复制视频地址-再打开视频-最后下载视频,就很繁琐。这时候就是脚本排上用场的时候了,可以把这个流程自动化,简化重复操作的过程。
脚本的整体思路
使用
selenium
打开网页通过
selenium
元素选择器找到video
标签所在的iframe
,切换到iframe
通过
video
标签,获取到视频地址,然后请求视频内容采用分片下载的方式拼接视频存储到本地
代码
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 首发 lwebapp.com
import requests
# 谷歌浏览器驱动
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# sleep模块,让程序停止往下运行
from time import sleep
# 设置谷歌浏览器驱动
driver = webdriver.Chrome()
# 手动改为想要下载的视频所在网页地址
url = 'https://www.zxzj.fun/video/1529-1-1.html'
# 打开网页
driver.get(url)
try:
# 通过元素选择器找到iframe
iframe = WebDriverWait(driver, 10).until(
EC.presence_of_element_located(
(By.CSS_SELECTOR, '#playleft iframe'))
)
except:
driver.quit()
# 获取到网页title,便于直观看到当前下载的视频标题
title = driver.find_elements(By.TAG_NAME, 'title')[
0].get_attribute('innerHTML')
# 切换到iframe
driver.switch_to.frame(iframe)
# 通过video标签获取视频地址
video = driver.find_elements(By.TAG_NAME, 'video')[0]
video_url = video.get_attribute('src')
print('video', video_url)
# 已经获取到视频地址,可以关闭浏览器
driver.quit()
# 设置请求头信息
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.62'
}
# 请求视频内容
video_content = requests.get(video_url, headers=headers, stream=True)
print("开始下载")
# 视频大小
contentLength = int(video_content.headers['content-length'])
line = '大小: %.2fMB'
# 大小换算
line = line % (contentLength/1024/1024)
# 打印视频总长度
print(line)
# 存储已经下载的长度
downSize = 0
print('video_name', title)
# 分片下载
with open(title+'.mp4', "wb") as mp4:
for chunk in video_content.iter_content(chunk_size=1024 * 1024):
if chunk:
mp4.write(chunk)
# 记录已下载视频长度,实时输出下载进度
downSize += len(chunk)
print('进度:{:.2%}'.format(downSize / contentLength), end='\r')
print("下载结束")
来源:https://segmentfault.com/a/1190000041230054
猜你喜欢
- python如何修改索引和行列修改索引修改索引之前是自动生成的索引:使用set_index('以xx字段为索引',inpla
- 有的时候,我们为了保持网页的美观,需要将较长的文字在一定长度时截断。比如我们希望在列表中显示文章标题的前15个字,那么一个这样的标题:“rs
- 前端时间写了一篇《利用CSS框架进行高效率的站点开发》,有不少朋友问我相关的问题。很早5key就在公司进行CSS框架的架构,也对不少朋友提出
- 最初的声明方式在没有@property修饰的情况下,需要分别声明get、set、delete函数,然后初始化property类,将这些方法加
- 1. requests发送文件功能Requests 使得上传多部分编码文件变得很简单url = 'http://httpbin.or
- 本文研究的主要是python PIL实现图片合成的相关内容,具体介绍如下,分享实例代码。在项目中需要将两张图片合在一起。遇到两种情况,一种就
- 问题:数据库实际大小为600MB, 日志文件实际大小为33MB, 但日志文件占用空间为2.8GB!试了多种方式,SHIRNK DATABAS
- 前言:交换机模式主要包括:交换机之发布订阅、交换机之关键字和交换机之通配符。1、交换机之发布订阅 发布订阅和简单的消息队列区别在于
- 前言scikit-learn是Python中最流行的机器学习库之一,它提供了各种各样的机器学习算法和工具,包括分类、回归、聚类、降维等。sc
- 一、前言在调用函数时,大多数情况下,主调函数和被调函用之间有数据传递关系,这就是有参数的函数形式。函数参数的作用是传递数据给函数使用,函数利
- 尽管甲骨文收购Sun交易尚在等待最终结果,业界对开源数据库MySQL的未来命运也十分担忧,但Sun的开发者依然在继续努力研发该开源数据库。他
- 找到detect.py,在大概113行,找到plot_one_box &
- 你可能在使用MySQL过程中,各种意外导致数据库表的损坏,而且这些数据往往是最新的数据,通常不可能在备份数据中找到。本章将讲述如何检测MyS
- 视图层(view)视图函数,简称视图,本质上是一个简单的Python函数,它接受Web请求并且返回Web响应。响应的内容可以是HTML网页,
- 今天发现sympy依赖的库mpmath里也有很多数学函数,其中也有在复平面绘制二维图的函数cplot,具体例子如下from mpmath i
- 参数数量及其作用该函数共有十一个参数,常用的有:名称 name变量规格 shape变量类型 dtype变量初始化方式 initializer
- 介绍本文主要介绍Python中列表生成式的基本知识和使用生成列表要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10
- 二维正态分布采样后,绘制置信椭圆假设二维正态分布表示为:下图为两个二维高斯分布采样后的置信椭圆和每个二维高斯分布采样100个数据点,图片为:
- 在 CodeBit.cn 的论坛中,有人问 Javascript 中如何截取小数位并实现四舍五入,这是一个很常用的 js 技术,帖子中也有网
- Mysql分页采用limt关键字select * from t_order limit 5,10; #返回第6-15行数据select *