Для работы с Puppeteer и MongoDB необходимо подготовить проект.
Предполагается, что используется Node.js последней версии. В терминале
создается директория проекта и инициализируется
package.json:
mkdir puppeteer-mongo
cd puppeteer-mongo
npm init -y
Устанавливаются зависимости:
npm install puppeteer mongodb dotenv
.env файл.
Создается файл .env для хранения конфиденциальных данных:
MONGO_URI=mongodb://localhost:27017
DB_NAME=testdb
COLLECTION_NAME=results
Для сохранения данных необходимо установить соединение с MongoDB. Используется асинхронная функция для подключения:
const { MongoClient } = require(&
require('dotenv').config();
async function connectToMongo() {
const client = new MongoClient(process.env.MONGO_URI);
await client.connect();
const db = client.db(process.env.DB_NAME);
const collection = db.collection(process.env.COLLECTION_NAME);
return { client, collection };
}
Ключевые моменты:
MongoClient создаёт клиентское соединение.
db.collection возвращает коллекцию для операций
insert, update и find.
client.close().
Puppeteer позволяет автоматизировать браузерные действия и извлекать данные со страниц. Пример скрипта для парсинга новостей:
const puppeteer = require('puppeteer');
async function scrapeData(url) {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.goto(url, { waitUntil: 'networkidle2' });
const data = await page.evaluate(() => {
const items = Array.from(document.querySelectorAll('.news-item'));
return items.map(item => ({
title: item.querySelector('h2').innerText.trim(),
link: item.querySelector('a').href,
date: item.querySelector('.date').innerText.trim()
}));
});
await browser.close();
return data;
}
Особенности:
headless: true запускает браузер в фоновом режиме.
waitUntil: ‘networkidle2’ гарантирует загрузку всех
ресурсов страницы.
page.evaluate позволяет выполнять код внутри контекста
браузера.
После получения данных их нужно записать в базу. Создается функция для вставки массива документов:
async function saveToMongo(data) {
const { client, collection } = await connectToMongo();
try {
if (data.length > 0) {
const result = await collection.insertMany(data);
console.log(`${result.insertedCount} документов добавлено`);
} else {
console.log('Нет данных для вставки');
}
} catch (error) {
console.error('Ошибка при сохранении в MongoDB:', error);
} finally {
await client.close();
}
}
Важные моменты:
insertMany вставляет несколько документов за один запрос,
что эффективнее, чем insertOne в цикле.
finally.
Можно объединить сбор данных и сохранение в одной функции:
async function main() {
const url = 'https://example.com/news';
const scrapedData = await scrapeData(url);
await saveToMongo(scrapedData);
}
main().catch(console.error);
Преимущества такого подхода:
При регулярном парсинге важно избегать дублирования. MongoDB поддерживает уникальные индексы:
async function ensureIndex() {
const { client, collection } = await connectToMongo();
try {
await collection.createIndex({ link: 1 }, { unique: true });
console.log('Индекс для уникальных ссылок создан');
} finally {
await client.close();
}
}
Для обновления существующих документов можно использовать
updateOne с опцией upsert: true:
await collection.updateOne(
{ link: item.link },
{ $set: item },
{ upsert: true }
);
Таким образом, новые статьи добавляются, а существующие — обновляются без дубликатов.
try/catch при работе с Puppeteer для
устойчивости к падениям страниц.
.env для конфиденциальных данных, не хранить
URI и пароли в коде.
bulkWrite) для оптимизации производительности.
Сочетание Puppeteer и MongoDB позволяет создавать автоматизированные системы сбора данных, сохранять их структурировано и поддерживать актуальность через обновления и уникальные индексы. Такой подход применяется в тестировании веб-приложений, мониторинге сайтов и аналитике контента.