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.内部播放界面网页源码
    # 

    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)  

五、效果

python实现网站内部视频批量下载_第1张图片

你可能感兴趣的:(Python)