python下载网站视频_【python爬虫实战】批量下载网站视频

news/2024/5/12 16:24:40/文章来源:https://blog.csdn.net/weixin_33375038/article/details/113499895

写在前面

最近在学vue.js,看到一个网站上有很多视频教程,但在线观看不能倍速播放,就想着用python爬虫批量下载到本地。

安装依赖

pip3 install requests

测试样例

加上序言总共有16个视频,我们用python爬虫技术批量下载到本地。

https://learning.dcloud.io/#/?vid=0

42d5fbcb97567cf3c8c831b0a70f186a.png

获取直链

首先我们要获取视频的下载直链。鼠标右击检查,可以直接看到视频的直链。

b3abb1dad666009024b960deeb19ec21.png

再看一下页面的源代码,发现视频的直链不见了,原来视频直链的位置变成了一个js脚本。

75dc9ed3fd333bdbc10184bf258bf387.png

如果我们直接用requets库请求url的话得到的是源代码,但是源代码里面并没有视频直链,所以我们要考虑换个思路。为什么视频直链的位置会被js替换呢?

爬虫多了你就会知道,这是网页的动态加载,一定有一个js文件里面保存了视频的直链,然后每次加载网页的时候,通过js脚本将视频直链动态加载到html中。

点击网络,筛选js文件,找到了3个js文件,我们先看第一个js文件里面有没有视频直链。搜索视频的标题,直接找到了视频的直链,发现所有的视频直链都被保存到一个名为lesson_list的变量。

3654a41e71957cf89acf27dde38e7627.png

lesson_list里面保存了所有的视频名称和视频直链信息,这里为了统一,将序言改为第0节。

# lesson_list.py

lesson_list = [{

"name": "第0节 vue.js介绍",

"url": "https://vkceyugu.cdn.bspapp.com/VKCEYUGU-learning-vue/52d32740-aecd-11ea-b244-a9f5e5565f30.mp4",

"ask": "77367"

}, {

"name": "第1节 安装与部署",

"url": "https://vkceyugu.cdn.bspapp.com/VKCEYUGU-learning-vue/52dd6070-aecd-11ea-b43d-2358b31b6ce6.mp4",

"ask": "77369"

}, {

"name": "第2节 创建第一个vue应用",

"url": "https://vkceyugu.cdn.bspapp.com/VKCEYUGU-learning-vue/52f3cea0-aecd-11ea-b997-9918a5dda011.mp4",

"ask": "77370"

}, {

"name": "第3节 数据与方法",

"url": "https://vkceyugu.cdn.bspapp.com/VKCEYUGU-learning-vue/52eec590-aecd-11ea-b244-a9f5e5565f30.mp4",

"ask": "77372"

}, {

"name": "第4节 生命周期",

"url": "https://vkceyugu.cdn.bspapp.com/VKCEYUGU-learning-vue/52e63a10-aecd-11ea-b43d-2358b31b6ce6.mp4",

"ask": "77373"

}, {

"name": "第5节 模板语法-插值",

"url": "https://vkceyugu.cdn.bspapp.com/VKCEYUGU-learning-vue/52e72470-aecd-11ea-b997-9918a5dda011.mp4",

"ask": "77375"

}, {

"name": "第6节 模板语法-指令",

"url": "https://vkceyugu.cdn.bspapp.com/VKCEYUGU-learning-vue/98c18710-aecd-11ea-b43d-2358b31b6ce6.mp4",

"ask": "77376"

}, {

"name": "第7节 class与style绑定",

"url": "https://vkceyugu.cdn.bspapp.com/VKCEYUGU-learning-vue/4fe81fd0-aece-11ea-b997-9918a5dda011.mp4",

"ask": "77377"

}, {

"name": "第8节 条件渲染",

"url": "https://vkceyugu.cdn.bspapp.com/VKCEYUGU-learning-vue/98bad050-aecd-11ea-b680-7980c8a877b8.mp4",

"ask": "77378"

}, {

"name": "第9节 列表渲染",

"url": "https://vkceyugu.cdn.bspapp.com/VKCEYUGU-learning-vue/5da98c30-aece-11ea-b244-a9f5e5565f30.mp4",

"ask": "77380"

}, {

"name": "第10节 事件绑定",

"url": "https://vkceyugu.cdn.bspapp.com/VKCEYUGU-learning-vue/98bd6860-aecd-11ea-8bd0-2998ac5bbf7e.mp4",

"ask": "77381"

}, {

"name": "第11节 表单输入绑定",

"url": "https://vkceyugu.cdn.bspapp.com/VKCEYUGU-learning-vue/656e12b0-aece-11ea-a30b-e311646dfaf2.mp4",

"ask": "77382"

}, {

"name": "第12节 组件基础",

"url": "https://vkceyugu.cdn.bspapp.com/VKCEYUGU-learning-vue/98a06a80-aecd-11ea-8bd0-2998ac5bbf7e.mp4",

"ask": "77383"

}, {

"name": "第13节 组件注册",

"url": "https://vkceyugu.cdn.bspapp.com/VKCEYUGU-learning-vue/98ed7910-aecd-11ea-b997-9918a5dda011.mp4",

"ask": "78520"

}, {

"name": "第14节 单文件组件",

"url": "https://vkceyugu.cdn.bspapp.com/VKCEYUGU-learning-vue/79db90b0-aece-11ea-8a36-ebb87efcf8c0.mp4",

"ask": "78521"

}, {

"name": "第15节 免终端开发vue应用",

"url": "https://vkceyugu.cdn.bspapp.com/VKCEYUGU-learning-vue/7e3b8f70-aece-11ea-8ff1-d5dcf8779628.mp4",

"ask": "81004"

}]

