✨ Major Features: - Complete RAG system for hotel website analysis - Hybrid audit with BGE-M3 embeddings + Natasha NER - Universal horizontal Excel reports with dashboards - Multi-region processing (SPb, Orel, Chukotka, Kamchatka) 📊 Completed Regions: - Орловская область: 100% (36/36) - Чукотский АО: 100% (4/4) - г. Санкт-Петербург: 93% (893/960) - Камчатский край: 87% (89/102) 🔧 Infrastructure: - PostgreSQL with pgvector extension - BGE-M3 embeddings API - Browserless for web scraping - N8N workflows for automation - S3/Nextcloud file storage 📝 Documentation: - Complete DB schemas - API documentation - Setup guides - Status reports
7.9 KiB
7.9 KiB
🕷️ Universal Parser API
Универсальный API для парсинга любых сайтов с обходом защит (Cloudflare, WAF, антибот систем).
🚀 Возможности
- ✅ Обход Cloudflare, WAF, антибот систем
- ✅ Рендеринг JavaScript (React, Vue, Angular)
- ✅ Извлечение текста и HTML
- ✅ Парсинг ссылок
- ✅ Скриншоты страниц
- ✅ API ключ для безопасности
- ✅ Асинхронная обработка
📦 Установка
# Установка зависимостей
pip3 install --break-system-packages fastapi uvicorn playwright playwright-stealth
# Установка браузеров Playwright
playwright install chromium
🔧 Запуск
# Запуск API сервера
python3 universal_parser_api.py
# Сервер запустится на http://localhost:8003
# Документация: http://localhost:8003/docs
🔑 API Ключ
X-API-Key: parser_2025_secret_key_a8f3d9c1b4e7
⚠️ В продакшене: храни ключ в .env файле!
📡 Endpoints
1. POST /parse
Парсинг страницы с обходом защит.
Параметры запроса:
{
"url": "https://example.com",
"wait_seconds": 3, // Время ожидания после загрузки
"extract_links": false, // Извлечь все ссылки
"screenshot": false, // Сделать скриншот
"javascript_enabled": true, // Включить JS
"user_agent": null // Кастомный User-Agent (опционально)
}
Ответ:
{
"success": true,
"url": "https://example.com",
"status_code": 200,
"title": "Example Domain",
"html": "<html>...</html>",
"text": "Example Domain\nThis domain is for...",
"text_length": 1234,
"links": ["https://...", "..."],
"screenshot_base64": null,
"parsing_time": 2.45,
"timestamp": "2025-10-17T16:30:00",
"error": null
}
2. GET /health
Проверка статуса API.
Ответ:
{
"status": "healthy",
"version": "1.0.0",
"timestamp": "2025-10-17T16:30:00"
}
💻 Примеры использования
Python
import requests
API_URL = "http://localhost:8003"
API_KEY = "parser_2025_secret_key_a8f3d9c1b4e7"
def parse_page(url):
headers = {
"X-API-Key": API_KEY,
"Content-Type": "application/json"
}
payload = {
"url": url,
"wait_seconds": 5,
"extract_links": True
}
response = requests.post(
f"{API_URL}/parse",
headers=headers,
json=payload
)
if response.status_code == 200:
data = response.json()
print(f"Статус: {data['status_code']}")
print(f"Title: {data['title']}")
print(f"Текст: {data['text'][:500]}")
return response.json()
# Использование
result = parse_page("https://mos-sud.ru/...")
cURL
curl -X POST "http://localhost:8003/parse" \
-H "X-API-Key: parser_2025_secret_key_a8f3d9c1b4e7" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com",
"wait_seconds": 3,
"extract_links": true
}'
JavaScript
const parseUrl = async (url) => {
const response = await fetch('http://localhost:8003/parse', {
method: 'POST',
headers: {
'X-API-Key': 'parser_2025_secret_key_a8f3d9c1b4e7',
'Content-Type': 'application/json'
},
body: JSON.stringify({
url: url,
wait_seconds: 3,
extract_links: true
})
});
const data = await response.json();
console.log('Статус:', data.status_code);
console.log('Title:', data.title);
console.log('Текст:', data.text.substring(0, 500));
return data;
};
// Использование
parseUrl('https://example.com');
PHP
<?php
$url = "http://localhost:8003/parse";
$api_key = "parser_2025_secret_key_a8f3d9c1b4e7";
$data = [
"url" => "https://example.com",
"wait_seconds" => 3,
"extract_links" => true
];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"X-API-Key: $api_key",
"Content-Type: application/json"
]);
$response = curl_exec($ch);
$result = json_decode($response, true);
echo "Статус: " . $result['status_code'] . "\n";
echo "Title: " . $result['title'] . "\n";
curl_close($ch);
?>
🧪 Тестирование
# Запустить тестовый скрипт
python3 test_parser_api.py
🔒 Безопасность
- API ключ в .env:
# .env
PARSER_API_KEY=parser_2025_secret_key_a8f3d9c1b4e7
# В коде
import os
from dotenv import load_dotenv
load_dotenv()
API_KEY = os.getenv("PARSER_API_KEY")
- Rate limiting (добавить если нужно):
pip install slowapi
- HTTPS (для продакшена):
uvicorn universal_parser_api:app --host 0.0.0.0 --port 8003 --ssl-keyfile key.pem --ssl-certfile cert.pem
🎯 Use Cases
1. Парсинг судебных сайтов
result = parse_page("https://mos-sud.ru/312/cases/...")
case_number = extract_case_number(result['text'])
2. Мониторинг сайтов
# Проверка изменений на сайте каждые 5 минут
import schedule
def check_website():
result = parse_page("https://target-site.com")
if "ВАЖНОЕ ОБНОВЛЕНИЕ" in result['text']:
send_notification()
schedule.every(5).minutes.do(check_website)
3. Сбор данных
# Парсинг списка отелей
result = parse_page("https://booking-site.com", extract_links=True)
hotel_links = [link for link in result['links'] if '/hotel/' in link]
for link in hotel_links:
hotel_data = parse_page(link)
save_to_database(hotel_data)
📊 Производительность
- ⚡ Скорость: 2-5 секунд на страницу
- 🔄 Параллельность: Поддерживает множественные запросы
- 💾 Память: ~200MB на один браузер
🐛 Отладка
Логи сохраняются в parser_api.log:
tail -f parser_api.log
🚀 Production
Запуск через systemd
# /etc/systemd/system/parser-api.service
[Unit]
Description=Universal Parser API
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/path/to/project
ExecStart=/usr/bin/python3 universal_parser_api.py
Restart=always
[Install]
WantedBy=multi-user.target
sudo systemctl enable parser-api
sudo systemctl start parser-api
Docker
FROM python:3.12-slim
RUN apt-get update && apt-get install -y \
wget \
gnupg \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
RUN playwright install --with-deps chromium
COPY universal_parser_api.py .
EXPOSE 8003
CMD ["python3", "universal_parser_api.py"]
📝 Примечания
- ⚠️ Соблюдай robots.txt и ToS сайтов
- ⚠️ Используй rate limiting для больших объёмов
- ⚠️ Некоторые сайты могут всё равно блокировать (требуется прокси)
🆘 Поддержка
Если API не работает:
- Проверь логи:
tail -f parser_api.log - Проверь статус:
curl http://localhost:8003/health - Проверь API ключ
- Проверь порт 8003 (не занят ли)
Версия: 1.0.0
Дата: 17.10.2025
Автор: Your Team