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.pswp.cn/news/533936.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/533936.shtml
英文地址,請注明出處:http://en.pswp.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短信驗證過程…