73 lines
3.0 KiB
Markdown
73 lines
3.0 KiB
Markdown
# my_parser
|
||
|
||
Парсер офферов с `kwork.ru` и `fl.ru` с отправкой в Telegram и возможностью добавлять новые источники.
|
||
|
||
## Что умеет
|
||
|
||
- запускается каждые `X` минут через `APScheduler`
|
||
- читает настройки из `.env`
|
||
- забирает проекты `kwork.ru` по списку категорий `fc`
|
||
- забирает проекты `fl.ru` из RSS-ленты
|
||
- фильтрует офферы по ключевым словам
|
||
- фильтрует офферы по минимальной сумме
|
||
- не отправляет уже отправленные офферы повторно
|
||
- отправляет релевантные офферы в Telegram-канал через `aiogram`
|
||
|
||
## Запуск
|
||
|
||
1. Создать и заполнить `.env` по примеру `.env.example`.
|
||
2. Установить зависимости:
|
||
|
||
```bash
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
3. Запустить:
|
||
|
||
```bash
|
||
python main.py
|
||
```
|
||
|
||
Дополнительно можно задать `MIN_PRICE_AMOUNT`, чтобы пропускать только офферы с бюджетом не ниже указанного значения в рублях.
|
||
|
||
RSS `fl.ru` настраивается через `FL_RSS_URL`. По умолчанию используется `https://www.fl.ru/rss/?category=5`.
|
||
|
||
Для 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/sources/fl.py` - реализация RSS-источника `fl.ru`
|
||
- `app/service.py` - получение, фильтрация и отправка офферов
|
||
- `app/telegram.py` - публикация сообщений в Telegram
|
||
- `app/state.py` - хранение уже отправленных офферов
|
||
|
||
## Как добавить новый сайт
|
||
|
||
1. Создать новый класс в `app/sources/`, унаследованный от `OfferSource`.
|
||
2. Реализовать в нем `fetch_offers()` с возвратом списка `Offer`.
|
||
3. Подключить источник в `main.py`.
|