July 4

Веб-скрейпинг с Puppeteer: Навигируйте, извлекайте и автоматизируйте как профи

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

Мы расскажем вам об основах — настройке Puppeteer, работе со сложным динамическим контентом и использовании прокси для обхода блокировок и лимитов. Готовы скрейпить как профессионал? Поехали!

Почему стоит выбрать Puppeteer

Puppeteer — это не просто обычный скрейпер. Он управляет полноценным браузером — Chrome или Chromium — выполняя все скрипты так же, как это сделал бы человек. Это значит, что вы получаете реальный контент страницы, даже если он формируется JavaScript после загрузки.

Вот почему это важно:

  • Сбор динамического контента: Извлекайте данные с сайтов, которые не отдают статический HTML.
  • Автоматизированное тестирование: Запускайте реальные браузерные тесты без интерфейса.
  • Мониторинг SEO: Отслеживайте обновления на сайтах конкурентов, сильно зависящих от JavaScript.

Но одного скрейпинга недостаточно. Сайты борются с этим с помощью блокировок IP и лимитов частоты запросов. Вот тут прокси становятся вашим секретным оружием.

Настройка Puppeteer

Первым делом установите Puppeteer:

npm install puppeteer

По умолчанию Puppeteer работает в headless-режиме — без открытия окна браузера. Это быстрее и легче. Хотите видеть, что происходит во время разработки? Отключите headless-режим.

Пример для запуска Puppeteer и открытия страницы:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({ headless: true });
  const page = await browser.newPage();
  await page.goto('https://books.toscrape.com/');
  console.log('Страница загружена!');
  await browser.close();
})();

Извлечение данных

После открытия страницы Puppeteer позволяет вам получать нужные данные, взаимодействуя с DOM.

Хотите названия книг, цены и наличие? Смотрите пример:

const titleSelector = 'article.product_pod h3 a';
const priceSelector = 'article.product_pod p.price_color';
const availabilitySelector = 'article.product_pod p.instock.availability';

const bookData = await page.evaluate((titleSel, priceSel, availSel) => {
  const books = [];
  const titles = document.querySelectorAll(titleSel);
  const prices = document.querySelectorAll(priceSel);
  const availability = document.querySelectorAll(availSel);

  titles.forEach((title, i) => {
    books.push({
      title: title.textContent.trim(),
      price: prices[i].textContent.trim(),
      availability: availability[i].textContent.trim(),
    });
  });

  return books;
}, titleSelector, priceSelector, availabilitySelector);

console.log(bookData);

В итоге у вас будет структурированный JSON с данными, готовыми к использованию.

Гладкая работа с динамическим контентом

JavaScript-насыщенные сайты не загружают всё сразу. Puppeteer поможет вам с этим.

Используйте:

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

Пример:

await page.goto('https://books.toscrape.com/');
await page.waitForSelector('article.product_pod');

Так вы будете уверены, что скрейпите реальный контент, а не пустую оболочку.

Использование Puppeteer с прокси

Практический пример с использованием резидентных прокси:

const puppeteer = require('puppeteer');

(async () => {
  const proxyServer = 'rp.scrapegw.com:6060';
  const proxyUsername = 'proxy_username';
  const proxyPassword = 'proxy_password';

  const browser = await puppeteer.launch({
    headless: true,
    args: [`--proxy-server=http://${proxyServer}`],
  });

  const page = await browser.newPage();

  await page.authenticate({
    username: proxyUsername,
    password: proxyPassword,
  });

  await page.goto('https://httpbin.org/ip', { waitUntil: 'networkidle2' });

  const content = await page.evaluate(() => document.body.innerText);
  console.log('Текущий IP:', content);

  await browser.close();
})();

Этот скрипт:

  • Запускает Puppeteer через прокси.
  • Аутентифицируется с помощью учетных данных прокси.
  • Проверяет ваш IP, чтобы убедиться, что прокси работает.

Почему прокси так важны

Без прокси ваш IP быстро могут заблокировать или запретить доступ. Прокси решают эту проблему, подменяя IP-адреса, помогая избежать обнаружения и оставаться «в тени». Они также позволяют получать данные, доступные только для определённых регионов, расширяя ваши возможности. К тому же, прокси равномерно распределяют ваши запросы, предотвращая превышение лимитов и обеспечивая бесперебойный сбор данных.

Заключение

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