Оптимизация кода. Python. SQLite3
У меня есть асинхронный парсер, который парсил товары с сайта со скоростью 100 товаров в секунду. Стоило добавить 2 запроса к БД и он стал парсить по 2-3 товара в секунду. Можно ли как-то приблизиться к прошлому значению?
Запросы
async def insert_product(self, product: tuple):
with self.connection:
self.cursor.execute('INSERT OR IGNORE INTO `products`(`category`, `prod_id`, `price`, `link`, `image`, `date`)'
'VALUES(?, ?, ?, ?, ?, ?)', product)
async def exist_product(self, id):
with self.connection:
res = self.cursor.execute('SELECT * FROM `products` WHERE prod_id=?', (id, )).fetchone()
if res is None:
return False
elif res is not None:
return True
Парсер
async def get_data():
# Получение странички из асинхронного генератора
async for page in get_json():
# Если страничка правильно отображена вытягиваем данные
if page != 'false':
for product in page['data']['products']:
id = str(product['id'])
price = product['salePriceU']
category = page['category']
link = f'https://www.wildberries.ru/catalog/{id}/detail.aspx?targetUrl=GP'
image_link = f"https://images.wbstatic.net/c516x688/new/{id[:-4]}0000/{id}-1.jpg"
date = datetime.datetime.today().strftime('%d/%m')
# Печать данных
print(f'ID: {id}\n'
f'Price: {int(int(price)/100)}\n'
f'Category: {category}\n'
f'Link: {link}\n'
f'Image: {image_link}\n'
f'Date: {date}\n\n')
# Проверка
new_product = (category, id, price, link, image_link, date, )
if not await db.exist_product(new_product[1]):
# Если этого товара нет в БД, просто добавляем его
await db.insert_product(new_product)
async def get_json():
# Итерация по категориям
for i in CURL:
# Формируем заголовки запросов и прочие данные
category = i['category']
headers = i['headers']
# Итерация по страницам категории
for page in range(1, 101):
# Формирование URL и Headers
if page == 1:
headers['Referer'] = i['headers']['Referer'].replace('_replace_me_', str(page))
else:
headers['Referer'] = i['headers']['Referer'].replace(str(page-1), str(page))
url = i['url'].replace('_replace_me_', str(page))
# Запрос и получение json страницы
response_text = await repeat_request(url, headers)
# Если страница не пострадала возвращаем её
if response_text:
response_text['category'] = category
yield response_text
else:
yield 'false'
async def repeat_request(url, headers, attempts=5):
global quantity_miss, quantity_errors
# Цикл попыток
for attempt in range(attempts):
# Запрос
async with aiohttp.ClientSession() as session:
response = await session.get(url=url, headers=headers)
# Проверка - всё ли в порядке
try:
await response.json(content_type=None)
except Exception as _ex:
quantity_errors += 1
print(f'Status: {response.status}')
print(f'Response: {response}')
print(f'[ОШИБКА] {_ex}')
print(f'Попытка №{attempt}')
await asyncio.sleep(attempt * 5)
# Если ни одна из попыток не увенчалась успехом
# Пропускаем эту страницу
if attempt == attempts-1:
quantity_miss += 1
return False
break
# Если всё хорошо останавливаем цикл и благополучно возвращаем json страницу
else:
return await response.json(content_type=None)
break
async def compare_results(old_product, new_product):
new_price = int(int(new_product[2])/100)
old_price = int(int(old_product[3])/100)
need_price = int(old_price * 0.2)
if new_price <= need_price:
return True
else:
return False