python爬取哔哩哔哩视频_Python实现视频爬取下载

注:源内容来自公众号【python学习开发】

一般情况下我们使用爬虫更多的是对数据或者图片进行爬取,今天在这里和大家分享一下关于使用爬虫技术来进行视频下载的方法,不仅可以方便的下载一些体积小的视频,针对大容量的视频下载同样试用。

接下来我们来介绍此次爬取视频过程中用到的模块和方法。

requests模块的iter_content方法

这里我们使用的是python的requests模块作为例子,我们使用response.text获取文本信息,使用response.content获取字节流,比如下载图片保存到一个文件,而对于大个的文件我们需要采取分块读取的方式。

requests.get方法的stream

第一步,我们需要设置requests.get的stream参数为True。

默认情况下是stream的值为false,它会立即开始下载文件并存放到内存当中,倘若文件过大就会导致内存不足的情况.

当把get函数的stream参数设置成True时,它不会立即开始下载,当你使用iter_content或iter_lines遍历内容或访问内容属性时才开始下载。需要注意一点:文件没有下载之前,它也需要保持连接。

iter_content:一块一块的遍历要下载的内容

iter_lines:一行一行的遍历要下载的内容

使用上面两个函数下载大文件可以防止占用过多的内存,因为每次只下载小部分数据。

示例代码:

r = requests.get(url_file, stream=True)

f = open("file_path", "wb")

for chunk in r.iter_content(chunk_size=512):

if chunk:

f.write(chunk)

上面的代码表示请求了url_file,这个url_file是一个大文件,所以开启了stream模式,然后通过迭代r对象的iter_content方法,同时指定chunk_size=512(即每次读取512个字节)来进行读取。但是如果仅仅是迭代是不行,如果下载中途出现问题我们之前的努力就白费了,所以我们需要做到一个断点续传的功能。

断点续传

所谓断点续传,也就是要从文件已经下载的地方开始继续下载。在以前版本的 HTTP 协议是不支持断点的,HTTP/1.1 开始就支持了。一般断点下载时会用到 header请求头的Range字段,这也是现在许多多线程下载工具(如 FlashGet、迅雷等)实现多线程下载的核心所在。

如何在代码中实现用呢?

HTTP请求头Range

range是请求资源的部分内容(不包括响应头的大小),单位是byte,即字节,从0开始.

如果服务器能够正常响应的话,服务器会返回 206 Partial Content 的状态码及说明.

如果不能处理这种Range的话,就会返回整个资源以及响应状态码为 200 OK .(这个要注意,要分段下载时,要先判断这个)

Range请求头格式

Range: bytes=start-end

Range头域

Range头域可以请求实体的一个或者多个子范围。例如,

表示头500个字节:bytes=0-499

表示第二个500字节:bytes=500-999

表示最后500个字节:bytes=-500

表示500字节以后的范围:bytes=500-

第一个和最后一个字节:bytes=0-0,-1

同时指定几个范围:bytes=500-600,601-999

例如

Range: bytes=10- :第10个字节及最后个字节的数据

Range: bytes=40-100 :第40个字节到第100个字节之间的数据.

注意,这个表示[start,end],即是包含请求头的start及end字节的,所以,下一个请求,应该是上一个请求的[end+1, nextEnd]

下载实例

下面我们通过具体的代码去进一步了解一些细节。

import requests

import tqdm

def download_from_url(url, dst):

response = requests.get(url, stream=True) #(1)

file_size = int(response.headers['content-length']) #(2)

if os.path.exists(dst):

first_byte = os.path.getsize(dst) #(3)

else:

first_byte = 0

if first_byte >= file_size: #(4)

return file_size

header = {"Range": f"bytes={first_byte}-{file_size}"}

pbar = tqdm(

total=file_size, initial=first_byte,

unit='B', unit_scale=True, desc=dst)

req = requests.get(url, headers=header, stream=True) #(5)

with(open(dst, 'ab')) as f:

for chunk in req.iter_content(chunk_size=1024): #(6)

if chunk:

f.write(chunk)

pbar.update(1024)

pbar.close()

return file_size

下面我们开始解读标有注释的代码:

tqdm是一个可以显示进度条的包,具体的用法可以参考官网文档:https://pypi.org/project/tqdm/

