Фоновый мониторинг поисковых выдач Avito.ru: собирает объявления, отсеивает дубли, считает скоринг выгодности лота (0–100) и присылает уведомления по хорошим находкам в Telegram. Есть веб-панель для управления поисками и просмотра каталога.
Изначально писал для себя, чтобы не листать Avito руками в поисках техники с адекватной ценой — дальше обросло веб-интерфейсом, экспортом и опциональной прослойкой с LLM.
Сбор идёт двумя движками на выбор:
curl_cffi— быстрый HTTP-клиент с эмуляцией TLS/JA3 отпечатка браузера, без запуска Chromium;- Playwright (headless Chromium) — для страниц, где обычный HTTP-запрос упирается в защиту Avito.
Оба пишут в одну и ту же модель объявления (parser_core.py), дальше всё общее: дедуп по
хэшу от заголовка/цены/описания (database.py), скоринг, экспорт, уведомления.
Данные хранятся в SQLite (через aiosqlite, WAL-режим). Отдельных внешних БД не требуется.
Каждому объявлению считается число от 0 до 100 (ai_scoring.py, чистая математика, без ИИ):
- цена относительно медианы по текущей выдаче — до 45 баллов;
- продавец: верификация, рейтинг, число отзывов — до 20;
- качество объявления: количество фото, заполненность характеристик, длина описания — до 15;
- Авито Доставка и указанная локация — до 10;
- снижение цены продавцом относительно старой цены — до 10;
- свежесть объявления — небольшой бонус за первые часы публикации, штраф за то, что висит больше двух недель при цене ниже рынка;
- штраф до −30 баллов, если в тексте находятся маркеры риска: «на запчасти», «разбит», «не включается», блокировка iCloud, «копия/реплика» и т.п. — список паттернов зашит в коде, плюс можно добавлять свои правила (штрафы и бонусы) через веб-панель.
По итоговому баллу лот попадает в одну из четырёх категорий: GEM (85+), HOT (70–84), FAIR (50–69), CAUTION (ниже 50).
Отдельно и опционально — вердикт от LLM. Выключен по умолчанию (AI_SETTINGS.enabled = false),
включается в настройках. Поддерживается любой OpenAI-совместимый эндпоинт: DeepSeek, OpenAI,
OpenRouter или локальная Ollama — модуль просто шлёт /chat/completions с карточкой товара и
просит два-три предложения: выгода, риски, рекомендация (брать/торговаться/пропустить).
На aiogram 3, работает с той же базой, что и веб-панель. Команды:
/add <название> <ссылка на поиск>— добавить поисковый запрос для мониторинга;/list— список активных поисков с кнопками;/del <id>— удалить поиск;/blacklist [имя]— чёрный список продавцов;/check— проверить все поиски прямо сейчас, не дожидаясь интервала;/status— статистика по базе;/settings— порог скоринга для уведомлений (все / только HOT+ / только GEM), тихие часы, фильтр по Авито Доставке;/export— выгрузка базы в Excel прямо в чат.
FastAPI + Jinja2, авторизация по логину/паролю с сессионными cookie (HttpOnly), пароль
хранится как PBKDF2-HMAC-SHA256 (100 000 итераций) с солью. При первом запуске создаётся
пользователь admin / admin123 — это нужно сменить сразу после первого входа, README не
делает это за вас.
В панели: каталог с фильтрами и сеткой/таблицей, управление поисковыми запросами и прокси, живые логи через WebSocket, ручной парсинг по ссылке на объявление, экспорт в Excel / CSV / JSON и отдельный HTML-отчёт.
Опционально. Список прокси в proxies.txt (по одному на строку, http://, socks5:// или
host:port:user:pass) либо один прокси через DEFAULT_PROXY в .env. При включении
(PROXY_ENABLED=true) запросы идут через ротацию списка.
Нужен Python 3.10+ с галочкой "Add Python to PATH".
install_windows.batСкрипт создаёт venv, ставит зависимости из requirements.txt, докачивает Chromium для
Playwright и копирует .env.example в .env. Дальше — start_server.bat (веб-панель),
start_telegram_bot.bat (бот) или start_all.bat (оба сразу).
git clone https://github.com/domovoyproj/avito-parser.git
cd avito-parser
chmod +x install_ubuntu.sh setup_systemd.sh
sudo ./install_ubuntu.shСтавит системные библиотеки для headless Chromium, venv, зависимости и сам Chromium.
Для постоянной работы фоном есть setup_systemd.sh — поднимает два юнита,
avito-parser (веб) и avito-bot:
sudo systemctl status avito-parser
sudo systemctl restart avito-bot
sudo journalctl -u avito-parser -fcp .env.example .env
docker compose up -d --builddocker-compose.yml поднимает два контейнера на одном образе (mcr.microsoft.com/playwright/python
с уже установленным Chromium): web — веб-панель на порту 8000, bot — Telegram-бот.
Общие тома ./data, ./exports, ./logs.
| Переменная | По умолчанию | Что делает |
|---|---|---|
WEB_HOST / WEB_PORT |
0.0.0.0 / 8000 |
адрес веб-панели |
TELEGRAM_BOT_TOKEN |
— | токен от @BotFather; без него бот не запустится |
TELEGRAM_ADMIN_IDS |
— | ID пользователей через запятую, у кого есть доступ к боту |
NOTIFICATION_INTERVAL_MIN |
10 | как часто проверять поиски, минимум 1 минута |
SCRAPER_HEADLESS |
true |
headless-режим Chromium (на сервере — только так) |
SCRAPER_TIMEOUT_MS |
45000 |
таймаут загрузки страницы |
SCRAPER_PAGE_DELAY_MIN/MAX |
2.0 / 5.0 |
случайная пауза между запросами, сек |
PROXY_ENABLED / DEFAULT_PROXY |
false / — |
см. раздел про прокси |
AI_PROVIDER |
deepseek |
deepseek / openai / openrouter / ollama |
AI_API_KEY / AI_MODEL / AI_API_BASE |
— | ключ и модель для LLM-вердикта, если он включён |
Остальные настройки (тихие часы, пороги скоринга, чёрный список, кастомные правила скоринга)
хранятся в базе и правятся из веб-панели или бота, а не через .env.
Python 3.10+, FastAPI, Playwright, curl_cffi, aiogram 3, aiosqlite, openpyxl.