Docker-образ — это файл, используемый для выполнения кода в Docker-контейнере. Он действует как набор инструкций для создания Docker-контейнера, аналогично шаблону. Иными словами, это эквивалент снимков в виртуальной машине.
Docker-образ содержит все библиотеки, зависимости и файлы, необходимые для запуска контейнера, делая его автономным исполняемым файлом для контейнера. Эти образы могут быть разделены и развернуты в различных местах, что делает их высоко портативными.
Browserless от Nstbrowser — это облачная служба для работы с headless-версией Chrome, которая управляет онлайн-приложениями и автоматизирует скрипты без графического интерфейса. Это особенно полезно для задач, таких как веб-скрейпинг и другие автоматизированные операции.
У вас есть интересные идеи и вопросы о веб-скрейпинге и Browserless?
Давайте узнаем, чем делятся другие разработчики на Discord и Telegram!
Использование Puppeteer в Docker имеет как минимум три преимущества:
Кроме того, запуск Puppeteer в Docker-контейнере позволяет обеспечить согласованные версии операционной системы и браузера на всех этапах разработки, тестирования и эксплуатации. Это также упрощает процесс установки браузера Chrome и его зависимостей, а также позволяет легко масштабировать контейнеры для обработки больших задач.
Кроме того, Docker-контейнеры предоставляют изолированную среду, что снижает потенциальные риски безопасности.
Прежде чем использовать Docker-образ Nstbrowser, необходимо выполнить следующие подготовительные действия:

После выполнения вышеуказанных шагов, вы можете использовать следующую команду для загрузки Docker-образа Nstbrowser:
# Загрузить образ Browserless
docker pull nstbrowser/browserless:0.0.1-beta
# Запустить образ Browserless
docker run -it -e TOKEN=xxx -e SERVER_PORT=8848 -p 8848:8848 --name nstbrowserless nstbrowser/browserless:0.0.1-beta
# После запуска вы можете использовать команду docker ps, чтобы проверить, работает ли контейнер правильно
docker ps

Теперь я покажу вам, как использовать Puppeteer на основе Docker-образа Nstbrowser для скрейпинга динамических сайтов. Мы пошагово пройдем через простой пример.
Сначала мы должны определить информацию, которую хотим собрать. В этом примере мы выберем для сбора все содержимое тега H2 на блоге Semrush и выведем его в консоль.

Далее нам нужно написать скрипт на Puppeteer для сбора нашей целевой информации. Вот код Puppeteer для входа на целевую страницу и получения содержимого тегов H2:
const page = await browser.newPage();
// Вход на целевую страницу
await page.goto('https://www.semrush.com/blog/seo-best-practices/');
// Получение содержимого тегов h2
const h2s = await page.evaluate(() => {
const h2s = Array.from(document.querySelectorAll('h2'));
return h2s.map(h2 => h2.textContent);
});
// Вывод содержимого тегов h2
console.log(h2s);
Перед реализацией этого шага выполните следующую команду для инициализации нового проекта:
cd ~
makedir puppeteer-docker
cd puppeteer-docker
Отлично! Что нам нужно сделать дальше? Просто создайте следующие три файла с нашим кодом:
import puppeteer from 'puppeteer-core';
async function execPuppeteer(browserWSEndpoint) {
try {
const browser = await puppeteer.connect({
browserWSEndpoint: browserWSEndpoint,
defaultViewport: null,
});
const page = await browser.newPage();
// Переход на целевой URL
await page.goto('https://www.semrush.com/blog/seo-best-practices/');
// Получение содержимого тегов h2
const h2s = await page.evaluate(() => {
const h2s = Array.from(document.querySelectorAll('h2'));
return h2s.map((h2) => h2.textContent);
});
// Вывод содержимого тегов h2
console.log(h2s);
// Закрытие браузера
await browser.close();
} catch (err) {
console.error('launch', err);
}
}
async function launchAndConnectToBrowser() {
const host = 'host.docker.internal:8848';
const config = {
once: true,
headless: true, // Установить headless режим
autoClose: true,
args: { '--disable-gpu': '', '--no-sandbox': '' }, // аргументы браузера должны быть в виде словаря
fingerprint: {
name: '',
platform: 'mac',
kernel: 'chromium',
kernelMilestone: 124,
hardwareConcurrency: 8,
deviceMemory: 8,
},
};
const browserWSEndpoint = `ws://${host}/ws/connect?${encodeURIComponent(
JSON.stringify(config)
)}`;
await execPuppeteer(browserWSEndpoint);
}
launchAndConnectToBrowser().then();
FROM node:18-alpine AS base
# Установка зависимостей, только если необходимо
FROM base AS deps
RUN set -eux && sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
RUN apk add --no-cache libc6-compat
RUN npm config set registry https://registry.npmmirror.com/
RUN npm install -g pnpm
# Установить рабочую директорию
WORKDIR /app
# Скопировать package.json и установить зависимости
COPY package*.json pnpm-lock.yaml ./
RUN pnpm install
WORKDIR /app
COPY --link ./ .
FROM base AS runner
# Скопировать зависимости
COPY --from=deps /app/node_modules ./node_modules
# Скопировать код приложения
COPY --from=deps /app .
# Команда запуска по умолчанию
CMD ["node", "index.mjs"]
{
"name": "docker-puppeteer",
"version": "1.0.0",
"main": "index.mjs",
"dependencies": {
"puppeteer-core": "^23.1.0"
},
"scripts": {
"start": "node index.mjs"
}
}
Превосходно! Мы создали три необходимых файла! Осталось только одно: установить зависимости проекта.
pnpm install
Вы готовы? Наконец-то мы можем создать и использовать Docker-образ:
docker build -t puppeteer-docker.
Выполнили? Теперь выполните следующую команду для запуска нашего puppeteer-docker образа. Он автоматически выполнит скрипт Puppeteer для выполнения операции скрейпинга:
docker run puppeteer-docker
Вы закончили? Пожалуйста, выполните следующий скрипт, чтобы запустить наш образ puppeteer-docker. Он автоматически выполнит наш скрипт Puppeteer для выполнения операции сбора данных:
docker run --rm --network="host" puppeteer-docker
В итоге вы увидите следующий вывод. Это результат сбора всех заголовков H2 на целевой веб-странице:

