import requests
from bs4 import BeautifulSoup
import csv
from tqdm import tqdm

# Базовый URL для страниц палитр
base_url = "https://www.color-hex.com/color-palettes/?page="

# Количество страниц, которые нужно парсить
total_pages = 1780

output_file = "color_palettes.csv"


with open(output_file, mode='w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file)

    # Заголовки CSV
    headers = ['Palette Category', 'Palette Name'] + [f"Color {i + 1}" for i in range(448)]
    writer.writerow(headers)

    for page in tqdm(range(1, total_pages + 1), desc="Parsing pages", unit="page"):
        # Формируем URL для текущей страницы
        url = f"{base_url}{page}"

        response = requests.get(url)

        if response.status_code == 200:
            soup = BeautifulSoup(response.content, 'html.parser')

            # Ищем все контейнеры палитр
            palettes = soup.find_all('div', class_='palettecontainerlist')

            # Проходим по каждой палитре и собираем информацию
            for palette in palettes:
                # Ищем ссылку с названием палитры (тег <a>)
                title_tag = palette.find('a')
                palette_name = title_tag['title'] if title_tag else 'No title'

                palette_category = "Default Category"

                # Ищем все div с цветами внутри палитры
                color_divs = palette.find_all('div', class_='palettecolordiv')
                color_codes = []

                # Извлекаем цвета из атрибута style
                for div in color_divs:
                    style = div['style']
                    # Ищем hex-код цвета в стиле
                    color_code = style.split('background-color:')[1].replace(';', '').strip()
                    color_codes.append(color_code)

                # Заполняем недостающие ячейки пустыми значениями, если цветов меньше 448
                while len(color_codes) < 448:
                    color_codes.append('')

                writer.writerow([palette_category, palette_name] + color_codes)
        else:
            print(f"Ошибка при запросе страницы {page}: {response.status_code}")

print(f"Парсинг завершён. Данные записаны в файл {output_file}")
