Как ускорить асинхронный парсер?
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®=0®ions=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®=0®ions=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 карточек и смотрит какие товары сделаны из Индии. У меня он работает, но я не знаю как его можно ускорить.