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