Структура хранения данных

Puppeteer — это библиотека Node.js, предоставляющая высокоуровневый API для управления браузером Chromium или Chrome через протокол DevTools. Для работы с Puppeteer необходимо установить пакет:

npm install puppeteer

Создание экземпляра браузера и открытие страницы выполняется через асинхронные функции:

const puppeteer = require(&

(async () => {
    const browser = await puppeteer.launch({ headless: true });
    const page = await browser.newPage();
    await page.goto('https://example.com');
})();

Ключевые моменты:

  • headless: true — запуск без визуального интерфейса.
  • page.goto(url) — загрузка страницы по URL.
  • Все действия Puppeteer асинхронны, поэтому применяется await.

Навигация и управление страницами

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

Пример навигации и клика по элементу:

await page.click('#submit-button'); // Клик по кнопке
await page.type('#username', 'testuser'); // Ввод текста
await page.waitForSelector('.result'); // Ожидание появления элемента

Особенности работы с элементами:

  • page.(selector) < /code > —возвращаетпервыйэлементпоселектору. < /li >  < li >  < code > page.$(selector) — возвращает массив всех элементов.
  • page.evaluate() — выполнение JS-кода в контексте страницы.
const title = await page.evaluate(() => document.title);

Структура хранения данных

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

Примеры структурирования данных:

  1. Объектно-ориентированный подход
const pageData = {
    url: 'https://example.com',
    title: '',
    links: [],
};

pageData.title = await page.evaluate(() => document.title);
pageData.links = await page.evaluate(() =>
    Array.from(document.querySelectorAll('a')).map(a => a.href)
);
  1. Массив объектов для множественных страниц
const sites = [
    { url: 'https://site1.com', title: '', status: '' },
    { url: 'https://site2.com', title: '', status: '' }
];

for (const site of sites) {
    await page.goto(site.url);
    site.title = await page.evaluate(() => document.title);
    site.status = await page.evaluate(() => document.readyState);
}

Рекомендации по структуре данных:

  • Использовать объекты для описания каждой сущности (страницы, элемента).
  • Массивы объектов позволяют легко расширять данные и агрегировать результаты.
  • Промежуточные данные можно хранить в JSON для последующего анализа или логирования.

Сериализация и хранение результатов

После сбора данных важно их сохранить для анализа или использования в других тестах. Puppeteer работает с Node.js, поэтому удобно использовать файловую систему.

const fs = require('fs');

fs.writeFileSync('results.json', JSON.stringify(pageData, null, 2));

Особенности сериализации:

  • JSON.stringify(obj, null, 2) делает вывод читаемым для человека.
  • Сложные объекты можно преобразовывать через map или reduce перед сохранением.
  • Для больших объёмов данных рекомендуется разбивать на несколько файлов или использовать базы данных (например, MongoDB).

Работа с асинхронными потоками данных

При парсинге нескольких страниц или элементов важно корректно обрабатывать асинхронность.

const urls = ['https://example1.com', 'https://example2.com'];

const results = await Promise.all(urls.map(async (url) => {
    await page.goto(url);
    const title = await page.evaluate(() => document.title);
    return { url, title };
}));

Ключевые моменты:

  • Promise.all позволяет параллельно обрабатывать массив страниц.
  • Асинхронные функции должны корректно возвращать результаты для дальнейшего использования.
  • Синхронизация с await необходима для последовательной обработки данных, если важен порядок.

Обработка ошибок и стабильность данных

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

try {
    await page.goto('https://example.com', { timeout: 5000 });
    const title = await page.evaluate(() => document.title);
} catch (error) {
    console.error('Ошибка загрузки страницы:', error);
}

Рекомендации:

  • Устанавливать таймауты и проверки наличия элементов через waitForSelector.
  • Логировать ошибки вместе с URL страницы для диагностики.
  • Сохранять частично собранные данные при сбоях.

Использование базы данных

Для больших проектов предпочтительно использовать базы данных для хранения результатов Puppeteer.

Пример с MongoDB:

const { MongoClient } = require('mongodb');
const client = new MongoClient('mongodb://localhost:27017');

await client.connect();
const db = client.db('puppeteer');
const collection = db.collection('pages');

await collection.insertMany(results);

Преимущества:

  • Централизованное хранение больших массивов данных.
  • Возможность фильтрации, поиска и агрегации.
  • Поддержка многопоточной обработки без риска потери данных.

Итоговая структура данных

Эффективная организация данных Puppeteer предполагает:

  • Объекты для каждой страницы или элемента.
  • Массивы для агрегирования множества объектов.
  • JSON или базы данных для долговременного хранения.
  • Обработка ошибок и асинхронных потоков для стабильности результатов.

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