Я занимаюсь парсингом новостного сайта. Всю работу можно разбить на следующие задачи:
1) GET-запрос и получение ответа в виде html-документа, содержащего ссылки на новостные статьи, а также URL на следующий подобный документ (напоминает односвязный список);
2) запрос и распаршивание каждой из новостных статей;
3) возврат к первому шагу, но уже с запросом по полученному ранее URL.
Понятно, что инициализирующий запрос из первого шага в любом случае будет блокирующим, но как конкурентно реализовать все последующие такие запросы и снова собирать таски по полученным новостным URL-ам? То есть чтобы во время парсинга новостных статей асинхронно выполнялся первый шаг, с получением из корутины нужных значений (urls, data_next; см. ниже). Показываю ситуацию на данный момент, где первый шаг проходит с использованием блокирующей функции.
tasks = []
async with aiohttp.ClientSession() as session:
urls, data_next = get_urls(TAG_URL.format('economy'))
while condition:
for url in urls:
task = asyncio.create_task(parse_page(url, session, f))
tasks.append(task)
await asyncio.gather(*tasks)
urls, data_next = get_urls(data_next)