'''
Description:
Author: pdh
Date: 2020-11-05 12:12:22
LastEditors: pdh
LastEditTime: 2020-11-06 14:47:55
FilePath: \down\down.py
'''
# coding=utf-8
import os
import requests
from concurrent.futures import ThreadPoolExecutor
import threading
import asyncio
gLock = threading.Lock()
gPool = ThreadPoolExecutor(50)
def pinfo(text):
global gLock
gLock.acquire()
print(text)
gLock.release()
async def downOne(name, loop):
urlPrefixArr = (
"http://mp3-2e.xxx.com:9090",
"http://mp32a.xxxx.com:9090",
"http://mp33a.x.com:9090",
"http://mp3-e.xxxx.com:9090",
"http://mp3-2f.xxxx.com:9090",
"http://mp3-d.xxx.com:9090",
"http://mp32b.xxx.com:9090",
"http://mp3f.xxxx.com:9090",
"http://mp33b.xxx.com:9090",
"http://mp3-f.xxxx.com:9090",
"http://mp3-2.xxxx.com:9090",
"http://mp3d.xxxx.com:9090"
)
global gPool
prefixs = []
prefixs.append(name)
prefixs.append(name+"(完)")
if True:
for pre in prefixs:
name = pre + ".mp3"
for urlPre in urlPrefixArr:
for big in range(2016, 2020):
for sub in range(51, 60):
if os.path.isfile(name):
return name, True
url = "/".join((urlPre, str(big),
str(sub), "曹賊", name))
pinfo("downOne:start {}, {}".format(name, url))
result = await loop.run_in_executor(gPool, requests.get, url)
if result.status_code == 200:
with open(name, "wb") as f:
f.write(result.content)
pinfo("downOne:ok {}, {}".format(name, url))
return name, True
else:
pinfo("downOne:fail url={}".format(url))
await asyncio.sleep(0.01)
else:
for pre in prefixs:
name = pre + ".mp3"
for urlPre in urlPrefixArr:
if os.path.isfile(name):
return name, True
url = "/".join((urlPre, "都市言情/草房子_林慧", name))
pinfo("downOne:start {}, {}".format(name, url))
result = await loop.run_in_executor(gPool, requests.get, url)
if result.status_code == 200:
with open(name, "wb") as f:
f.write(result.content)
pinfo("downOne:ok {}, {}".format(name, url))
return name, True
else:
pinfo("downOne:fail url={}".format(url))
await asyncio.sleep(0.01)
return name, False
def getAll():
fs = []
if False:
[str(f).zfill(2) for f in range(1, 39)]
else:
with open("down_multi.txt", "r", encoding="utf-8") as f:
while True:
line = f.readline()
if line:
n = line.strip()
if n:
pinfo(n)
fs.append(n)
else:
break
return fs
async def downAll(loop):
fs = []
names = getAll()
for name in names:
task = asyncio.ensure_future(downOne(name, loop))
fs.append(task)
pinfo("downAll:wait")
rs = await asyncio.gather(*fs)
# pinfo("downAll:waiting {}".format(rs))
pinfo("downAll:wait end")
return rs
def deal():
loop = asyncio.get_event_loop()
try:
rs = loop.run_until_complete(downAll(loop))
count = 0
for name, success in rs:
if success:
count += 1
pinfo("name = {}, success= {}".format(name, success))
else:
print("faile name={}".format(name))
pinfo("成功下載下傳: count = {}".format(count))
finally:
loop.close()
if __name__ == "__main__":
deal()
pinfo("main:middle")
while True:
line = input("輸入")
if (line == 'q'):
break