Как скрапить изображения с сайтов на Python
Важно: этот материал охватывает техническую реализацию и лучшие практики, но не заменяет юридическую консультацию по использованию изображений.
К чему это подходит и когда не подходит
Эта инструкция полезна для сбора изображений для исследований, создания миниатюр сайта, подготовки датасетов для машинного обучения или тестовых наборов. Она не предназначена для массового копирования защищённых авторским правом материалов с целью перепродажи или републикации без разрешения владельца.
Законность скрапинга изображений
Скрапинг изображений технически представляет собой скачивание открытого содержимого сайта. Это не обязательно незаконно, но существуют ограничения и правила:
- Проверьте файл /robots.txt на сайте — он может указывать запреты для ботов. Такой запрет не делает действие автоматически незаконным, но игнорирование явно выражённых ограничений — плохая практика.
- Публичный доступ к изображению не означает право на свободное коммерческое использование. Большинство изображений защищены авторским правом или лицензионными условиями.
- Всегда предполагается, что повторное использование ограничено, если не указано иное (открытые лицензии, Creative Commons и т. п.).
Важно: при сборе данных для проектов с публикацией или коммерческим использованием проконсультируйтесь с юристом.
Установка пакетов Python
Подготовьте окружение и установите зависимости. Если Python ещё не установлен, загрузите его с python.org. Рекомендуется использовать виртуальное окружение:
python -m venv venv
source venv/bin/activate # macOS/Linux
venv\Scripts\activate # WindowsУстановите нужные пакеты:
pip install bs4 requestsКратко: requests делает HTTP‑запросы, BeautifulSoup парсит HTML.
Общая идея подхода
Алгоритм простой:
- Получить HTML страницы через requests.
- Распарсить HTML с помощью BeautifulSoup и найти теги img.
- Извлечь атрибут src у каждого img.
- Преобразовать относительные URL в абсолютные через urljoin.
- Скачать каждый файл и сохранить локально, избегая конфликтов имён.
Эта модель работает для большинства статических страниц. Для динамических страниц (контент формируется JavaScript) понадобятся другие методы.
Как получить URL изображений с помощью BeautifulSoup
Создайте файл, например scrape_images.py, и начните с запроса страницы. Каждый фрагмент кода в этом руководстве продолжает предыдущий.
import requests
URL = "imagesiteURL" # Replace this with the website's URL
getURL = requests.get(URL, headers={"User-Agent":"Mozilla/5.0"})
print(getURL.status_code)Код выводит HTTP‑код ответа. 200 означает успех. Проверьте сеть и URL, если код другой.
Далее распарсите HTML с помощью BeautifulSoup:
from bs4 import BeautifulSoup
soup = BeautifulSoup(getURL.text, 'html.parser')
images = soup.find_all('img')
print(images)Каждый элемент в images — объект BeautifulSoup, представляющий тег img. Извлеките атрибут src:
imageSources = []
for image in images:
imageSources.append(image.get('src'))
print(imageSources)Теперь у вас есть список адресов изображений, но они могут быть относительными.
Сохранение изображений
Создайте папку images в корне проекта. Для корректной загрузки нужен абсолютный URL (с http:// или https://). Для преобразования относительных URL используйте requests.compat.urljoin.
Простейший вариант для абсолютных URL:
for image in imageSources:
webs = requests.get(image)
open('images/' + image.split('/')[-1], 'wb').write(webs.content)image.split(‘/‘)[-1] берёт имя файла из пути. Но имена могут конфликтовать при одинаковых именах файлов на разных страницах.
Полный и более надёжный пример с преобразованием URL:
from bs4 import BeautifulSoup
URL = "imagesiteURL" # Replace this with the website's URL
getURL = requests.get(URL, headers={"User-Agent":"Mozilla/5.0"})
soup = BeautifulSoup(getURL.text, 'html.parser')
images = soup.find_all('img')
resolvedURLs = []
for image in images:
src = image.get('src')
resolvedURLs.append(requests.compat.urljoin(URL, src))
for image in resolvedURLs:
webs = requests.get(image)
open('images/' + image.split('/')[-1], 'wb').write(webs.content)Этот код сохраняет изображения по имени файла, взятому из URL. Его можно улучшить, чтобы избежать перезаписи и обрабатывать ошибки.
Практические улучшения и надёжность
Рассмотрите следующие улучшения для продакшн‑скрапера:
- Проверка статуса ответа при скачивании изображения (200 OK).
- Ограничение скорости запросов и задержки между запросами (time.sleep) для вежливого обращения к серверу.
- Обход повторных имён файлов: добавлять префикс с хешем URL или временную метку.
- Лимит на максимальный размер файла и проверка типа контента (Content-Type начинается с image/).
- Обработка исключений requests.exceptions.RequestException.
- Логирование прогресса и ошибок.
Пример с обработкой ошибок и уникализацией имён:
import os
import hashlib
import time
import requests
from bs4 import BeautifulSoup
os.makedirs('images', exist_ok=True)
URL = "imagesiteURL"
resp = requests.get(URL, headers={"User-Agent":"Mozilla/5.0"})
resp.raise_for_status()
soup = BeautifulSoup(resp.text, 'html.parser')
for img in soup.find_all('img'):
src = img.get('src')
url = requests.compat.urljoin(URL, src)
try:
r = requests.get(url, timeout=10)
if r.status_code == 200 and r.headers.get('Content-Type', '').startswith('image'):
name = url.split('/')[-1]
# добавляем хеш, чтобы избежать конфликтов
h = hashlib.md5(url.encode('utf-8')).hexdigest()[:8]
filename = f"images/{h}_{name}"
with open(filename, 'wb') as f:
f.write(r.content)
time.sleep(0.2)
except requests.exceptions.RequestException:
continueКогда этот подход не работает
- Динамический контент: если изображения подгружаются JavaScript после загрузки страницы, BeautifulSoup не увидит их. Решения: использовать Selenium, Playwright или обращаться к API сайта, если он есть.
- Защитные механизмы: сайты могут блокировать ботов по частоте запросов, по токенам, по заголовкам или через WAF. В таких случаях стоит связаться с владельцем сайта или использовать официальное API.
- Лицензии и права: скачивание возможно, но использование изображений может быть запрещено системой лицензий.
Альтернативные подходы
- Selenium или Playwright для рендеринга JavaScript и получения динамически загружаемых изображений.
- Использование публичных API (например, поисковых API, сервисов изображений) — чаще безопаснее и предсказуемее.
- HEAD‑запросы для проверки наличия ресурса и типов контента перед скачиванием полного файла.
Быстрая методология сбора изображений
- Оцените легальность и требования по лицензии.
- Проверьте /robots.txt.
- Примените requests + BeautifulSoup для статичных страниц.
- Для динамики — рендеринг браузера (Selenium/Playwright) либо официальный API.
- Сохраняйте метаданные (исходный URL, дата скачивания, Content-Type, размер).
- Уникализируйте имена и логируйте ошибки.
Роль‑ориентированные чеклисты
Data Scientist
- Нужны ли метки и аннотации для датасета?
- Проверено качество изображений и баланс классов?
- Соблюдены ли лицензии и приватность?
ML Engineer
- Автоматизирован ли пайплайн скачивания?
- Есть ли проверка целостности и SLI/SLO для процесса?
- Включена ли детекция дубликатов и очистка метаданных?
Backend разработчик
- Есть ли очередь заданий и контроль скорости запросов?
- Обработаны ли ошибки и таймауты?
- Логи и мониторинг настроены?
Юрист или ответственный за комплаенс
- Проверены ли лицензии изображений?
- Есть ли процесс получения разрешений?
- Оценены риски GDPR для персональных изображений?
Критерии приёмки
- Скрипт скачивает N тестовых изображений с целевого сайта без ошибок.
- Все скачанные файлы имеют валидный Content-Type image/* и ненулевой размер.
- Нет перезаписанных файлов благодаря уникальным именам.
- Лог ошибок и список успешно скачанных URL сохранены в CSV/JSON.
Безопасность и приватность
- Не собирайте и не храните персональные данные без правовой основы. Фотографии людей могут подпадать под правила конфиденциальности.
- Храните собранные данные в защищённом месте и ограничьте доступ.
- При публикации датасета удаляйте или анонимизируйте чувствительные изображения.
Шаблон быстрого плейбука (SOP)
- Создать виртуальное окружение.
- Установить зависимости.
- Проверить /robots.txt и политику сайта.
- Запустить тестовый прогон на 10 URL.
- Визуально проверить выборку.
- Запустить массовую загрузку с ограничением скорости и мониторингом.
Короткие рекомендации по отладке
- Если images пусты, проверьте HTML через print(getURL.text) — возможно, контент рендерится JS.
- Если получаете 403, попробуйте изменить User-Agent, но не используйте это для обхода явных ограничений.
- Для больших объёмов используйте асинхронные загрузчики (aiohttp) и очереди.
Мини‑глоссарий
- requests: библиотека для HTTP‑запросов в Python.
- BeautifulSoup: парсер HTML/XML.
- urljoin: функция для приведения относительного URL к абсолютному.
- Content-Type: HTTP‑заголовок с типом содержимого.
Короткое резюме
Скрапинг изображений на Python — это повторяемая задача: получить HTML, найти теги img, нормализовать URL и скачать файлы. Для надёжности добавьте обработку ошибок, уникализацию имён, уважайте robots.txt и лицензии. Для динамического контента применяйте рендеринг браузера или официальные API.
Важно: проверяйте юридические аспекты использования собранных изображений и обеспечивайте безопасность и приватность данных.
Похожие материалы
Как создать Cover Story на LinkedIn