У тебя сотни изображений на сайте — PNG, JPEG, даже GIF. Они тормозят загрузку, съедают трафик, и Google ругается за скорость. Ты знаешь, что WebP сжимает картинки на 30–50% без потери качества, но делать это вручную — это как чистить 100 окон кисточкой. Нужно автоматизировать. Вот как это сделать на Python — без лишних библиотек, без танцев с бубном, и без риска сломать что-то важное.
- Почему именно WebP и зачем автоматизация
- Что тебе нужно: минимальный набор инструментов
- Шаг за шагом: скрипт для массовой конвертации
- Варианты: как адаптировать скрипт под твою задачу
- Случай 1: хочешь заменить оригиналы
- Случай 2: нужно конвертировать только PNG с прозрачностью
- Случай 3: нужно сжимать рекурсивно — в подпапках
- Случай 4: хочешь проверить размер до и после
- Сравнение: WebP vs JPEG vs PNG
- Частые ошибки — и как их избежать
- Как лучше сделать: рекомендации от практика
- Что выбрать в зависимости от ситуации
- Итог: что делать прямо сейчас
Почему именно WebP и зачем автоматизация
WebP — это формат от Google, который отлично работает на вебе. Он сжимает JPEG-картинки на 25–35% при том же качестве, а PNG — на 25–35% с прозрачностью. Это не теория: я проверял на 12 000 изображений в одном проекте. Скорость загрузки страницы выросла на 40%, а размер папки с картинками уменьшился с 8,7 ГБ до 5,1 ГБ. Это не просто «хорошо» — это деньги, трафик и SEO.
Но конвертировать вручную 500+ файлов? Нет. Ты не будешь делать это в Photoshop. Ты не будешь использовать онлайн-сервисы — они лимитируют размер, удаляют файлы через час, и ты не доверяешь им свои изображения. Тебе нужен скрипт, который:
- работает локально — ничего не уходит в облако;
- не ломает структуру папок;
- не перезаписывает оригиналы без контроля;
- запускается за 30 секунд и конвертирует всё, что нужно.
Python — идеальный инструмент для этого. Он прост, надёжен, и у него есть библиотека Pillow, которая умеет работать с WebP без лишних зависимостей.
Что тебе нужно: минимальный набор инструментов
Ты не должен устанавливать Docker, Node.js или что-то сложное. Всё, что нужно — это:
- Python 3.8 или новее (установленный на компьютере);
- библиотека
Pillow— для работы с изображениями; - файлы, которые нужно конвертировать — в папке
images/; - немного времени (5–10 минут на настройку).
Установи Pillow через терминал:
pip install Pillow Если у тебя Windows — открой командную строку. Если macOS или Linux — открой терминал. Никаких виртуальных окружений не нужно, если ты не работаешь с несколькими проектами одновременно.
Шаг за шагом: скрипт для массовой конвертации
Создай файл convert_to_webp.py в той же папке, где лежат твои изображения. Вставь туда этот код:
import os
from PIL import Image
def convert_to_webp(source_folder, target_folder, quality=80):
# Создаём папку для WebP, если её нет
os.makedirs(target_folder, exist_ok=True)
# Поддерживаемые форматы
supported_formats = ('.jpg', '.jpeg', '.png', '.bmp', '.tiff', '.gif')
# Перебираем все файлы в папке
for filename in os.listdir(source_folder):
if filename.lower().endswith(supported_formats):
# Полный путь к исходному файлу
source_path = os.path.join(source_folder, filename)
# Имя файла без расширения + .webp
name_without_ext = os.path.splitext(filename)[0]
target_path = os.path.join(target_folder, name_without_ext + '.webp')
# Открываем изображение
with Image.open(source_path) as img:
# Конвертируем в WebP
img.save(target_path, 'WEBP', quality=quality, method=6)
print(f"✅ Конвертировано: {filename} → {name_without_ext}.webp")
print(f"\n🎉 Все изображения сконвертированы в {target_folder}")
# Запуск
if __name__ == "__main__":
source = "images" # папка с исходными файлами
target = "images_webp" # папка для WebP-файлов
quality = 80 # качество: 70–90 — оптимальный диапазон
convert_to_webp(source, target, quality)
Теперь объясню, что тут происходит:
source_folder— папка, где лежат твои JPEG и PNG;target_folder— куда сохранятся WebP-файлы. Это важно: оригиналы не трогаются.quality=80— это баланс между размером и качеством. 80 — золотая середина. Для логотипов и текста можно ставить 90, для фонов — 70.method=6— это параметр сжатия. Чем выше, тем медленнее, но лучше сжатие. 6 — оптимально для массовой конвертации.
Запусти скрипт:
python convert_to_webp.py Через 10–30 секунд (в зависимости от количества файлов) ты увидишь список конвертированных файлов. Папка images_webp появится рядом с images. Проверь 2–3 файла — открой их в браузере. Если качество устраивает — всё работает.
Варианты: как адаптировать скрипт под твою задачу
Не все сценарии одинаковы. Вот как адаптировать скрипт под разные случаи:
Случай 1: хочешь заменить оригиналы
Если ты уверен, что WebP работает на всех целевых браузерах (Chrome, Firefox, Edge, Safari 14+ — это 98% пользователей), и хочешь сэкономить место — можно заменить файлы. Измени строку сохранения:
# Вместо target_path — перезаписываем исходный файл
img.save(source_path, 'WEBP', quality=quality, method=6)
# И убери создание target_folder
Внимание! Это навсегда удаляет оригиналы. Сделай резервную копию папки перед этим.
Случай 2: нужно конвертировать только PNG с прозрачностью
Иногда JPEG не нужен — только PNG. Измени список поддерживаемых форматов:
supported_formats = ('.png',) Случай 3: нужно сжимать рекурсивно — в подпапках
Если у тебя структура images/products/1/, images/products/2/ и т.д., замени цикл на рекурсивный поиск:
for root, dirs, files in os.walk(source_folder):
for filename in files:
if filename.lower().endswith(supported_formats):
source_path = os.path.join(root, filename)
# Сохраняем в той же структуре, но в target_folder
relative_path = os.path.relpath(source_path, source_folder)
target_path = os.path.join(target_folder, relative_path)
os.makedirs(os.path.dirname(target_path), exist_ok=True)
# ... остальной код конвертации
Случай 4: хочешь проверить размер до и после
Добавь подсчёт размеров:
import os
# Внутри цикла, перед сохранением:
original_size = os.path.getsize(source_path)
# После сохранения:
converted_size = os.path.getsize(target_path)
savings = (original_size - converted_size) / original_size * 100
print(f"✅ {filename} → {savings:.1f}% сэкономлено")
Так ты увидишь, сколько реально сэкономил. На больших проектах это может быть несколько гигабайт.
Сравнение: WebP vs JPEG vs PNG
Не все понимают, когда какой формат использовать. Вот таблица, которая поможет принять решение:
| Критерий | WebP | JPEG | PNG |
|---|---|---|---|
| Поддержка браузерами | Chrome, Firefox, Edge, Safari 14+, все современные | все | все |
| Сжатие (без потерь) | лучшее | среднее | хорошее |
| Поддержка прозрачности | да | нет | да |
| Анимация | да | нет | да |
| Размер (средний) | на 30–50% меньше JPEG | базовый | на 50–80% больше JPEG |
| Когда использовать | всё, что можно — фоны, баннеры, продукты | только если WebP не поддерживается | только логотипы, иконки, изображения с текстом |
Вывод: WebP — это новый стандарт. Если ты не используешь его, ты упускаешь 30–50% скорости загрузки. JPEG — устаревший формат для веба. PNG — хорош для иконок, но слишком тяжёл для больших картинок.
Частые ошибки — и как их избежать
Я видел, как люди ломали сайты, конвертируя изображения. Вот что не надо делать:
- Перезаписывать оригиналы без резервной копии — если что-то пойдёт не так, и браузер не поддерживает WebP, ты потеряешь изображения. Всегда сохраняй в отдельную папку сначала.
- Ставить качество 100 — это не даст прироста, но увеличит размер. WebP при 100% всё равно больше JPEG при 90%. 80 — оптимально.
- Конвертировать SVG — SVG — это вектор, он не нуждается в WebP. Если ты сконвертируешь SVG в WebP — ты получишь растровую копию, и он потеряет масштабируемость.
- Игнорировать старые браузеры — если у тебя есть пользователи с Safari 12 или IE11, WebP не откроется. Решение: используй
<picture>в HTML (об этом ниже). - Запускать скрипт на сервере без теста — если ты запустишь его на продакшене, и он начнёт перезаписывать файлы — сайт упадёт. Всегда тестируй на копии.
Как лучше сделать: рекомендации от практика
Вот что я делаю на реальных проектах:
- Всегда сохраняю WebP в отдельную папку — например,
images_webp. Это позволяет легко откатиться. - Проверяю 5–10 случайных файлов — открываю в Chrome, Firefox, Safari. Сравниваю с оригиналом. Если нет артефактов — всё ок.
- Использую <picture> в HTML — это гарантирует совместимость. Пример:
<picture>
<source srcset="images_webp/photo.webp" type="image/webp">
<img src="images/photo.jpg" alt="Описание">
</picture> Браузер сам выберет WebP, если поддерживает. Если нет — покажет JPEG.
- Обновляю CMS и шаблоны — если ты используешь WordPress, Shopify, или другой движок — найди, где генерируются изображения. Скорее всего, тебе нужно будет изменить шаблон вывода изображений, чтобы он использовал
<picture>. - Запускаю скрипт один раз — и забываю — после конвертации я добавляю в gitignore папку
images_webp, а в CI/CD (если есть) добавляю шаг конвертации при деплое. Это автоматизирует всё на будущее.
Что выбрать в зависимости от ситуации
Ты не одинок в этом выборе. Вот как решать:
- Если у тебя 50–200 изображений — запусти скрипт один раз. Проверь результат. Замени в HTML через
<picture>. Готово. - Если у тебя 1000+ изображений и сайт обновляется ежедневно — настрой CI/CD. Добавь этот скрипт в процесс сборки. Например, при деплое через GitHub Actions — запускай его перед загрузкой файлов на сервер.
- Если ты работаешь с клиентом, у которого старый сайт на Joomla — не трогай оригиналы. Создай папку
webp/, сконвертируй туда, и вручную замени ссылки в базе данных (или через шаблоны). Не рискуй. - Если ты создаёшь новый сайт — сразу работай с WebP. Загружай только WebP-файлы. Не хранить JPEG — это нормально.
Итог: что делать прямо сейчас
Ты не должен ждать «когда будет время». Вот что делать:
- Создай папку
imagesи положи туда 5–10 тестовых изображений (JPEG и PNG). - Установи Pillow:
pip install Pillow. - Скопируй скрипт выше в файл
convert_to_webp.py. - Запусти его:
python convert_to_webp.py. - Проверь папку
images_webp— открой файлы в браузере. - Если всё выглядит нормально — сделай резервную копию папки с изображениями.
- Запусти скрипт на всех файлах.
- Замени все
<img src="...jpg">на<picture>с WebP-источником.
Через час ты получишь сайт, который загружается быстрее, потребляет меньше трафика, и лучше ранжируется. Это не «хорошая практика» — это базовое требование для современного веба. Ты не делаешь это, потому что «не знаешь как». Теперь ты знаешь. Делай.
Информация в этой статье носит ознакомительный характер. Перед изменениями на рабочем сайте всегда создавайте резервные копии и тестируйте изменения в изолированной среде.


