Как я могу асинхронно запрашивать URL-адреса в растущей очереди с Asyncio? - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть X начальных URL, которые разбиты на страницы - чтобы получить следующий набор данных, мне нужно извлечь следующий URL из заголовка ответа, пока не будет следующего URL. У меня возникли проблемы с получением правильной работы. Я пытаюсь использовать подход с очередями, который я нашел здесь.

import asyncio
from aiohttp import ClientSession, TCPConnector

async def get(session, url):
    headers = {
      'Authorization': 'Bearer  KEY',
     }
     async with session.get(url, headers=headers) as response:
            json = await response.json()
            return json, response

async def process(session, url, q):
    try:      
        try:
            views, response = await get(session, url)
            scode = response.status
            if scode == 404:
                return
        except Exception as e:
            print(e)
            return
        try:
            await q.put(str(response.links["next"]["url"]))
        except:
            pass

        <do something with views>
    except Exception as e:
        print(e)

async def fetch_worker(session, q):
    while True:
        url = await q.get()
        try:
            await process(session, url, q)
        except Exception as e:
            print(e)
        finally:
            q.task_done()

async def d():
    <code to query and put data into stdrows>
    connector = TCPConnector(limit=500)
    async with ClientSession(connector=connector) as session:
        url = '<some base url>'

        for i in range(500):
            tasks.append(asyncio.create_task(fetch_worker(session, url_queue)))

        for row in stdrows:
            await url_queue.put(url.format(row[1]))

        await asyncio.gather(*tasks)
        await url_queue.join()
asyncio.run(d())

Кажется, что это не 500 задач / с c. Возможно ли вообще достичь этого уровня, не зная заранее всех URL-адресов? Я надеюсь получить следующий URL-адрес из любого исходного URL-адреса (или из его разбитого на страницы URL-адреса), пока я работаю с views.

...