что было бы проще - прилепить туда какие-то декораторы таймера как на запрос так и на отдельные функции или сделать асинхронный coverage, я даже хз проподобные средства
Читать полностью…короче я своим слепым глазом особых прям криминальностей не вижу (тут в панамку щас напихают эксперты еще), возможно какая-то логика немного не та, типа вызываются лишние запросы например там, где их можно получить с одной страницы а заходится при этом в каждый товар внутрь - надо проверять точно ли обязательно внутрь заходить может данные уже есть на той странице которая выше по уровню
Читать полностью…а вот эти паузы они же получается не блокирующие? await asyncio.sleep(random.uniform(0.5, 1.5))
Читать полностью…а async with limiter:
значит что залетает в него под 100 задачек за 1 секунду и оно как-бы пытается их удержать? а лимитеру пофиг что в него пихать, в него можно разного рода задачи запихивать?
да я читаю там еще до четверти кода не дошел)) ага - limiter там аля лимитер, при этом стейт походу загружается 1 раз на старте, при условии что ретраев немного на запрос (немного же, да?). читаю дальше
Читать полностью…вдруг у тебя там async def, а внутри все await await await на каждой строчке, эт тогда не факт что будет асинхронный код)))
Читать полностью…ну или как-минимум, что ты подразумеваешь под асинхронной задачей? скачивание в асинхронном пуле html-страничек (что обычно самое долгое в коде) или что?
Читать полностью…короче, чем долго играть в испорченный телефон, просто покажи код, на pastebin закинь, можешь "сикретные куски" поудалять, да и вообще оставить тока остовы функций
Читать полностью…это максимально неэффективно, а сколько раз ты к нему обращался примерно за парсинг? и что ты там хранил? вообще, что ты имеешь в виду под состоянием?
Читать полностью…если бы код был аля-улю синхронный я б рекомендовал run with coverage, но про асинхронный хз - вангую там черт ногу сломит где задержка происходит
Читать полностью…я бы еще посмотрел сколько в среднем времени уходит на каждый отдельный запрос (а еще лучше время каждого запроса на графике отобразить, чтобы не было температуры по-больнице), типа вот латенси там и задержки все эти. может там наоборот, 100 запросов на этот сервак дохера и он тебе латенси по 60 секунд на запрос выдает (в отместку, бугага)
Читать полностью…Да, лимитеру ему все равно, какие задачи в него попадают. Он просто считает количество выполненных операций и контролирует их частоту.
Читать полностью…а стопе, а ты еще весь такой асинхронный код в стейт записываешь который на json'е?
progress['category'] = batch[-1]Читать полностью…
state['last_processed_category'] = batch[-1]
state['last_processed_page'] = 1
progress['page'] = 1
progress['product_index'] = 0
save_progress(progress['category'], progress['page'], progress['product_index'])
save_current_state(state)
У меня такоее было, когда в html страницы наспамили до миллиона ссылок (это не шутка). На заброшенных форумах без регистрации это норма.
Читать полностью…У меня есть функция основная scrape_products:
- Инициализирует основные параметры (URL, счетчики, ограничитель запросов).
- Загружает предыдущее состояние и прогресс.
- Обрабатывает категории пакетами (по 20 штук).
- Для каждой категории в пакете создает асинхронную задачу scrape_category.
- Ожидает завершения всех задач в пакете.
- Обновляет общий счетчик товаров и сохраняет прогресс.
Функция scrape_category:
- Получает HTML-контент страницы категории.
- Извлекает иерархию категории.
- Вызывает parse_category_page для обработки товаров на странице.
- Сохраняет полученные продукты в JSON-файл.
- Обновляет прогресс и состояние после обработки категории.
Функция parse_category_page:
- Находит все блоки товаров на странице.
- Создает асинхронные задачи parse_product для каждого товара.
- Возвращает список успешно обработанных товаров.
Функция parse_product:
- Извлекает основную информацию о товаре (имя, изображение).
- Парсит характеристики товара.
- Обрабатывает информацию о ценах, если она доступна.
- При наличии цен вызывает parse_seller_page для получения дополнительной информации.