greeta commited on
Commit
b6329db
·
verified ·
1 Parent(s): 447b885

Delete README.md

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