--- title: AI Scraper ФИПИ emoji: 🕷️ colorFrom: blue colorTo: purple sdk: docker sdk_version: "docker" python_version: "3.11" app_file: app.py pinned: false --- # 🕷️ AI Scraper ФИПИ Сервис для автоматического сбора заданий с сайта ФИПИ (fipi.ru) с использованием AI-анализа на основе **ruBERT**. --- ## ✨ Возможности - 🕷️ **Автоматический парсинг** заданий с сайта ФИПИ - 🧠 **AI-классификация** заданий через ruBERT - 💾 **Сохранение в Supabase** с автоматическим обновлением - 🚀 **Деплой на Hugging Face Spaces** - 📊 **REST API** для доступа к заданиям - 🔍 **Поиск** по заданиям - 📈 **Статистика** и аналитика --- ## 📁 Структура ``` ai-scraper/ ├── app.py # Основное FastAPI приложение ├── scraper.py # Парсер сайта ФИПИ ├── rubert_client.py # Клиент для ruBERT API ├── supabase_client.py # Интеграция с Supabase ├── models.py # Pydantic модели ├── requirements.txt # Python зависимости ├── schema.sql # SQL схема для Supabase ├── Dockerfile # Docker конфигурация ├── hf_spaces_config.yaml # Конфиг для Hugging Face ├── .env.example # Шаблон переменных окружения └── README.md # Документация ``` --- ## 🚀 Быстрый старт ### 1. Локальная разработка ```bash cd ai-scraper # Создайте виртуальное окружение python -m venv venv # Активируйте venv\Scripts\activate # Windows source venv/bin/activate # Linux/Mac # Установите зависимости pip install -r requirements.txt # Скопируйте .env.example в .env (опционально) cp .env.example .env # Заполните .env своими ключами # ИЛИ настройте переменные окружения в вашей системе # Запустите сервер uvicorn app:app --reload --host 0.0.0.0 --port 8000 ``` Откройте http://localhost:8000/docs для Swagger UI. --- ## ⚙️ Переменные окружения ### Для локальной разработки Скопируйте `.env.example` в `.env` и заполните своими значениями: ```env SUPABASE_URL=https://your-project.supabase.co SUPABASE_SERVICE_KEY=your-service-role-key RUBERT_URL=https://your-rubert.hf.space FIPI_BASE_URL=https://fipi.ru ``` ### Для Hugging Face Spaces **Не нужно загружать `.env` файл!** Настройте переменные через интерфейс: 1. Откройте ваш Space 2. Перейдите в **Settings** → **Secrets** 3. Добавьте переменные: - `SUPABASE_URL` - `SUPABASE_SERVICE_KEY` - `RUBERT_URL` (опционально) - `FIPI_BASE_URL` (опционально) --- ## 🗄️ Настройка Supabase ### 1. Создайте проект Перейдите на [Supabase](https://supabase.com) и создайте новый проект. ### 2. Выполните SQL скрипт 1. Откройте [SQL Editor](https://supabase.com/dashboard/project/_/sql/new) 2. Скопируйте содержимое `schema.sql` 3. Нажмите **Run** ### 3. Получите ключи 1. Перейдите в **Settings** → **API** 2. Скопируйте: - **Project URL** → `SUPABASE_URL` - **service_role key** → `SUPABASE_SERVICE_KEY` --- ## 🧠 Настройка ruBERT ### Вариант 1: Использование существующего API Если у вас уже есть развернутый ruBERT (как в основном проекте): ```env RUBERT_URL=https://your-rubert-instance.hf.space ``` ### Вариант 2: Развертывание ruBERT Создайте новый Space на Hugging Face с моделью ruBERT: 1. [RuBERT от DeepPavlov](https://huggingface.co/deepvk/rubert-base-cased) 2. Используйте шаблон Gradio или FastAPI 3. Добавьте эндпоинты `/api/analyze` и `/api/embedding` --- ## 🌐 Деплой на Hugging Face Spaces ### Шаг 1: Создайте Space 1. Перейдите на [Hugging Face Spaces](https://huggingface.co/spaces) 2. Нажмите **Create new Space** 3. Заполните: - **Space name**: `fipi-ai-scraper` - **License**: MIT - **SDK**: Docker - **Visibility**: Public или Private ### Шаг 2: Загрузите файлы ```bash # Инициализируйте git в папке ai-scraper cd ai-scraper git init git add . git commit -m "Initial commit" # Добавьте remote вашего Space git remote add origin https://huggingface.co/spaces/YOUR_USERNAME/fipi-ai-scraper # Push в Space git push -u origin main ``` ### Шаг 3: Настройте переменные окружения **Важно:** Не загружайте `.env` файл в репозиторий! В Settings вашего Space добавьте в **Secrets**: | Variable | Value | |----------|-------| | `SUPABASE_URL` | https://your-project.supabase.co | | `SUPABASE_SERVICE_KEY` | ваш service key | | `RUBERT_URL` | https://your-rubert.hf.space | | `FIPI_BASE_URL` | https://fipi.ru | ⚠️ **Примечание:** Переменные окружения добавляются через интерфейс Hugging Face: **Settings** → **Repository secrets** → **New secret** ### Шаг 4: Дождитесь деплоя Space автоматически соберет Docker образ и запустит приложение. --- ## 📡 API Endpoints | Метод | Эндпоинт | Описание | |-------|----------|----------| | GET | `/` | Информация об API | | GET | `/api/health` | Проверка статуса сервиса | | GET | `/api/tasks` | Получить все задания | | GET | `/api/tasks/latest` | Последние добавленные задания | | GET | `/api/tasks/{task_id}` | Получить задание по ID | | GET | `/api/tasks/type/{type}` | Задания по типу | | GET | `/api/tasks/search?q=` | Поиск заданий | | POST | `/api/scrape` | Запустить парсинг ФИПИ | | POST | `/api/analyze` | AI анализ существующих заданий | | GET | `/api/stats` | Статистика по заданиям | --- ## 📝 Примеры использования ### Python ```python import requests BASE_URL = "https://your-space.hf.space" # Получить последние задания response = requests.get(f"{BASE_URL}/api/tasks/latest?limit=10") tasks = response.json() print(f"Найдено заданий: {len(tasks)}") # Запустить парсинг ФИПИ response = requests.post(f"{BASE_URL}/api/scrape") result = response.json() print(result["message"]) # Поиск заданий response = requests.get(f"{BASE_URL}/api/tasks/search?q=сочинение") tasks = response.json() # Получить статистику response = requests.get(f"{BASE_URL}/api/stats") stats = response.json() print(f"Всего заданий: {stats['total_tasks']}") ``` ### cURL ```bash # Health check curl https://your-space.hf.space/api/health # Получить задания curl https://your-space.hf.space/api/tasks/latest # Запустить скрапинг curl -X POST https://your-space.hf.space/api/scrape \ -H "Content-Type: application/json" \ -d '{"subject": "russian"}' # Поиск curl "https://your-space.hf.space/api/tasks/search?q=ЕГЭ" ``` --- ## 🔧 Конфигурация ### Переменные окружения | Переменная | Описание | Пример | |------------|----------|--------| | `SUPABASE_URL` | URL проекта Supabase | `https://xxx.supabase.co` | | `SUPABASE_SERVICE_KEY` | Service role ключ Supabase | `eyJhbG...` | | `RUBERT_URL` | URL ruBERT API | `https://rubert.hf.space` | | `FIPI_BASE_URL` | Базовый URL ФИПИ | `https://fipi.ru` | | `PORT` | Порт приложения | `7860` | | `HOST` | Хост приложения | `0.0.0.0` | --- ## 🏗️ Архитектура ``` ┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐ │ FIPIScraper │────▶│ RuBERTClient │────▶│ SupabaseClient │ │ (BeautifulSoup)│ │ (HTTP API) │ │ (Supabase JS) │ └─────────────────┘ └──────────────────┘ └─────────────────┘ │ │ │ ▼ ▼ ▼ fipi.ru ruBERT HF Supabase DB (парсинг) (AI анализ) (хранение) ``` ### Поток данных 1. **Скрапинг**: `FIPIScraper` парсит задания с fipi.ru 2. **Анализ**: `RuBERTClient` анализирует текст задания 3. **Сохранение**: `SupabaseClient` сохраняет в базу данных 4. **API**: FastAPI предоставляет REST эндпоинты --- ## 🔒 Безопасность - ✅ **RLS (Row Level Security)** в Supabase - ✅ **Валидация данных** через Pydantic - ✅ **CORS** настроен для API - ✅ **Service Key** не экспонируется на клиенте --- ## 🛠️ Решение проблем ### "Supabase не настроен" Проверьте переменные окружения: ```bash echo $SUPABASE_URL echo $SUPABASE_SERVICE_KEY ``` ### "RuBERT клиент не настроен" Убедитесь, что `RUBERT_URL` указан и API доступен: ```bash curl https://your-rubert.hf.space/api/health ``` ### Ошибки при скрапинге Сайт ФИПИ может блокировать запросы. Попробуйте: - Изменить `User-Agent` в `scraper.py` - Использовать прокси - Добавить задержки между запросами ### Docker не собирается Проверьте логи: ```bash docker build -t fipi-scraper . docker run -p 7860:7860 fipi-scraper ``` ### Configuration error / Missing .env **Это нормально!** Для Hugging Face Spaces: 1. Не загружайте `.env` в репозиторий 2. Настройте переменные через **Settings** → **Repository secrets** 3. Файл `.env.example` существует только для документации --- ## 📝 История изменений ### Март 2026 - Исправление парсера ФИПИ **Исправленные проблемы:** - ❌ Неверные URL-адреса (404 ошибки) - ❌ SSL ошибки для поддоменов - ❌ Некорректный парсинг заголовков **Результат:** - ✅ Найдено заданий: 0 → 12 - ✅ Все запросы возвращают 200 OK Подробности в [FIXES.md](FIXES.md) --- ## 📊 Мониторинг ### Логи приложения ```bash # Логи в Hugging Face Space # Settings → Logs # Локально uvicorn app:app --log-level debug ``` ### Метрики - `/api/health` — статус сервисов - `/api/stats` — статистика заданий --- ## 🤝 Интеграция с основным проектом Этот сервис дополняет основной проект `refined-main`: 1. **Импорт заданий** из ФИПИ в базу 2. **AI-анализ** через тот же ruBERT 3. **Единая Supabase** для обоих сервисов ### Подключение В основном проекте добавьте: ```typescript // services/fipiTasks.ts const FIPI_SCRAPER_URL = 'https://fipi-ai-scraper.hf.space'; export async function fetchLatestTasks(limit = 10) { const response = await fetch(`${FIPI_SCRAPER_URL}/api/tasks/latest?limit=${limit}`); return response.json(); } ``` --- ## 📚 Дополнительные ресурсы - [Документация FastAPI](https://fastapi.tiangolo.com/) - [Документация Supabase](https://supabase.com/docs) - [Hugging Face Spaces](https://huggingface.co/docs/hub/spaces) - [ruBERT модель](https://huggingface.co/deepvk/rubert-base-cased) - [ФИПИ](https://fipi.ru/) --- ## 📄 Лицензия MIT License --- **Последнее обновление:** Март 2026 **Статус:** ✅ Готово к деплою