SkachatPro & AliPhile
Привет, Али. Я тут скрипт написал, он автоматически ищет самые низкие цены в разных магазинах электроники. Не мог бы ты помочь его немного подправить? Может, заметишь что-нибудь интересное, при этом чтоб в рамках бюджета уложились?
Ну давай, угадываю: ты проходишь по каждому API, скрейпишь каждый сайт, а потом надеешься, что цена упадёт, прежде чем оплачивать хостинг. Первое: используй кэш. Не долби каждый магазин дважды в день – используй метки времени, установи 24-часовой интервал. Второе: бери JSON-endpoints, если они есть; HTML – это кошмар, и ты застрянешь с таблицами, которые постоянно меняют названия. Третье: храни базовую цену в маленькой SQLite-базе; если новая цена ниже твоей базовой – пиши мне. И если решил потратиться на дорогой API-ключ, помни, это не самый дешёвый способ найти самую выгодную цену. Начни с простого скрейпера, добавь кэш, потом делай алерт. Удачи в поисках – только не трать состояние на кофемашину, чтобы её тестировать.
Спасибо, в точку. Я уже добавил кэш на 24 часа, но до сих пор борюсь с состояниями гонки, когда несколько запросов попадают на одного и того же продавца. Есть какие-нибудь советы по асинхронному вводу-выводу или, может, простая блокировка поможет? И ещё, думаю перевести базовые данные в Redis вместо SQLite – это разумно, или это избыточно?
Используй простой семафор для каждого ритейлера. В асинхронном Python, `asyncio.Semaphore(1)` будет достаточно – просто оберни вызов `fetch` в `async with sem:` и запросы будут сериализованы. Если у тебя многопоточная конфигурация, используй блокировку на базе Redis, например `aioredis.lock.Lock`, чтобы обеспечить безопасность между процессами.
Переход на Redis для базовой статистики допустим, если он у тебя уже запущен; это даст тебе чтения с задержкой менее миллисекунды, но это избыточно, если тебе нужно лишь несколько чисел. SQLite – легковесный, локальный, без лишних сервисов. Если когда-нибудь понадобится разделить базовую статистику между машинами или масштабироваться, то Redis будет хорошим решением. Пока что оставь SQLite и небольшой in-memory dict для быстрого доступа. Успехов в кодинге, и следи за бюджетом – не покупай клавиатуру с золотым покрытием просто так.
Понял. Семафор на каждого ритейлера, Redis-локи для многопоточности, используй SQLite пока не понадобится кластер. Держи базовый словарь активным и не дай локам стать узким местом. Если возникнут какие-то проблемы – пиши. Удачи с кодом!
Звучит неплохо – только помни, этот семафор – просто короткая команда, а не полноценный диспетчер движения. Следи за временем ожидания блокировки; если зависла, скорее всего, ты слишком оптимизируешь. Напиши мне, если кэш начнёт тормозить как утечка памяти. Удачи в поисках!