first commit

This commit is contained in:
2026-07-14 13:38:43 +07:00
commit 8b0e1ffffa
19 changed files with 836 additions and 0 deletions

70
README.md Normal file
View File

@@ -0,0 +1,70 @@
# my_parser
Парсер офферов с `kwork.ru` с отправкой в Telegram и возможностью добавлять новые источники.
## Что умеет
- запускается каждые `X` минут через `APScheduler`
- читает настройки из `.env`
- забирает проекты `kwork.ru` по списку категорий `fc`
- фильтрует офферы по ключевым словам
- фильтрует офферы по минимальной сумме
- не отправляет уже отправленные офферы повторно
- отправляет релевантные офферы в Telegram-канал через `aiogram`
## Запуск
1. Создать и заполнить `.env` по примеру `.env.example`.
2. Установить зависимости:
```bash
pip install -r requirements.txt
```
3. Запустить:
```bash
python main.py
```
Дополнительно можно задать `MIN_PRICE_AMOUNT`, чтобы пропускать только офферы с бюджетом не ниже указанного значения в рублях.
Для Telegram можно указать `TELEGRAM_PROXY_URL`, например `socks5://user:pass@host:port` или `http://host:port`.
## Docker
Сборка образа:
```bash
docker build -t my-parser .
```
Запуск контейнера:
```bash
docker run --rm --env-file .env -v "$(pwd)/data:/app/data" my-parser
```
В образе используется multistage-сборка:
- на этапе `builder` ставятся зависимости в отдельный `venv`
- на этапе `runtime` копируются только готовое окружение и исходники
Это ускоряет пересборку, если меняется только код приложения, а `requirements.txt` остается прежним.
## Структура
- `app/config.py` - загрузка настроек
- `app/sources/base.py` - базовый интерфейс источника
- `app/sources/kwork.py` - реализация источника `kwork`
- `app/service.py` - получение, фильтрация и отправка офферов
- `app/telegram.py` - публикация сообщений в Telegram
- `app/state.py` - хранение уже отправленных офферов
## Как добавить новый сайт
1. Создать новый класс в `app/sources/`, унаследованный от `OfferSource`.
2. Реализовать в нем `fetch_offers()` с возвратом списка `Offer`.
3. Подключить источник в `main.py`.
Для `fl.ru` можно будет добавить отдельный класс по той же схеме без изменений основного пайплайна.