Парсинг спортивных сайтов
Необходимо разработать скрипт на языке Python для парсинга (скрапинга) данных с следующих сайтов:
https://soccerway.com/ (учитывается как один источник, несмотря на повтор в списке)
Данные, подлежащие парсингу:
Новости: Сбор актуальных новостей по спорту, включая заголовки, даты публикации, краткое описание, полный текст (если доступен), авторов, ссылки на источники и связанные изображения/медиа.
Каталог: Структурированные данные по спортивным сущностям, включая:
Вид спорта (например, футбол, баскетбол, теннис и т.д.).
Страна (географическая привязка лиг, клубов и т.д.).
Лиги (названия, сезоны, таблицы результатов).
Клубы (названия, составы, статистика).
Спортсмены (имена, биографии, статистика, достижения).
События (матчи, турниры, даты, результаты, участники, травмы, голы, голевые передачи - все, что есть).
Скрипт должен использовать прокси, задержки между запросами для избежания блокировки, и не перегружать серверы.
На выходе данные должны быть организованы в структурированном виде, аналогичном примеру из приложения.
Требования к скрипту
Технологический стек
Язык программирования: Python (версия 3.8+).
Библиотеки:
Для парсинга: BeautifulSoup4, Scrapy или Selenium (если требуется обработка JavaScript).
Для HTTP-запросов: requests или httpx.
Для работы с данными: pandas (для манипуляции данными).
Для хранения:
Google Sheets: gspread (для интеграции с Google API).
PostgreSQL: psycopg2 или SQLAlchemy (для работы с БД).
Дополнительно: logging для логов, dotenv для хранения конфигураций (API-ключи, credentials).
Хранение данных:
Опция 1: Google Sheets – создать/обновить таблицы в Google Sheets (использовать Google Service Account для аутентификации).
Опция 2: PostgreSQL – схема БД с таблицами для новостей и каталога (с отношениями foreign keys для связей между сущностями).
Скрипт должен поддерживать выбор хранилища через конфигурацию (например, флаг в командной строке или config-файл).
Конфигурация: Все чувствительные данные (API-ключи, DB credentials) хранить в .env файле.
Функциональные требования
Парсинг новостей:
Собрать последние N новостей (N настраивается, по умолчанию 50) с каждого сайта.
Извлекать: заголовок, дата, источник, текст, URL, категория (если есть).
Обработать пагинацию, если новости на нескольких страницах.
Парсинг каталога:
Для каждого сайта собрать иерархические данные по видам спорта, странам, лигам и т.д.
Пример структуры:
Таблица "Sports" (вид спорта: ID, название).
Таблица "Countries" (страна: ID, название).
Таблица "Leagues" (лига: ID, спорт_ID, страна_ID, название, сезон).
Таблица "Clubs" (клуб: ID, лига_ID, название, статистика).
Таблица "Athletes" (спортсмен: ID, клуб_ID, имя, биография, статистика).
Таблица "Events" (событие: ID, лига_ID, дата, участники, результат).
Глубина парсинга: до уровня детальной страницы (например, профиль спортсмена).
Обработка данных:
Очистка данных: удаление HTML-тегов, нормализация текста, обработка дат.
Дедупликация: избегать дублей по URL или уникальному ID.
Обновление: скрипт должен поддерживать инкрементальный парсинг (только новые данные).
Расписание: Скрипт должен быть адаптирован для запуска по cron (например, ежедневно).
Логирование и ошибки:
Логировать процесс парсинга (успех/ошибки).
Обработка исключений: retry при сетевых ошибках, пропуск заблокированных страниц.
Производительность: Задержки между запросами (минимум 1-5 секунд), многопоточность (если применимо, но осторожно, чтобы не блокировать IP).
Нефункциональные требования
Безопасность: Не хранить пароли в коде; использовать HTTPS.
Масштабируемость: Скрипт должен работать с большим объемом данных (десятки и сотни тысяч записей).
Тестирование: Написать unit-тесты для ключевых функций (парсинг, сохранение).
Документация: README.md с инструкциями по установке, запуску, конфигурации.
Совместимость: Работать на Ubuntu.
Этапы работ
Анализ и планирование: Изучить сайты, проверить robots.txt, спроектировать структуру данных.
Разработка скрипта: Написать код для парсинга, интеграции с хранилищем.
Тестирование: Тест на тестовых данных, проверка на реальных сайтах.
Деплой и документация: Подготовить репозиторий, инструкции.
Критерии приемки
Скрипт успешно парсит данные с всех сайтов без ошибок.
Данные сохраняются в выбранном хранилище в структурированном виде.
Структура данных соответствует примеру из приложения (или логической модели, если пример не предоставлен).
Скрипт запускается из командной строки с параметрами (например, python script.py --storage=postgres --limit=50).
Нет банов во время сбора данных.
Заявки фрилансеров