批量下载

这里用for循环遍历每一个下载链接,然后使用之前写的一个多线程下载器下载。

from concurrent.futures import ThreadPoolExecutor

from lesson_list import lesson_list

from requests import get, head

import time

class downloader:

def __init__(self, url, num, name):

self.url = url

self.num = num

self.name = name

self.getsize = 0

r = head(self.url, allow_redirects=True)

self.size = int(r.headers['Content-Length'])

def down(self, start, end, chunk_size=10240):

headers = {'range': f'bytes={start}-{end}'}

r = get(self.url, headers=headers, stream=True)

with open(self.name, "rb+") as f:

f.seek(start)

for chunk in r.iter_content(chunk_size):

f.write(chunk)

self.getsize += chunk_size

def main(self):

start_time = time.time()

f = open(self.name, 'wb')

f.truncate(self.size)

f.close()

tp = ThreadPoolExecutor(max_workers=self.num)

futures = []

start = 0

for i in range(self.num):

end = int((i+1)/self.num*self.size)

future = tp.submit(self.down, start, end)

futures.append(future)

start = end+1

while True:

process = self.getsize/self.size*100

last = self.getsize

time.sleep(1)

curr = self.getsize

down = (curr-last)/1024

if down > 1024:

speed = f'{down/1024:6.2f}MB/s'

else:

speed = f'{down:6.2f}KB/s'

print(f'process: {process:6.2f}% | speed: {speed}', end='\r')

if process >= 100:

print(f'process: {100.00:6}% | speed: 00.00KB/s', end=' | ')

break

end_time = time.time()

total_time = end_time-start_time

average_speed = self.size/total_time/1024/1024

print(f'total-time: {total_time:.0f}s | average-speed: {average_speed:.2f}MB/s')

if __name__ == '__main__':

for lesson in lesson_list:

url = lesson['url']

name = lesson['name']

down = downloader(url, 8, name+'.mp4')

down.main()

结果打印

16个视频,总计339MB,用了56s就下载完了。

process: 100.0% | speed: 00.00KB/s | total-time: 2s | average-speed: 2.47MB/s

process: 100.0% | speed: 00.00KB/s | total-time: 3s | average-speed: 6.62MB/s

process: 100.0% | speed: 00.00KB/s | total-time: 3s | average-speed: 3.72MB/s

process: 100.0% | speed: 00.00KB/s | total-time: 4s | average-speed: 7.72MB/s

process: 100.0% | speed: 00.00KB/s | total-time: 4s | average-speed: 5.85MB/s

process: 100.0% | speed: 00.00KB/s | total-time: 7s | average-speed: 7.01MB/s

process: 100.0% | speed: 00.00KB/s | total-time: 3s | average-speed: 4.65MB/s

