Как ускорить асинхронный парсер?

import asyncio
import json

import aiohttp
from openpyxl import Workbook

headers = {
    'Accept': '*/*',
    'Accept-Language': 'en,en-US;q=0.9,ru-RU;q=0.8,ru;q=0.7',
    'Connection': 'keep-alive',
    'Origin': 'https://www.wildberries.ru',
    'Referer': 'https://www.wildberries.ru/catalog/aksessuary/tovary-dlya-zhivotnyh/akvariumistika/dekoratsii-i-rasteniya?sort=popular&page=1&xsubject=3214',
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'cross-site',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.134 Safari/537.36 OPR/89.0.4447.104',
    'sec-ch-ua': '"Opera GX";v="89", "Chromium";v="103", "_Not:A-Brand";v="24"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Windows"',
}

wb = Workbook()
ws = wb.active
ws.append(['Название каталога','Ссылка на каталог','Количество','Ссылки на товар'])


async def get_data():
    async with aiohttp.ClientSession() as session:
        async with session.get('https://www.wildberries.ru/webapi/menu/main-menu-ru-ru.json') as response:
            catalogs_data = await response.json()
            for catalog_data in catalogs_data:
                for child in catalog_data['childs']: # Забираем query, chard и вызываем get_products для получения данных
                    child_name = child['name']
                    try:
                        for sub_catalog in child['childs']: # Если есть ещё один подкаталог
                            sub_catalog_name = '/'+sub_catalog['name']
                            query = sub_catalog['query']
                            shard = sub_catalog['shard']
                            page_data = await get_products(session,query, shard) # Get products data
                            if page_data:
                                catalog_url = 'https://www.wildberries.ru'+child['url']+f'?page=1&xsubject={page_data[2]}'

                    except KeyError:
                        sub_catalog_name=''
                        query = child['query']
                        shard = child['shard']
                        page_data = await get_products(session, query,shard)
                        if page_data:
                            catalog_url = 'https://www.wildberries.ru'+child['url']+f'?page=1&xsubject={page_data[2]}'
                    if page_data:
                        catalog_name = catalog_data['name']+'/'+child_name+sub_catalog_name+'/'+page_data[3]
                        ws.append([catalog_name,catalog_url,page_data[0],page_data[1]])
        


async def get_products(session, query, shard):
    url = f'https://catalog.wb.ru/catalog/{shard}/v4/filters?appType=1&couponsGeo=12,3,18,15,21&curr=rub&dest=-1029256,-102269,-2162196,-1275551&emp=0&lang=ru&locale=ru&pricemarginCoeff=1.0&reg=0&regions=68,64,83,4,38,80,33,70,82,86,75,30,69,22,66,31,40,1,48,71&spp=0&{query}'
    async with session.get(url, headers=headers) as response:
        json_data = json.loads(await response.read())
        for filter in json_data['data']['filters']:
            if filter['name'] == 'Категория':
                for item in filter['items']:
                    products_data = []
                    result_sum = []
                    necessary_urls = []
                    filter_id = item['id'] # ID фильтра
                    filter_name = item['name'] # Название фильтра 
                    link = f'https://catalog.wb.ru/catalog/{shard}/catalog?appType=1&couponsGeo=12,3,18,15,21&curr=rub&dest=-1029256,-102269,-2162196,-1275551&emp=0&lang=ru&locale=ru&page=1&pricemarginCoeff=1.0&reg=0&regions=68,64,83,4,38,80,33,70,82,86,75,30,69,22,66,31,40,1,48,71&sort=popular&spp=0&{query}&xsubject={filter_id}'
                    async with session.get(link) as r: # Проходимся по всем карточкам и возращаем нужные данные
                        json_catalog_data = json.loads(await r.read())
                        for product in json_catalog_data['data']['products']:
                            id = product['id']
                            products_data.append(await get_product_data(session,id))
                        for product_data in products_data:
                            result_sum.append(product_data[0])
                            if product_data[0] == 1:
                                necessary_urls.append(product_data[1])
                        return [f'{sum(result_sum)}/{len(result_sum)}', ','.join(necessary_urls),filter_id,filter_name]
        return False

async def get_product_data(session,id): # Здесь мы возращаем 1 вместе со ссылкой, если страна Индия, если нет то 0
    async with session.get(f'https://wbx-content-v2.wbstatic.net/ru/{id}.json') as response:
        data = await response.json()
        link = f'https://www.wildberries.ru/catalog/{id}/detail.aspx?targetUrl=GP'
        try:
            for country in data['options']:
                if country['name'] == 'Страна производства':
                    if country['value'] == 'Индия':
                        return [1,link] 
                    else:
                        return [0]
        except:
            pass
    return [0]


def main():
    asyncio.get_event_loop().run_until_complete(get_data())
    wb.save('Data.xlsx')
if __name__ == '__main__':
    main()

Парсер забирает все подкаталоги на вайлдберисе и после парсит первые 100 карточек и смотрит какие товары сделаны из Индии. У меня он работает, но я не знаю как его можно ускорить.


Ответы (0 шт):