greeta commited on
Commit
7aca71c
·
verified ·
1 Parent(s): b6329db

Upload README.md

Browse files
Files changed (1) hide show
  1. README.md +429 -0
README.md ADDED
@@ -0,0 +1,429 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: AI Scraper ФИПИ
3
+ emoji: 🕷️
4
+ colorFrom: blue
5
+ colorTo: purple
6
+ sdk: docker
7
+ sdk_version: "docker"
8
+ python_version: "3.11"
9
+ app_file: app.py
10
+ pinned: false
11
+ ---
12
+
13
+ # 🕷️ AI Scraper ФИПИ
14
+
15
+ Сервис для автоматического сбора заданий с сайта ФИПИ (fipi.ru) с использованием AI-анализа на основе **ruBERT**.
16
+
17
+ ---
18
+
19
+ ## ✨ Возможности
20
+
21
+ - 🕷️ **Автоматический парсинг** заданий с сайта ФИПИ
22
+ - 🧠 **AI-классификация** заданий через ruBERT
23
+ - 💾 **Сохранение в Supabase** с автоматическим обновлением
24
+ - 🚀 **Деплой на Hugging Face Spaces**
25
+ - 📊 **REST API** для доступа к заданиям
26
+ - 🔍 **Поиск** по заданиям
27
+ - 📈 **Статистика** и аналитика
28
+
29
+ ---
30
+
31
+ ## 📁 Структура
32
+
33
+ ```
34
+ ai-scraper/
35
+ ├── app.py # Основное FastAPI приложение
36
+ ├── scraper.py # Парсер сайта ФИПИ
37
+ ├── rubert_client.py # Клиент для ruBERT API
38
+ ├── supabase_client.py # Интеграция с Supabase
39
+ ├── models.py # Pydantic модели
40
+ ├── requirements.txt # Python зависимости
41
+ ├── schema.sql # SQL схема для Supabase
42
+ ├── Dockerfile # Docker конфигурация
43
+ ├── hf_spaces_config.yaml # Конфиг для Hugging Face
44
+ ├── .env.example # Шаблон переменных окружения
45
+ └── README.md # Документация
46
+ ```
47
+
48
+ ---
49
+
50
+ ## 🚀 Быстрый старт
51
+
52
+ ### 1. Локальная разработка
53
+
54
+ ```bash
55
+ cd ai-scraper
56
+
57
+ # Создайте виртуальное окружение
58
+ python -m venv venv
59
+
60
+ # Активируйте
61
+ venv\Scripts\activate # Windows
62
+ source venv/bin/activate # Linux/Mac
63
+
64
+ # Установите зависимости
65
+ pip install -r requirements.txt
66
+
67
+ # Скопируйте .env.example в .env (опционально)
68
+ cp .env.example .env
69
+
70
+ # Заполните .env своими ключами
71
+ # ИЛИ настройте переменные окружения в вашей системе
72
+
73
+ # Запустите сервер
74
+ uvicorn app:app --reload --host 0.0.0.0 --port 8000
75
+ ```
76
+
77
+ Откройте http://localhost:8000/docs для Swagger UI.
78
+
79
+ ---
80
+
81
+ ## ⚙️ Переменные окружения
82
+
83
+ ### Для локальной разработки
84
+
85
+ Скопируйте `.env.example` в `.env` и заполните своими значениями:
86
+
87
+ ```env
88
+ SUPABASE_URL=https://your-project.supabase.co
89
+ SUPABASE_SERVICE_KEY=your-service-role-key
90
+ RUBERT_URL=https://your-rubert.hf.space
91
+ FIPI_BASE_URL=https://fipi.ru
92
+ ```
93
+
94
+ ### Для Hugging Face Spaces
95
+
96
+ **Не нужно загружать `.env` файл!** Настройте переменные через интерфейс:
97
+
98
+ 1. Откройте ваш Space
99
+ 2. Перейдите в **Settings** → **Secrets**
100
+ 3. Добавьте переменные:
101
+ - `SUPABASE_URL`
102
+ - `SUPABASE_SERVICE_KEY`
103
+ - `RUBERT_URL` (опционально)
104
+ - `FIPI_BASE_URL` (опционально)
105
+
106
+ ---
107
+
108
+ ## 🗄️ Настройка Supabase
109
+
110
+ ### 1. Создайте проект
111
+
112
+ Перейдите на [Supabase](https://supabase.com) и создайте новый проект.
113
+
114
+ ### 2. Выполните SQL скрипт
115
+
116
+ 1. Откройте [SQL Editor](https://supabase.com/dashboard/project/_/sql/new)
117
+ 2. Скопируйте содержимое `schema.sql`
118
+ 3. Нажмите **Run**
119
+
120
+ ### 3. Получите ключи
121
+
122
+ 1. Перейдите в **Settings** → **API**
123
+ 2. Скопируйте:
124
+ - **Project URL** → `SUPABASE_URL`
125
+ - **service_role key** → `SUPABASE_SERVICE_KEY`
126
+
127
+ ---
128
+
129
+ ## 🧠 Настройка ruBERT
130
+
131
+ ### Вариант 1: Использование существующего API
132
+
133
+ Если у вас уже есть развернутый ruBERT (как в основном проекте):
134
+
135
+ ```env
136
+ RUBERT_URL=https://your-rubert-instance.hf.space
137
+ ```
138
+
139
+ ### Вариант 2: Развертывание ruBERT
140
+
141
+ Создайте новый Space на Hugging Face с моделью ruBERT:
142
+
143
+ 1. [RuBERT от DeepPavlov](https://huggingface.co/deepvk/rubert-base-cased)
144
+ 2. Используйте шаблон Gradio или FastAPI
145
+ 3. Добавьте эндпоинты `/api/analyze` и `/api/embedding`
146
+
147
+ ---
148
+
149
+ ## 🌐 Деплой на Hugging Face Spaces
150
+
151
+ ### Шаг 1: Создайте Space
152
+
153
+ 1. Перейдите на [Hugging Face Spaces](https://huggingface.co/spaces)
154
+ 2. Нажмите **Create new Space**
155
+ 3. Заполните:
156
+ - **Space name**: `fipi-ai-scraper`
157
+ - **License**: MIT
158
+ - **SDK**: Docker
159
+ - **Visibility**: Public или Private
160
+
161
+ ### Шаг 2: Загрузите файлы
162
+
163
+ ```bash
164
+ # Инициализируйте git в папке ai-scraper
165
+ cd ai-scraper
166
+ git init
167
+ git add .
168
+ git commit -m "Initial commit"
169
+
170
+ # Добавьте remote вашего Space
171
+ git remote add origin https://huggingface.co/spaces/YOUR_USERNAME/fipi-ai-scraper
172
+
173
+ # Push в Space
174
+ git push -u origin main
175
+ ```
176
+
177
+ ### Шаг 3: Настройте переменные окружения
178
+
179
+ **Важно:** Не загружайте `.env` файл в репозиторий!
180
+
181
+ В Settings вашего Space добавьте в **Secrets**:
182
+
183
+ | Variable | Value |
184
+ |----------|-------|
185
+ | `SUPABASE_URL` | https://your-project.supabase.co |
186
+ | `SUPABASE_SERVICE_KEY` | ваш service key |
187
+ | `RUBERT_URL` | https://your-rubert.hf.space |
188
+ | `FIPI_BASE_URL` | https://fipi.ru |
189
+
190
+ ⚠️ **Примечание:** Переменные окружения добавляются через интерфейс Hugging Face:
191
+ **Settings** → **Repository secrets** → **New secret**
192
+
193
+ ### Шаг 4: Дождитесь деплоя
194
+
195
+ Space автоматически соберет Docker образ и запустит приложение.
196
+
197
+ ---
198
+
199
+ ## 📡 API Endpoints
200
+
201
+ | Метод | Эндпоинт | Описание |
202
+ |-------|----------|----------|
203
+ | GET | `/` | Информация об API |
204
+ | GET | `/api/health` | Проверка статуса сервиса |
205
+ | GET | `/api/tasks` | Получить все задания |
206
+ | GET | `/api/tasks/latest` | Последние добавленные задания |
207
+ | GET | `/api/tasks/{task_id}` | Получить задание по ID |
208
+ | GET | `/api/tasks/type/{type}` | Задания по типу |
209
+ | GET | `/api/tasks/search?q=` | Поиск заданий |
210
+ | POST | `/api/scrape` | Запустить парсинг ФИПИ |
211
+ | POST | `/api/analyze` | AI анализ существующих заданий |
212
+ | GET | `/api/stats` | Статистика по заданиям |
213
+
214
+ ---
215
+
216
+ ## 📝 Примеры использования
217
+
218
+ ### Python
219
+
220
+ ```python
221
+ import requests
222
+
223
+ BASE_URL = "https://your-space.hf.space"
224
+
225
+ # Получить последние задания
226
+ response = requests.get(f"{BASE_URL}/api/tasks/latest?limit=10")
227
+ tasks = response.json()
228
+ print(f"Найдено заданий: {len(tasks)}")
229
+
230
+ # Запустить парсинг ФИПИ
231
+ response = requests.post(f"{BASE_URL}/api/scrape")
232
+ result = response.json()
233
+ print(result["message"])
234
+
235
+ # Поиск заданий
236
+ response = requests.get(f"{BASE_URL}/api/tasks/search?q=сочинение")
237
+ tasks = response.json()
238
+
239
+ # Получить статистику
240
+ response = requests.get(f"{BASE_URL}/api/stats")
241
+ stats = response.json()
242
+ print(f"Всего заданий: {stats['total_tasks']}")
243
+ ```
244
+
245
+ ### cURL
246
+
247
+ ```bash
248
+ # Health check
249
+ curl https://your-space.hf.space/api/health
250
+
251
+ # Получить задания
252
+ curl https://your-space.hf.space/api/tasks/latest
253
+
254
+ # Запустить скрапинг
255
+ curl -X POST https://your-space.hf.space/api/scrape \
256
+ -H "Content-Type: application/json" \
257
+ -d '{"subject": "russian"}'
258
+
259
+ # Поиск
260
+ curl "https://your-space.hf.space/api/tasks/search?q=ЕГЭ"
261
+ ```
262
+
263
+ ---
264
+
265
+ ## 🔧 Конфигурация
266
+
267
+ ### Переменные окружения
268
+
269
+ | Переменная | Описание | Пример |
270
+ |------------|----------|--------|
271
+ | `SUPABASE_URL` | URL проекта Supabase | `https://xxx.supabase.co` |
272
+ | `SUPABASE_SERVICE_KEY` | Service role ключ Supabase | `eyJhbG...` |
273
+ | `RUBERT_URL` | URL ruBERT API | `https://rubert.hf.space` |
274
+ | `FIPI_BASE_URL` | Базовый URL ФИПИ | `https://fipi.ru` |
275
+ | `PORT` | Порт приложения | `7860` |
276
+ | `HOST` | Хост приложения | `0.0.0.0` |
277
+
278
+ ---
279
+
280
+ ## 🏗️ Архитектура
281
+
282
+ ```
283
+ ┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
284
+ │ FIPIScraper │────▶│ RuBERTClient │────▶│ SupabaseClient │
285
+ │ (BeautifulSoup)│ │ (HTTP API) │ │ (Supabase JS) │
286
+ └─────────────────┘ └──────────────────┘ └─────────────────┘
287
+ │ │ │
288
+ ▼ ▼ ▼
289
+ fipi.ru ruBERT HF Supabase DB
290
+ (парсинг) (AI анализ) (хранение)
291
+ ```
292
+
293
+ ### Поток данных
294
+
295
+ 1. **Скрапинг**: `FIPIScraper` парсит задания с fipi.ru
296
+ 2. **Анализ**: `RuBERTClient` анализирует текст задания
297
+ 3. **Сохранение**: `SupabaseClient` сохраняет в базу данных
298
+ 4. **API**: FastAPI предоставляет REST эндпоинты
299
+
300
+ ---
301
+
302
+ ## 🔒 Безопасность
303
+
304
+ - ✅ **RLS (Row Level Security)** в Supabase
305
+ - ✅ **Валидация данных** через Pydantic
306
+ - ✅ **CORS** настроен для API
307
+ - ✅ **Service Key** не экспонируется на клиенте
308
+
309
+ ---
310
+
311
+ ## 🛠️ Решение проблем
312
+
313
+ ### "Supabase не настроен"
314
+
315
+ Проверьте переменные окружения:
316
+ ```bash
317
+ echo $SUPABASE_URL
318
+ echo $SUPABASE_SERVICE_KEY
319
+ ```
320
+
321
+ ### "RuBERT клиент не настроен"
322
+
323
+ Убедитесь, что `RUBERT_URL` указан и API доступен:
324
+ ```bash
325
+ curl https://your-rubert.hf.space/api/health
326
+ ```
327
+
328
+ ### Ошибки при скрапинге
329
+
330
+ Сайт ФИПИ может блокировать запросы. Попробуйте:
331
+ - Изменить `User-Agent` в `scraper.py`
332
+ - Использовать прокси
333
+ - Добавить задержки между запросами
334
+
335
+ ### Docker не собирается
336
+
337
+ Проверьте логи:
338
+ ```bash
339
+ docker build -t fipi-scraper .
340
+ docker run -p 7860:7860 fipi-scraper
341
+ ```
342
+
343
+ ### Configuration error / Missing .env
344
+
345
+ **Это нормально!** Для Hugging Face Spaces:
346
+ 1. Не загружайте `.env` в репозиторий
347
+ 2. Настройте переменные через **Settings** → **Repository secrets**
348
+ 3. Файл `.env.example` существует только для документации
349
+
350
+ ---
351
+
352
+ ## 📝 История изменений
353
+
354
+ ### Март 2026 - Исправление парсера ФИПИ
355
+
356
+ **Исправленные проблемы:**
357
+ - ❌ Неверные URL-адреса (404 ошибки)
358
+ - ❌ SSL ошибки для поддоменов
359
+ - ❌ Некорректный парсинг заголовков
360
+
361
+ **Результат:**
362
+ - ✅ Найдено заданий: 0 → 12
363
+ - ✅ Все запросы возвращают 200 OK
364
+
365
+ Подробности в [FIXES.md](FIXES.md)
366
+
367
+ ---
368
+
369
+ ## 📊 Мониторинг
370
+
371
+ ### Логи приложения
372
+
373
+ ```bash
374
+ # Логи в Hugging Face Space
375
+ # Settings → Logs
376
+
377
+ # Локально
378
+ uvicorn app:app --log-level debug
379
+ ```
380
+
381
+ ### Метрики
382
+
383
+ - `/api/health` — статус сервисов
384
+ - `/api/stats` — статистика заданий
385
+
386
+ ---
387
+
388
+ ## 🤝 Интеграция с основным проектом
389
+
390
+ Этот сервис дополняет основной проект `refined-main`:
391
+
392
+ 1. **Импорт заданий** из ФИПИ в базу
393
+ 2. **AI-анализ** через тот же ruBERT
394
+ 3. **Единая Supabase** для обоих сервисов
395
+
396
+ ### Подключение
397
+
398
+ В основном проекте добавьте:
399
+
400
+ ```typescript
401
+ // services/fipiTasks.ts
402
+ const FIPI_SCRAPER_URL = 'https://fipi-ai-scraper.hf.space';
403
+
404
+ export async function fetchLatestTasks(limit = 10) {
405
+ const response = await fetch(`${FIPI_SCRAPER_URL}/api/tasks/latest?limit=${limit}`);
406
+ return response.json();
407
+ }
408
+ ```
409
+
410
+ ---
411
+
412
+ ## 📚 Дополнительные ресурсы
413
+
414
+ - [Документация FastAPI](https://fastapi.tiangolo.com/)
415
+ - [Документация Supabase](https://supabase.com/docs)
416
+ - [Hugging Face Spaces](https://huggingface.co/docs/hub/spaces)
417
+ - [ruBERT модель](https://huggingface.co/deepvk/rubert-base-cased)
418
+ - [ФИПИ](https://fipi.ru/)
419
+
420
+ ---
421
+
422
+ ## 📄 Лицензия
423
+
424
+ MIT License
425
+
426
+ ---
427
+
428
+ **Последнее обновление:** Март 2026
429
+ **Статус:** ✅ Готово к деплою