(1)设置stream=True参数读取大文件。

(2)通过header的content-length属性可以获取文件的总容量。

(3)获取本地已经下载的部分文件的容量,方便继续下载,当然需要判断文件是否存在,如果不存在就从头开始下载。

(4)本地已下载文件的总容量和网络文件的实际容量进行比较,如果大于或者等于则表示已经下载完成,否则继续。

(5)开始请求视频文件了

(6)循环读取每次读取一个1024个字节,当然你也可以设置512个字节

效果演示

首先调用上面的方法并传入参数。视频我找的是南京大学的一个新闻视频。

url="http://news.nju.edu.cn/uploadfiles/media/49debf11202e95e696120c74020ff658.mp4"

download_from_url(url, "NanDa.mp4")

效果如下图所示:爬取NanDa新闻视频

我们打开文件来看下视频如何:爬取的视频

可以发现这个视频被成功的下载下来。

对于单文件的下载我们就完成,但是如果爬取的是多集的连续剧,我们下载一个系列的话,我们就得使用并发了,将在下一章讲述。

Github地址:https://github.com/muzico425/mp4download

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

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

相关文章

java约瑟夫环pta上_cdoj525-猴子选大王 (约瑟夫环)

约瑟夫斯问题问题有时候也被描述成猴子选大王问题,题目如下.(最后会贴上约瑟夫问题的来历) 一群猴子排成一圈,按1,2,…,n依次编号. 然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴…

java++记录+运行_记录java+testng运行selenium(三)---xml、ini、excel、日志等配置

