使用Python异步重复下载网站

时间:2018-02-13 18:29:06

标签: python python-3.x asynchronous python-asyncio aiohttp

我有一个网站的网址列表,我想用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添加回队列等。

0 个答案:

没有答案