process: 100.0% | speed: 00.00KB/s | total-time: 4s | average-speed: 6.69MB/s

process: 100.0% | speed: 00.00KB/s | total-time: 3s | average-speed: 5.88MB/s

process: 100.0% | speed: 00.00KB/s | total-time: 4s | average-speed: 5.01MB/s

process: 100.0% | speed: 00.00KB/s | total-time: 3s | average-speed: 6.60MB/s

process: 100.0% | speed: 00.00KB/s | total-time: 4s | average-speed: 6.20MB/s

process: 100.0% | speed: 00.00KB/s | total-time: 3s | average-speed: 5.96MB/s

process: 100.0% | speed: 00.00KB/s | total-time: 2s | average-speed: 4.64MB/s

process: 100.0% | speed: 00.00KB/s | total-time: 3s | average-speed: 6.02MB/s

process: 100.0% | speed: 00.00KB/s | total-time: 4s | average-speed: 6.80MB/s

4530e358ef9f887effc94dd721706d2c.png

总结展望

有时候视频或图片的直链不一定需要爬取,在网页加载的js文件里面说不定就能找到。既然能直接找到,我们何必爬呢?然后下载的时候一定要采用多线程,因为多线程可以占满宽带实现满速下载。

引用参考

https://blog.csdn.net/qq_42951560/article/details/108785802

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_820932.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大型网站架构体系的演变

文章出处来源摘自 微信--IT搬运工 地址:http://mp.weixin.qq.com/s?__bizMzAxNTI4NDAzNA&mid205960169&idx1&sn765e64eef36e5d459d69bbc11dd0c11d&keyc468684b929d2be2dea6dd3defba65255295bcd81d2374e6ab6b07547319d2760635b2617d8ccd8dcb448b446…

python如何爬取图片到指定文件夹_抓取某网站一分类下所有的图片(python小白登天日记)...

废话先不多说,先上代码:import requests from bs4 import BeautifulSoup import os,re import sys reload(sys) sys.setdefaultencoding(utf8) url http://www.bfpgf.com/yld user_agent Mozilla/4.0 (compatible; MSIE 5.5; Windows NT) headers { U…

网站三层架构学习之一 分层式结构

去年参加中软的面试,戴老师就说让好好研究一下petshop。可是今年来了以后,老师让做即墨公司的语音项目,一直进行的是windows编程,没有接触网站方面的。现在项目基本做完了,开始ASP.NET的学习了。 现在petshop的最新版本…

网站三层架构学习之二 整体架构

在上一篇中,我只是对微软的三层架构做了一下介绍,以后将主要结合两个项目:一个是ASP.NET网站模板中的个人网站初学者工具包和petshop 4.0. 因为昨天看的是petshop的,今天就主要说说petshop 4.0的整体架构。 根据三层架构&#xff…

18个优秀的在线图片编辑服务网站

说起编辑图片,可能大多数人都会马上想起强大的Photoshop。事实上,除了购买或下载盗版的PS之外,你还可以使用很多优秀在线图片编辑服务,这些网站大多数都是免费的。对于大部分的人来说,它们提供的功能已经足够强大了。在…

.NET开发人员必知的八个网站

当前全球有数百万的开发人员在使用微软的.NET技术。如果你是其中之一,或者想要成为其中之一的话,我下面将要列出的每一个站点都应该是你的最爱,都应该收藏到书签中去。 对于不熟悉.NET技术的朋友,需要说明一下,.NET提…

乐天酷网站用户体验

万众瞩目的电子商务平台--乐天酷上线了,怀着无比崇敬的心情,我浏览了网站的页面。 乐酷天-中国最大搜索引擎百度和日本最大购物网站乐天联手打造的超大型网络购物商城 看着这口号,两个最大产生出这么大的一个网站,整体色调以大红色…

手机网站重构经验分享(S60V3篇)

前言 做WEB重构的同学都应该知道,我们一般需要在一个操作系统 (Windows XP)和4种以上的浏览器(IE678,Firefox,Chrome,Opera等)上测试页面的兼容性。 相对而言,手机上的页面兼容性测试,相当痛苦!手机光操作系统都有S60V3,S60V5,MTK,Android,Windows Mobile等等,每个操作系统上除…

