pip3 install requests

测试样例

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

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

获取直链

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

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

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

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

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

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

总结展望

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

实战python网络爬虫脚本之家_python爬虫实战,批量下载网站视频相关推荐

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

    写在前面 最近在学vue.js,看到一个网站上有很多视频教程,但在线观看不能倍速播放,就想着用python爬虫批量下载到本地. 安装依赖 pip3 install requests 测试样例 加上序言 ...

  2. python使用you-get批量下载网站视频

    偶然在CSDN上发现有人使用一个叫做you-get的python第三方库,按他的说法基本上可以满足对于主流网站上的视频的批量下载以及单独下载,包括但不限于YouTube,Twitter,bilibil ...

  3. python爬取汽车之家_python爬虫实战之爬取汽车之家网站上的图片

    随着生活水平的提高和快节奏生活的发展.汽车开始慢慢成为人们的必需品,浏览各种汽车网站便成为购买合适.喜欢车辆的前提.例如汽车之家网站中就有最新的报价和图片以及汽车的相关内容,是提供信息最快最全的中国汽 ...

  4. python opencv pdf脚本之家_python opencv实现证件照换底功能

    本文实例为大家分享了python opencv实现证件照换底功能的具体代码,供大家参考,具体内容如下 思路:先转到HSV空间,利用颜色提取背景制作掩模版mask,然后通过按位操作提取人像和制作新背景, ...

  5. 笨办法学Python(第四版)最新版+Python爬虫开发与项目实战+Python网络数据采集+精通Scrapy网络爬虫

    笨办法学Python(第四版)最新版+Python爬虫开发与项目实战+Python网络数据采集+精通Scrapy网络爬虫 本资料为最新整理高清带目录pdf,百度网盘下载~~~ 本资料为最新整理高清带目 ...

  6. python批量下载bilibili视频_python 批量下载bilibili视频的gui程序

    运行效果: 完整代码: # !/usr/bin/python # -*- coding:utf-8 -*- # time: 2019/07/02--08:12 __author__ = 'Henry' ...

  7. python批量下载b站_python 批量下载bilibili视频的gui程序

    运行效果: 完整代码: # !/usr/bin/python # -*- coding:utf-8 -*- # time: 2019/07/02--08:12 __author__ = 'Henry' ...

  8. python批量下载bilibili视频_如何批量下载bilibili的视频?

    貌似现在 you-get 已经支持批量下载了.通过下面命令就可以批量下载了 you-get --playlist 网址 本来是带这个需求来的,看到 Venchi 的答案,装了 Python3 之后发现 ...

  9. 2021-07-07 - 使用脚本批量下载网页视频[如哔哩哔哩] - 学习/实践

    1.应用场景 主要用于使用脚本批量下载web视频,音频,图片资源,进行资源的收集下载,或者避免资源的丢失,使用命令脚本则有利于节省时间,提高效率. 比如资源可能后续不存在,或者,想二次整理资源,更好地 ...

最新文章

  1. HTML的标签描述18
  2. java之 代理设计模式
  3. python字典教程:添加与删除
  4. 12月16日要做的事
  5. css 两边宽度固定中间自适应宽度
  6. 玩转oracle 11g(36):rman备份-控制文件丢失恢复
  7. Handler、AsyncTask、HandlerThread和IntentService之间的对比
  8. 1012 sed 基本命令(进行中)
  9. 茴字有几种写法?SQL排名问题之全局排名的四种解法
  10. 淘宝天猫春节照常发货—轻轻松松“淘宝式过年”
  11. python实现百度语音之语音识别
  12. 如何判断Hadoop集群是否搭建成功
  13. Android开发之简单快速对APP进行GIF动图生成
  14. 什么是网站结构,为什么它很重要?
  15. Qt鼠标拖曳以后松开停留在悬停颜色BUG
  16. 正轴等距离切圆柱投影
  17. Python那么火,到底能用来做什么?我们来说说Python3的主要应用
  18. 数据库系统概论 --- 期末单元集
  19. vue项目图片插入不清晰,原因分析及解决办法
  20. three.js glb 多个_为什么大家都说买奔驰glb的都是人傻钱多?

热门文章

  1. 为oracle数据库新增表空间及用户
  2. 【每日新闻】企业微信与微信消息互通正式开放内测 | IBM宣布针对云原生应用推出Microclimate开发平台
  3. 数论的巴拉拉魔法大门就此打开,请收下这波来自数论的友好邀请信,准备变身各位小魔仙噗哈哈哈哈
  4. 【算法与数据结构】海康相机接收数据转Mat结构
  5. 一个傻子玩DNF的感人事迹(不看必后悔)
  6. <3> JavaScript技术
  7. 利用 ransac 算法拟合平面
  8. 教你批量分析顺丰快递物流,并验证信息是否正确
  9. 薄荷英语---《心理学》20180823
  10. C语言中%d等的意义