scraper / README.md
greeta's picture
Upload 6 files
8383076 verified
---
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
**Статус:** ✅ Готово к деплою