各位觉得哪个电子商务网站上的购物车做得好?

各位觉得哪个电子商务网站上的购物车做得好? 国内或者国外的都行,现在购物车设计感觉越来越同质化了。添加评论 分享 查看全部 2 个回答 段炼,交互设计 知乎用户 赞同 1. 购物车在首页上的界面和交互设计天猫 亚马逊京东淘宝 1号店 布 局…

我也要谈谈大型网站架构之系列(1)——纵观历史演变(上)

我们知道一个网站都是随着业务的发展,逐渐演变成几万服务器,几亿用户数的大型网站,经历了若干年,甚至上十年的 发展成为大型网站,然而真正亲身经历这个发展过程的人已经不多了,这种人也是拿着公司股票&…

网站性能优化-将Script放到HTML文件中尽量靠近尾部原理

在Yahoo的网站性能优化准则里,其中有一条是将Script放在页面底部, Put Scripts at the Bottom tag: javascript The problem caused by scripts is that they block parallel downloads. The HTTP/1.1 specification suggests that browsers download no…

Centos7下修改mysql5.6编码方式 解决网站中文显示问号

解决办法: 修改MySQL数据库字符编码为UTF-8,UTF-8包含全世界所有国家需要用到的字符,是国际编码。 具体操作: 1、进入MySQL控制台 mysql -u root -p 输入密码 查看当前mysql运行状态 mysql>status 后面四个编码是我在修改之后…

大型网站架构演变和知识体系

之前也有一些介绍大型网站架构演变的文章,例如LiveJournal的、ebay的,都是非常值得参考的,不过感觉他们讲的更多的是每次演变的结果,而没有很详细的讲为什么需要做这样的演变,再加上近来感觉有不少同学都很难明白为什么…

移动电子商务网站建设之概述

题外话 想做这次总结有一段时间了,但是总是这样那样的事情给耽搁。妈妈常说“不怕慢,就怕站”,我决定回来以后一定要把自己在手机当当网一年多以来的积累总结一下。 首先要感谢小白,放手让我处理占手机当当网60%的站点&#xff…

网站的活跃用户与流失用户见解分析

网站用户管理的目标是发掘新用户,保留老用户。但仅仅吸引新用户还不错,还需要保持新用户的活跃度,使其能持久地为网站创造价值;而一旦用户的活跃度下降,很可能用户就会渐渐地远离网站,进而流失。所以基于此…

使用cookie-free domains的方法优化网站性能

YSlow给如何提高网页效率和优化网站性能提供了22条建议,其中有一条是关于域名的:Use cookie-free domains。 使用 cookie-free domains 有什么好处呢?当用户浏览器发送一个静态文件,如图片image、CSS样式表文件时会同时发送同一个…

为何各大网站启用HTTPS?运营商做了“好事”

真的是好事,不加引号的好事。 你可能没有注意到,用百度搜索时,浏览器地址栏里的 http 已经成为永远的过去时,接棒的是更安全的 https。这家中国最大的搜索引擎,于2015年3月份做出了一个重要的决定——全站强制启用 htt…

外贸网站租用香港服务器有哪些好处

外贸网站租用香港服务器有哪些好处 互联网迅猛发展极大地加速经济全球化趋势,贸易、投资自由化己成为当代世界经济发展的潮流,国内外贸企业进军海外市场,由内销转出口已成为企业营销的潮流之举。对中小外贸企业来说,借助香港服务器…

专访 HackerOne COO 王宁:尊重规则是漏洞平台成功的秘诀,欢迎更多成人网站进驻 | 宅客...

本文作者史中,雷锋网主笔。关注网络安全,希望用简单地语言解释科技的一切。 HackerOne是美国著名的漏洞众测公司,它最早开创了一种模式:汇集众多的黑客,一起为企业找漏洞。 目前,全球致命的互联网公司 Yaho…

基于MyEclipse+JSP+Mysql+Tomcat开发得塞北村镇旅游网站设计

塞北村镇旅游网站设计主要用于实现旅游景点信息管理,基本功能包括:主界面模块设计,用户注册模块,旅游景点模块,酒店预订模块,后台管理模块等。本系统结构如下: (1)主界模…