寫了一個(gè)腳本爬取了陽光電影的豆瓣高分電影,需要用迅雷幫我一部一部的自動(dòng)下載好,供我無聊時(shí)觀看.為什么要一部一部的下?
因?yàn)橹袊苿?dòng)送了我一張無限流量卡,結(jié)果才用了5個(gè)G我就被限速到 100kb/s 了,不能忍 不能浪費(fèi).遂生出用來給電腦開熱點(diǎn)下電影的想法.100kb的網(wǎng)速也只能一部一部下了.完事開頭難,我需要知道是否能用命令行控制迅雷下載電影,百度了下,OK,沒問題
然后思考了一下,畫了個(gè)流程圖
我大概需要實(shí)現(xiàn)3個(gè)功能
- 使用命令行控制迅雷下載指定鏈接
- 檢測任務(wù)是否開始
- 檢測當(dāng)前任務(wù)是否完成,用于確定是否開始下載下一部
功能1 控制迅雷
好了,說說怎么控制迅雷開始下載吧:
百度了一下怎么用命令控制迅雷下載,發(fā)現(xiàn)可以在cmd里直接輸入 迅雷主程序絕對路徑 + 下載連接 控制迅雷開始下載,但是要注意的是路徑應(yīng)放在雙引號內(nèi),這樣當(dāng)路徑包含空格時(shí)不會(huì)報(bào)錯(cuò),還有就是你的路徑肯定跟我的不一樣,所以需要自己去找,可以找到快捷方式,然后右鍵找到文件所在地址,直到找到Thunder.exe
例如:
"D:\Program Files\xunleivip\Program\Thunder.exe" ftp://ygdy8:ygdy8@y201.dygod.org:1132/[陽光電影www.ygdy8.com].冬眠.BD.720p.中文字幕.rmvb
不過有一點(diǎn)需要注意:
不能用迅雷極速版,因?yàn)闃O速版在新建任務(wù)時(shí)會(huì)彈出窗口詢問是否開始下載.還關(guān)不掉,而迅雷U享版和廣為人知的那個(gè)很多廣告的迅雷可以設(shè)置不彈出窗口,我的是U享版
OK,然后就是代碼實(shí)現(xiàn)了,找對了思路,代碼簡直是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 和程序路徑之間是有一個(gè)空格的
功能2 檢測任務(wù)是否開始
一開始我是想找迅雷是否有這樣的命令接口什么的,然而并沒有(也可能是我沒找到)憂郁了半天,忽然想起了迅雷在下載資源時(shí)是會(huì)有暫存文件的,此文件名是這樣的 資源名.xltd 例如
[陽光電影www.ygdy8.com].冬眠.BD.720p.中文字幕.rmvb.xltd
如果任務(wù)開始了,就會(huì)有這樣一個(gè)文件,我們只需要去檢測這個(gè)文件是否存在就可以判斷任務(wù)是否開始了.代碼實(shí)現(xiàn)如下:
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 檢測任務(wù)是否完成
跟功能2的思路是一樣的,只有當(dāng)下載完成時(shí),暫存文件才會(huì)變成正常的資源文件名,所以同理,我們?nèi)z測是否存在就是.
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()方法去分割,返回的是個(gè)元組
代碼實(shí)現(xiàn)如下
def get_filename(url):
return os.path.split(url)[1]
開始拼裝
OK,需要用到的功能寫好了,開始根據(jù)流程拼裝
首先需要拿到電影資源鏈接,我保存到了一個(gè)txt文件中
大概200多條,不多,所以取出來,保存到一個(gè)list即可.
然后一個(gè)一個(gè)的下載.
寫一個(gè)方法來下載資源把
def download(url):
'''
下載資源
返回True表示下載完成 否則失敗
'''
os.system(r'"D:\Program Files\xunleivip\Program\Thunder.exe" {url}'.format(url=url))
#一定要休眠一段時(shí)間,執(zhí)行命令后要等一會(huì)兒迅雷才會(huì)新建任務(wù),
#然后還要尋找資源,這都需要時(shí)間,大概多久,自己去測試,根據(jù)網(wǎng)絡(luò)、資源不同,尋找資源的速度也不同
#如果沒啟動(dòng)迅雷,迅雷還會(huì)啟動(dòng)一會(huì)兒
time.sleep(20)
filename = get_filename(url)
print("正在下載 {}".format(filename))
#檢測任務(wù)是否已開始
#有時(shí)候會(huì)因?yàn)橘Y源不存在,或者迅雷該死的版權(quán)問題會(huì)下載失敗
if check_start(filename):
while True:
#每分鐘檢測一次是否下載完成
time.sleep(60)
if check_end(filename):
return True
else:
return False
好,開始循環(huán)遍歷一個(gè)個(gè)的下載把
def main():
#獲取所有資源鏈接
f = open("urls.txt","r")
urls = [url.replace("\n","") for url in f.readlines()]
f.close()
# 開始循環(huán)下載
for url in urls:
if download(url):
print("======下載完成======")
else:
print("=======下載失敗=====")
if __name__ == '__main__':
print("=======電影自動(dòng)下載程序啟動(dòng)=========")
main()
好了,運(yùn)行腳本開始下載把
要是對我的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()
# 開始循環(huán)下載
for url in urls:
if download(url):
print("======下載完成======")
else:
print("=======下載失敗=====")
if __name__ == '__main__':
print("=======電影自動(dòng)下載程序啟動(dòng)=========")
main()