Скачивание изображений

Puppeteer предоставляет множество возможностей для работы с веб-страницами через браузер Chrome или Chromium. Одной из частых задач является автоматизация процесса скачивания изображений с веб-страниц, что может быть полезно в различных сценариях, включая тестирование, парсинг данных или боты для сбора контента.

Подготовка к скачиванию

Для того чтобы начать скачивание изображений, необходимо установить Puppeteer и подготовить базовую настройку. Стандартная установка Puppeteer выглядит следующим образом:

npm install puppeteer

После этого можно создать файл с кодом для автоматизации. В первую очередь создаётся экземпляр браузера и страница, с которой будем работать.

const puppeteer = require(&

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  
  // Код для скачивания изображений
})();

Поиск изображений на странице

Для скачивания изображений нужно сначала найти все соответствующие элементы на странице, содержащие изображения. Это можно сделать с помощью методов, таких как page.$$eval</code>, чтобы извлечь список URL-адресов изображений.</p> <p>Пример извлечения всех URL изображений с веб-страницы:</p> <pre class="javascript"><code>const imageUrls = await page.$$eval('img', imgs => imgs.map(img => img.src));

Этот код находит все элементы <img> на странице и извлекает их атрибуты src, которые содержат URL изображений.

Скачивание изображений

Как только список URL изображений собран, необходимо их скачать. Для этого можно использовать библиотеку node-fetch или стандартный модуль http/https для загрузки файлов. Однако для простоты можно использовать модуль fs для записи файла на диск, а также fetch для скачивания.

Пример скачивания изображения с использованием fetch:

const fs = require('fs');
const fetch = require('node-fetch');

async function downloadImage(url, path) {
  const response = await fetch(url);
  const buffer = await response.buffer();
  fs.writeFileSync(path, buffer);
  console.log('Image downloaded to', path);
}

for (let i = 0; i < imageUrls.length; i++) {
  const imageUrl = imageUrls[i];
  const path = `./image_${i + 1}.jpg`;
  await downloadImage(imageUrl, path);
}

Здесь создаётся функция downloadImage, которая загружает изображение по URL и сохраняет его на диск с заданным путём. В цикле скачиваются все изображения по собранным URL.

Обработка изображений с учётом ошибок

Важно предусмотреть возможные ошибки при скачивании изображений, такие как недоступные URL или проблемы с сетью. Можно обернуть процесс скачивания в блок try-catch, чтобы избежать остановки всего процесса.

async function downloadImage(url, path) {
  try {
    const response = await fetch(url);
    if (!response.ok) {
      throw new Error(`Failed to download image from ${url}`);
    }
    const buffer = await response.buffer();
    fs.writeFileSync(path, buffer);
    console.log('Image downloaded to', path);
  } catch (error) {
    console.error('Error downloading image:', error);
  }
}

Этот подход позволяет более эффективно обрабатывать ошибки и предотвращать сбои при скачивании отдельных изображений.

Прокси-сервер и задержки

Если изображения на странице подгружаются динамически или в больших количествах, может понадобиться применение задержек или использование прокси-серверов для обхода ограничений. Puppeteer предоставляет инструменты для настройки прокси-соединений, которые могут быть полезны для скачивания изображений с сайтов, ограничивающих доступ по IP.

const browser = await puppeteer.launch({
  args: ['--proxy-server=http://your.proxy:port']
});

Для добавления задержек можно использовать page.waitForTimeout:

await page.waitForTimeout(1000); // Задержка 1 секунда

Так можно гарантировать, что изображения будут загружаться корректно, и браузер будет успевать их отобразить перед скачиванием.

Использование запросов через сеть

В случаях, когда необходимо скачать изображения в рамках автоматических тестов или парсинга, можно использовать перехват сетевых запросов. Puppeteer позволяет ловить и управлять сетевыми запросами, что позволяет скачивать изображения напрямую без необходимости их поиска в DOM.

Для перехвата запросов нужно использовать событие page.on(‘response’):

page.on('response', async (response) => {
  const url = response.url();
  if (url.endsWith('.jpg') || url.endsWith('.png')) {
    const buffer = await response.buffer();
    fs.writeFileSync(`./downloaded_images/${url.split('/').pop()}`, buffer);
  }
});

Этот метод позволяет фильтровать запросы и скачивать только изображения, соответствующие нужному формату, без необходимости искать их на странице.

Скачивание изображений с различных сайтов

Скачивание изображений с различных сайтов может потребовать дополнительных настроек. Например, для некоторых сайтов может понадобиться авторизация, использование cookies или управление заголовками HTTP-запросов.

Для работы с cookies в Puppeteer можно использовать следующие методы:

  • page.setCookie() — для установки cookies перед загрузкой страницы.
  • page.cookies() — для получения всех cookies текущей страницы.

Пример с авторизацией:

await page.setCookie({
  name: 'sessionid',
  value: 'your-session-id',
  domain: 'example.com'
});

Если для скачивания изображений требуется выполнить действия на странице (например, пройти капчу или выполнить логин), можно использовать методы page.type(), page.click() и другие для взаимодействия с элементами интерфейса.

Вывод

Puppeteer — мощный инструмент для автоматизации веб-заданий, включая скачивание изображений. С его помощью можно эффективно собирать изображения с веб-страниц, управляя процессом скачивания и обработки ошибок, а также взаимодействовать с сайтом для получения доступа к защищённым данным.