一、背景
在有些时候,当我们突然在某个网站看到一个特别好的视频(比如高清MV),想把它下载下来,但突然发现,网站并没有下载链接;这个时候我们一般有几种解决办法:
<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)
五、效果