Оптимизация производительности Puppeteer в среде Docker включает в себя несколько ключевых стратегий для обеспечения эффективной работы задач автоматизации браузера.
Выбирайте легковесные базовые образы, такие как node:alpine или node:slim, чтобы уменьшить размер образа.
Удалите ненужные зависимости и файлы, а также используйте файлы .dockerignore для исключения ненужных файлов, чтобы сделать образ более компактным.
Активируйте режим без интерфейса ({ headless: true }) в Puppeteer. Это позволит запускать браузер без графического интерфейса, что снизит потребление ресурсов и повысит производительность.
Убедитесь, что контейнер Docker получает достаточно ресурсов CPU и памяти для успешного выполнения задачи автоматизации браузера.
Используйте функции ограничения ресурсов Docker (такие как --cpus и --memory), чтобы управлять использованием ресурсов контейнера и избегать конкуренции за ресурсы в многоконтейнерной среде.
Уменьшите количество слоев в Dockerfile и объедините несколько команд в одну инструкцию RUN, чтобы сократить время сборки образа.
Используйте многоступенчатую сборку для разделения зависимостей между этапами сборки и выполнения, что позволит создать более компактный финальный образ.
Улучшите эффективность сборки и сократите время последующих сборок, правильно организовав команды Dockerfile для использования кэша сборки.
Настройте параметры запуска браузера Puppeteer, такие как args, executablePath и ignoreDefaultArgs, чтобы оптимизировать поведение браузера и использование ресурсов.
Настройте флаги запуска Chromium, чтобы отключить ненужные функции или включить опции повышения производительности, такие как отключение GPU-ускорения через --disable-gpu.
Разверните приложения Puppeteer на платформах оркестрации контейнеров, таких как Docker Swarm или Kubernetes, и воспользуйтесь возможностями автоматического масштабирования, балансировки нагрузки и управления ресурсами, предоставляемыми этими платформами.
Это позволит добиться горизонтального масштабирования, распределить нагрузку на несколько контейнеров и улучшить производительность в условиях высокого трафика.
Используйте инструменты мониторинга Docker (такие как Docker Stats, Docker Events и Docker Healthchecks) для отслеживания использования ресурсов контейнера и его состояния.
Реализуйте решение для мониторинга производительности приложений (APM), такое как Prometheus, Grafana или Datadog, чтобы отслеживать и анализировать ключевые показатели производительности, такие как время отклика, пропускная способность и уровень ошибок, для выявления и устранения узких мест в производительности.
Запуск Puppeteer в среде Docker упрощает работу для разработчиков! Он предоставляет гибкое и масштабируемое решение для задач автоматизации браузера.
В этом блоге мы обсудили:
Теперь начните использовать Browserless для создания собственного мощного Docker-образа и наслаждайтесь сбором данных!