一: ini文件ini目前只用处存储浏览类型及需要打开的url,ini文件放在configs文件夹下面。读取ini代码如下:1 packagetoolskit.documents;23 import java.io.*;4 import java.util.*;56 /**7 * ClassName: ReadIni8 * Author: DingDong9 * D…

python字符串前面加f什么意思_Python 字符串前面加u,r,b,f的含义

1、字符串前加 u例:u"我是含有中文字符组成的字符串。"作用:后面字符串以 Unicode 格式 进行编码,一般用在中文字符串前面,防止因为源码储存格式问题,导致再次使用时出现乱码。2、字符串前加 r例&#xff1a…

mysql居左查询abcd_MySql速查手册

索引定义索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B树的形式保存。就像是数据的目录。索引类型唯一索引主键索引B-Tree普通索引R-Tree联合索引Hash全文索引FullText在mysql中fulltext索引只针对myisam生效。符合索引对于创建的多列索引(复合索引)&…

和python哪个容易胖_为什么有些人特别容易胖?

7种人,最容易被肥胖盯上,其中有你吗?胖,总是来得猝不及防,肥肉也总是不知不觉地长出来……许多胖友对自己的身材老摸不着脑,其实,长胖都是有迹可循的!正如下面这7类人,就…

loadrunner 错误: 无法找到 java.exe_LoadRunner错误及解决方法总结

1. error:missing newline in d:\loadrunner\name.dat场景执行时报error:missing newline in d:\loadrunner\name.dat第二次执行不报两个解决办法:第一:如果参数不是很多的话,不要打开记事本去编辑参数,就直接在LR提供的参数的表格…

gif透明背景动画_【超实用干货! 】iPad上的动画App大推荐

作者/立夏编辑/彼方大家好,我是立夏。大概在两年前吧我为大家写过几款动画APP的评测,这一次我也想给大家推荐一些我的新宠,供大家参考。我在这里就不过多提及如Animation Desk、Procreate或是Callipeg之类知名度相对更高一些的动画App了&…

python框架是干什么的_django框架是干什么的

django(Python Web 框架)Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,视图V和模版T。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。…

iphone如何信任软件_【手机软件】千禾影院:全新观影神器,支持安卓+iOS,最新、最全、高清、免费!...

Hello,大家好,我是春哥!每天记得打卡哦!感谢每一位小伙伴们的关注和支持!免责声明大部分资源来源于网络,仅供学习和交流使用,如有侵权请联系我们删除。每期文章末尾都会有关键词,在公众号发消息…

Java小魔女芭芭拉_沉迷蘑菇不可自拔,黏土人《小魔女学园》苏西·曼芭芭拉 图赏...

GOOD SMILE出品的黏土人系列手办新作——《小魔女学园》苏西曼芭芭拉,已经开始接受预定了。这款黏土人的原型师是来自中国上海的陈天,售价4167日元,预计2018年4月发售。苏西是主人公亚可的室友,她是从东南亚来的身份不明的魔女。热…

java int相除向上取整_java实战项目常用类,Date、Calendar、BigDecimal、Math、UUID

Java开发中经常用到的类和方法,以下主要就日期是时间处理、金融数字处理、数学计算、随机数、MD5加密等。java.util.Date类java.util 包提供了 Date 类来封装当前的日期和时间。 Date 类提供两个构造函数来实例化 Date 对象。日期时间的本质是一个long,它…

python四级中考有用的_一位中考生家长的后悔药:考前30多天,千万别做这7件傻事...

中考即将来临,考后必定是几家欢乐几家愁,有庆幸的、有后悔的。中考前的几个月到底应该怎么过?考前考中需要注意什么?家长做哪些事情是画蛇添足的。今天给大家推荐一位“中考失败”学子父亲的自白,其中有对优秀儿子的心疼&#xf…

R语言中dim函数_R语言--向量化计算(apply族函数)

R语言最优秀的是它的向量化编程,这其中apply族函数扮演了非常重要的角色。apply族函数是由apply、sapply、lapply、mapply、tapply等函数组成的。熟练使用apply族函数,能够简化程序,提高代码的运算速度。软件&环境win10 64bitR 3.6.1appl…

php+mysql记事本_一个简单记事本php操作mysql辅助类创建

//SqlHelper.class.phpconnmysql_connect($this->host,$this->user,$this->passwrd); if(!$this->conn){ die("连接失败".mysql_error()); } mysql_select_db($this->db); mysql_query("set names utf8"); } //增删改 function execute_dml…

python init方法做了什么_Python类方法、__new__方法和__init__方法分别是什么

Python类方法、__new__方法和__init__方法分别是什么发布时间:2020-09-03 15:24:06来源:亿速云阅读:104作者:小新这篇文章主要介绍Python类方法、__new__方法和__init__方法分别是什么,文中介绍的非常详细,…

谷歌浏览器中文版_中国科学家设计超薄指尖传感器,厚度不到A4纸五分之一 / 谷歌发布地图时光机:百年前,你家街道啥样?/ AI看图说话首超人类...

关注我们了解计算机视觉最新动态 !动态先览1中国科学家设计超薄指尖传感器,厚度不到A4纸五分之一2谷歌发布地图「时光机」:100年前,你家街道长啥样?3仿真环境跟车2分钟,就让自动驾驶系统撞上马路牙子&#…

300小时成为java程序员_直击面试现场: Java程序员3轮6小时面试, 成功拿到阿里offer!...

原标题:直击面试现场: Java程序员3轮6小时面试, 成功拿到阿里offer!今天给大家分享一位Java程序员小伙去阿里应聘的经历!从Java开发要掌握的技术来讲,前面已经说得差不多了。我主要想从面试者的角度谈一谈看法。如果是我面试,就给…

python 判断每月最后一天_python获取某年中每个月的第一天和最后一天的两种方法...

搜索关键字:python get every first day of month参考解答:方法一:>>> import calendar>>> calendar.monthrange(2002,1)(1, 31)>>> calendar.monthrange(2008,2)(4, 29)>>> calendar.monthrange(2100,2…

anaconda python3.8目录_MacBook Pro 安装anaconda、配置环境

新入手了MacBook Pro,iOS系统还不算非常熟练...作为一个新手程序员,在python开发道路上的学习就从安装环境开始吧:1、下载安装包2、安装过程一路同意or继续...不过,mac上弹出不允许在当前路径安装,那么选择自定义安装路…

中国网建java发送短信_短信验证登陆-中国网建提供的SMS短信平台

一、JAVA发送手机短信常见的有三种方式(如下所列):使用webservice接口发送手机短信,这个可以使用sina提供的webservice进行发送,但是需要进行注册使用短信mao的方式进行短信的发送,这种方式应该是比较的常用,前提是需要购买硬件设备。二、一下整理了SMS短信验证过程…