寫了一個腳本爬取了陽光電影的豆瓣高分電影,需要用迅雷幫我一部一部的自動下載好,供我無聊時觀看.為什么要一部一部的下?
因為中國移動送了我一張無限流量卡,結果才用了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()