我有一个网站的网址列表,我想用Python重复下载(以可变的时间间隔)。有必要异步地处理大量网站和/或长响应时间 我已经尝试了许多事件循环,队列,异步函数,asyncio等,但我没有让它工作。以下非常简单的版本重复下载网站,但它不会同时下载网站 - 而是下一次下载仅在上一次下载完成后才开始。
import asyncio
import datetime
import aiohttp
def produce_helper(url: str):
# helper, because I cannot call an async function with loop.call_later
loop.create_task(produce(url))
async def produce(url: str):
await q.put(url)
print(f'{datetime.datetime.now().strftime("%H:%M:%S.%f")} - Produced {url}')
async def consume():
async with aiohttp.ClientSession() as session:
while True:
url = await q.get()
print(f'{datetime.datetime.now().strftime("%H:%M:%S.%f")} - Start: {url}')
async with session.get(url, timeout=10) as response:
print(f'{datetime.datetime.now().strftime("%H:%M:%S.%f")} - Finished: {url}')
q.task_done()
loop.call_later(10, produce_helper, url)
q = asyncio.Queue()
url_list = ["https://www.google.com/", "https://www.bing.com/", "https://www.yelp.com/"]
loop = asyncio.get_event_loop()
for url in url_list:
loop.create_task(produce(url))
loop.create_task(consume())
loop.run_forever()
这是解决我问题的合适方法吗?概念上有什么更好的吗?
我如何完成并发下载?
任何帮助表示赞赏。
修改
挑战(如下面的评论中所述)如下:每次成功下载后,我想将相应的URL添加回队列 - 在指定的等待时间(我的问题中的示例中为10秒)后到期。一旦到期,我想再次下载网站,将URL添加回队列等。