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. Локальная разработка
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 и заполните своими значениями:
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 файл! Настройте переменные через интерфейс:
- Откройте ваш Space
- Перейдите в Settings → Secrets
- Добавьте переменные:
SUPABASE_URLSUPABASE_SERVICE_KEYRUBERT_URL(опционально)FIPI_BASE_URL(опционально)
🗄️ Настройка Supabase
1. Создайте проект
Перейдите на Supabase и создайте новый проект.
2. Выполните SQL скрипт
- Откройте SQL Editor
- Скопируйте содержимое
schema.sql - Нажмите Run
3. Получите ключи
- Перейдите в Settings → API
- Скопируйте:
- Project URL →
SUPABASE_URL - service_role key →
SUPABASE_SERVICE_KEY
- Project URL →
🧠 Настройка ruBERT
Вариант 1: Использование существующего API
Если у вас уже есть развернутый ruBERT (как в основном проекте):
RUBERT_URL=https://your-rubert-instance.hf.space
Вариант 2: Развертывание ruBERT
Создайте новый Space на Hugging Face с моделью ruBERT:
- RuBERT от DeepPavlov
- Используйте шаблон Gradio или FastAPI
- Добавьте эндпоинты
/api/analyzeи/api/embedding
🌐 Деплой на Hugging Face Spaces
Шаг 1: Создайте Space
- Перейдите на Hugging Face Spaces
- Нажмите Create new Space
- Заполните:
- Space name:
fipi-ai-scraper - License: MIT
- SDK: Docker
- Visibility: Public или Private
- Space name:
Шаг 2: Загрузите файлы
# Инициализируйте 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
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
# 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 анализ) (хранение)
Поток данных
- Скрапинг:
FIPIScraperпарсит задания с fipi.ru - Анализ:
RuBERTClientанализирует текст задания - Сохранение:
SupabaseClientсохраняет в базу данных - API: FastAPI предоставляет REST эндпоинты
🔒 Безопасность
- ✅ RLS (Row Level Security) в Supabase
- ✅ Валидация данных через Pydantic
- ✅ CORS настроен для API
- ✅ Service Key не экспонируется на клиенте
🛠️ Решение проблем
"Supabase не настроен"
Проверьте переменные окружения:
echo $SUPABASE_URL
echo $SUPABASE_SERVICE_KEY
"RuBERT клиент не настроен"
Убедитесь, что RUBERT_URL указан и API доступен:
curl https://your-rubert.hf.space/api/health
Ошибки при скрапинге
Сайт ФИПИ может блокировать запросы. Попробуйте:
- Изменить
User-Agentвscraper.py - Использовать прокси
- Добавить задержки между запросами
Docker не собирается
Проверьте логи:
docker build -t fipi-scraper .
docker run -p 7860:7860 fipi-scraper
Configuration error / Missing .env
Это нормально! Для Hugging Face Spaces:
- Не загружайте
.envв репозиторий - Настройте переменные через Settings → Repository secrets
- Файл
.env.exampleсуществует только для документации
📝 История изменений
Март 2026 - Исправление парсера ФИПИ
Исправленные проблемы:
- ❌ Неверные URL-адреса (404 ошибки)
- ❌ SSL ошибки для поддоменов
- ❌ Некорректный парсинг заголовков
Результат:
- ✅ Найдено заданий: 0 → 12
- ✅ Все запросы возвращают 200 OK
Подробности в FIXES.md
📊 Мониторинг
Логи приложения
# Логи в Hugging Face Space
# Settings → Logs
# Локально
uvicorn app:app --log-level debug
Метрики
/api/health— статус сервисов/api/stats— статистика заданий
🤝 Интеграция с основным проектом
Этот сервис дополняет основной проект refined-main:
- Импорт заданий из ФИПИ в базу
- AI-анализ через тот же ruBERT
- Единая Supabase для обоих сервисов
Подключение
В основном проекте добавьте:
// 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();
}
📚 Дополнительные ресурсы
📄 Лицензия
MIT License
Последнее обновление: Март 2026
Статус: ✅ Готово к деплою