写了一个脚本爬取了阳光电影的豆瓣高分电影,需要用迅雷帮我一部一部的自动下载好,供我无聊时观看.为什么要一部一部的下?
因为中国移动送了我一张无限流量卡,结果才用了5个G我就被限速到 100kb/s 了,不能忍 不能浪费.遂生出用来给电脑开热点下电影的想法.100kb的网速也只能一部一部下了.完事开头难,我需要知道是否能用命令行控制迅雷下载电影,百度了下,OK,没问题
然后思考了一下,画了个流程图
我大概需要实现3个功能
- 使用命令行控制迅雷下载指定链接
- 检测任务是否开始
- 检测当前任务是否完成,用于确定是否开始下载下一部
功能1 控制迅雷
好了,说说怎么控制迅雷开始下载吧:
百度了一下怎么用命令控制迅雷下载,发现可以在cmd里直接输入 迅雷主程序绝对路径 + 下载连接 控制迅雷开始下载,但是要注意的是路径应放在双引号内,这样当路径包含空格时不会报错,还有就是你的路径肯定跟我的不一样,所以需要自己去找,可以找到快捷方式,然后右键找到文件所在地址,直到找到Thunder.exe
例如:
"D:\Program Files\xunleivip\Program\Thunder.exe" ftp://ygdy8:ygdy8@y201.dygod.org:1132/[阳光电影www.ygdy8.com].冬眠.BD.720p.中文字幕.rmvb
不过有一点需要注意:
不能用迅雷极速版,因为极速版在新建任务时会弹出窗口询问是否开始下载.还关不掉,而迅雷U享版和广为人知的那个很多广告的迅雷可以设置不弹出窗口,我的是U享版
OK,然后就是代码实现了,找对了思路,代码简直是easy
import os
url="ftp://ygdy8:ygdy8@y201.dygod.org:1132/[阳光电影www.ygdy8.com].冬眠.BD.720p.中文字幕.rmvb"
os.system(r'"D:\Program Files\xunleivip\Program\Thunder.exe" {url}'.format(url=url))
url 和程序路径之间是有一个空格的
功能2 检测任务是否开始
一开始我是想找迅雷是否有这样的命令接口什么的,然而并没有(也可能是我没找到)忧郁了半天,忽然想起了迅雷在下载资源时是会有暂存文件的,此文件名是这样的 资源名.xltd 例如
[阳光电影www.ygdy8.com].冬眠.BD.720p.中文字幕.rmvb.xltd
如果任务开始了,就会有这样一个文件,我们只需要去检测这个文件是否存在就可以判断任务是否开始了.代码实现如下:
import os
def check_start(filename):
'''
检测文件是否开始下载
'''
cache_file = filename+".xltd"
return os.path.exists(os.path.join(save_path,cache_file))
代码中的save_path变量是文件保存路径,我的是
save_path="D:\桌面"
功能3 检测任务是否完成
跟功能2的思路是一样的,只有当下载完成时,暂存文件才会变成正常的资源文件名,所以同理,我们去检测是否存在就是.
import os
def check_end(fiename):
'''
检测文件是否下载完成
'''
return os.path.exists(os.path.join(save_path,fiename))
代码中的save_path变量是文件保存路径,我的是
save_path="D:\桌面"
这些方法都是依靠文件名来判断的,我们只需要从链接中提取到文件名即可,怎么提取呢?
ftp://ygdy8:ygdy8@y201.dygod.org:1132/[阳光电影www.ygdy8.com].冬眠.BD.720p.中文字幕.rmvb
可以看到文件名就在连接最后面,我们可以用os.path.split()方法去分割,返回的是个元组
代码实现如下
def get_filename(url):
return os.path.split(url)[1]
开始拼装
OK,需要用到的功能写好了,开始根据流程拼装
首先需要拿到电影资源链接,我保存到了一个txt文件中
大概200多条,不多,所以取出来,保存到一个list即可.
然后一个一个的下载.
写一个方法来下载资源把
def download(url):
'''
下载资源
返回True表示下载完成 否则失败
'''
os.system(r'"D:\Program Files\xunleivip\Program\Thunder.exe" {url}'.format(url=url))
#一定要休眠一段时间,执行命令后要等一会儿迅雷才会新建任务,
#然后还要寻找资源,这都需要时间,大概多久,自己去测试,根据网络、资源不同,寻找资源的速度也不同
#如果没启动迅雷,迅雷还会启动一会儿
time.sleep(20)
filename = get_filename(url)
print("正在下载 {}".format(filename))
#检测任务是否已开始
#有时候会因为资源不存在,或者迅雷该死的版权问题会下载失败
if check_start(filename):
while True:
#每分钟检测一次是否下载完成
time.sleep(60)
if check_end(filename):
return True
else:
return False
好,开始循环遍历一个个的下载把
def main():
#获取所有资源链接
f = open("urls.txt","r")
urls = [url.replace("\n","") for url in f.readlines()]
f.close()
# 开始循环下载
for url in urls:
if download(url):
print("======下载完成======")
else:
print("=======下载失败=====")
if __name__ == '__main__':
print("=======电影自动下载程序启动=========")
main()
好了,运行脚本开始下载把
要是对我的urls.txt感兴趣的话,去下载把,都是豆瓣高分电影
https://pan.baidu.com/s/1nwQ9qfJ
代码全览
import os
import time
save_path="D:\桌面"
def check_end(fiename):
'''
检测文件是否下载完成
'''
return os.path.exists(os.path.join(save_path,fiename))
def check_start(filename):
'''
检测文件是否开始下载
'''
cache_file = filename+".xltd"
return os.path.exists(os.path.join(save_path,cache_file))
def get_filename(url):
return os.path.split(url)[1]
def download(url):
'''
返回True表示下载完成 否则失败
'''
os.system(r'"D:\Program Files\xunleivip\Program\Thunder.exe" {url}'.format(url=url))
time.sleep(20)
filename = get_filename(url)
print("正在下载 {}".format(filename))
if check_start(filename):
while True:
#每分钟检测一次是否下载完成
time.sleep(60)
if check_end(filename):
return True
else:
return False
def main():
#获取所有资源链接
f = open("urls.txt","r")
urls = [url.replace("\n","") for url in f.readlines()]
f.close()
# 开始循环下载
for url in urls:
if download(url):
print("======下载完成======")
else:
print("=======下载失败=====")
if __name__ == '__main__':
print("=======电影自动下载程序启动=========")
main()