python實現網站內部視訊批量下載

python實現網站內部視訊批量下載

一、背景
在有些時候,當我們突然在某個網站看到一個特別好的視訊(比如高清MV),想把它下載下來,但突然發現,網站並沒有下載連結;這個時候我們一般有幾種解決辦法:

  1. 使用網頁外掛(比如火狐瀏覽器的netVideoHunter)
  2. 在網頁上右鍵–>檢視原始碼–>在網頁程式碼中找到一個隱藏連結入:
<script>var VideoInfoList="potplayer$$高清$http://silent:8080/com/dahdidad/da/silent.mp4$potplayer"</script>

這裡我們通過手動複製貼上http://silent:8080/com/dahdidad/da/silent.mp4 到瀏覽器,也可以實現直接下載

二、需求
但在有些時候我們不僅僅需要下載這些視訊,我們還希望實現批量下載,這是我們會發現,相同視訊的初始連線往往有一個規律,如:http://www.soundsilent.com/video/?156.html,其中變化的數字只是“156”所對應的數字,我們只需要一個遍歷就可以。

三、原理
1. 遍歷url地址 –> 2. 解析地址原始碼 –> 3. 通過字串匹配找到含有”http*******.mp4”的隱藏連結,發出url請求 –> 4. 讀取請求到的視訊資料,並儲存。

四、原始碼

'''
Created on 2017-3-3
@author: soundslow
說明:由於某些視訊網站並不提供下載許可權,但是編碼中隱藏有視訊下載連結,可以通過python來獲取連線並下載;
而且,此方法可以通過遍歷實現批量下載;
幾個缺陷: 1,不能很好地適應所有的隱藏方法,對於不同的網站,可能需要修改不同的匹配正規表示式
2,某些網站可能採取了反爬蟲措施,爬去幾個頁面之後就不能再度訪問,(此時顯示403,拒絕訪問)
'''
import re   
import sys
import os
import urllib.request  
# 實現下載進度條(下載非常緩慢)
def callbackfunc(blocknum, blocksize, totalsize):
global url
percent = 100.0 * blocknum * blocksize / totalsize
if percent > 100:
percent = 100
downsize=blocknum * blocksize
if downsize >= totalsize:
downsize=totalsize
s ="%.2f%%"%(percent) "====>" "%.2f"%(downsize/1024/1024) "M/" "%.2f"%(totalsize/1024/1024) "M \r"
sys.stdout.write(s)
sys.stdout.flush()
if percent == 100:
print('')
# 讀取連線網頁內容原始碼        
def getHtml(url):  
page=urllib.request.urlopen(url)  
html=page.read()  
return html
# 下載視訊檔案(urllib.request.urlretrieve(mp4url,'%s.mp4' %filename,callbackfunc))  
def getMp4(html,filename):  
# r=r"http://.*\.mp4"  
r=r'http://.*?\.mp4'
re_mp4=re.compile(r)  
html=html.decode('utf-8')
mp4List=re.findall(re_mp4,html)  
# 序號2.內部播放介面網頁原始碼
# <script>var VideoInfoList="potplayer$$高清$http://silent:8080/com/dahdidad/da/silent.mp4$potplayer"</script>
for mp4url in mp4List: 
urllib.request.urlretrieve(mp4url,'%s.mp4' %filename,callbackfunc)  
print  ("file %s.mp4 done" % filename)
filename =1 
print('success') 
# 執行起始位置:初始化url連線    (range為連線遍歷範圍)    
# url=input("please input the source url:")  
# 序號1.視訊url地址
# html=getHtml('http://www.soundsilent.com/video/?156.html')  
string="http://www.soundsilent.com/video/?"
for i in range(22010,22101):
url=string str(i) '.html'
print(url)
print(i)
i=i 1
filename=i
html=getHtml(url)  
getMp4(html,filename)  

五、效果

下載進度介面