Обновление прокси-скрапинга с помощью браузера для скрапинга Bright Data

Перейдите на Bright Data Scraping Browser для упрощенного и высокопроизводительного веб-скрапинга без ручного управления прокси-сервером.
1 мин. чтения
Upgrade Proxy Scraping with Bright Data's Scraping Browser blog image

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

В этой статье рассказывается о том, как перейти от традиционного скраппинга на основе прокси-серверов к Bright Data Scraping Browser. Узнайте, как автоматизировать управление прокси и масштабирование, чтобы снизить затраты на разработку и обслуживание. Будет проведено сравнение обоих методов с учетом конфигурации, производительности, масштабируемости и сложности.

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

Пререквизиты

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

  • Node.js
  • Код Visual Studio
  • Бесплатная учетная запись Bright Data, чтобы вы могли использовать их браузер для скрапинга

Начните с создания новой папки проекта Node.js, в которой будет храниться ваш код.

Затем откройте терминал или оболочку и создайте новый каталог с помощью следующих команд:

  mkdir scraping-tutorialrncd scraping-tutorial

Инициализируйте новый проект Node.js:

  npm init -y

Флаг -y автоматически отвечает "да" на все вопросы, создавая файл package.json с настройками по умолчанию.

Веб-скраппинг на основе прокси-сервера

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

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

Создание сценария веб-скрапинга с помощью Puppeteer

Начните с установки Puppeteer:

  npm install puppeteer

Затем создайте файл proxy-scraper.js (вы можете назвать его как угодно) в папке scraping-tutorial и добавьте в него следующий код:

  const puppeteer = require("puppeteer");

(async () => {
  // Launch a headless browser
  const browser = await puppeteer.launch({
    headless: true,
  });
  const page = await browser.newPage();

  const baseUrl = "https://books.toscrape.com/catalogue/page-";
  const books = [];

  for (let i = 1; i  {
      let books = [];
      document.querySelectorAll(".product_pod").forEach((item) => {
        let title = item.querySelector("h3 a")?.getAttribute("title") || "";
        let price = item.querySelector(".price_color")?.innerText || "";
        books.push({ title, price });
      });
      return books;
    });

    books.push(...pageBooks); // Append books from this page to the main list
  }

  console.log(books); // Print the collected data

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

Этот скрипт использует Puppeteer для поиска названий и цен книг с первых пяти страниц сайта Books to Scrape. Он запускает безголовый браузер, открывает новую страницу и переходит по каждой странице каталога.

Для каждой страницы скрипт использует селекторы DOM в page.evaluate() для извлечения названий книг и цен, сохраняя данные в массив. Когда все страницы обработаны, данные выводятся в консоль, а браузер закрывается. Этот подход позволяет эффективно извлекать данные из страничного веб-сайта.

Протестируйте и запустите код с помощью следующей команды:

node proxy-scraper.js

Ваш вывод должен выглядеть следующим образом:

  Navigating to: https://books.toscrape.com/catalogue/page-1.htmlrnNavigating to: https://books.toscrape.com/catalogue/page-2.htmlrnNavigating to: https://books.toscrape.com/catalogue/page-3.htmlrnNavigating to: https://books.toscrape.com/catalogue/page-4.htmlrnNavigating to: https://books.toscrape.com/catalogue/page-5.htmlrn[rn  { title: 'A Light in the Attic', price: '£51.77' },rn  { title: 'Tipping the Velvet', price: '£53.74' },rn  { title: 'Soumission', price: '£50.10' },rn  { title: 'Sharp Objects', price: '£47.82' },rn  { title: 'Sapiens: A Brief History of Humankind', price: '£54.23' },rn  { title: 'The Requiem Red', price: '£22.65' },rn…output omitted…rn  {rn    title: 'In the Country We Love: My Family Divided',rn    price: '£22.00'rn  }rn]

Настройка прокси-серверов

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

Поместите прокси в массив или храните их в отдельном файле, если хотите:

  const proxies = [
  "proxy1.example.com:port", 
  "proxy2.example.com:port"
  // Add more proxies here
];

Использование логики вращения прокси

Давайте дополним код логикой, которая будет перебирать массив прокси при каждом запуске браузера. Обновите файл proxy-scraper.js и добавьте в него следующий код:

  const puppeteer = require("puppeteer");

const proxies = [
  "proxy1.example.com:port", 
  "proxy2.example.com:port"
  // Add more proxies here
];

(async () => {
  // Choose a random proxy
  const randomProxy =
    proxies[Math.floor(Math.random() * proxies.length)];

  // Launch Puppeteer with proxy
  const browser = await puppeteer.launch({
    headless: true,
    args: [
      `--proxy-server=http=${randomProxy}`,
      "--no-sandbox",
      "--disable-setuid-sandbox",
      "--ignore-certificate-errors",
    ],
  });

  const page = await browser.newPage();

  const baseUrl = "https://books.toscrape.com/catalogue/page-";
  const books = [];

  for (let i = 1; i  {
      let books = [];
      document.querySelectorAll(".product_pod").forEach((item) => {
        let title = item.querySelector("h3 a")?.getAttribute("title") || "";
        let price = item.querySelector(".price_color")?.innerText || "";
        books.push({ title, price });
      });
      return books;
    });

    books.push(...pageBooks); // Append books from this page to the main list
  }

  console.log(`Using proxy: ${randomProxy}`);
  console.log(books); // Print the collected data

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

Примечание: Вместо того чтобы выполнять вращение прокси вручную, вы можете использовать библиотеку типа luminati-proxy, чтобы автоматизировать этот процесс.

В этом коде случайный прокси выбирается из списка прокси и применяется к Puppeteer с помощью опции --proxy-server=${randomProxy}. Чтобы избежать обнаружения, также назначается случайная строка пользовательского агента. Затем логика скраппинга повторяется, и записывается прокси, используемый для скраппинга данных о продукте.

При повторном выполнении кода вы должны увидеть вывод, как и раньше, но с добавлением прокси, который был использован:

  Navigating to: https://books.toscrape.com/catalogue/page-1.htmlrnNavigating to: https://books.toscrape.com/catalogue/page-2.htmlrnNavigating to: https://books.toscrape.com/catalogue/page-3.htmlrnNavigating to: https://books.toscrape.com/catalogue/page-4.htmlrnNavigating to: https://books.toscrape.com/catalogue/page-5.htmlrnUsing proxy: 115.147.63.59:8081rn…output omitted…

Проблемы при использовании скрапинга на основе прокси-сервера

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

  • Частые блокировки: прокси могут быть заблокированы, если сайт имеет строгую защиту от ботов.
  • Накладные расходы на производительность: ротация прокси-серверов и повторные запросы замедляют работу конвейера сбора данных.
  • Сложная масштабируемость: управление и ротация большого пула прокси-серверов для обеспечения оптимальной производительности и доступности – сложная задача. Это требует балансировки нагрузки, предотвращения чрезмерного использования прокси, периодов охлаждения и обработки отказов в режиме реального времени. Сложность возрастает при увеличении числа запросов, поскольку система должна избегать обнаружения, постоянно отслеживая и заменяя IP-адреса, занесенные в черный список или не справляющиеся со своей работой.
  • Обслуживание браузера: Обслуживание браузера может быть как технически сложным, так и ресурсоемким. Вам необходимо постоянно обновлять и обрабатывать отпечатки браузера (куки, заголовки и другие идентифицирующие атрибуты), чтобы имитировать реальное поведение пользователя и обходить современные средства защиты от ботов.
  • Накладные расходы облачных браузеров: облачные браузеры создают дополнительные операционные накладные расходы за счет повышенных требований к ресурсам и сложного управления инфраструктурой, что приводит к увеличению операционных расходов. Масштабирование экземпляров браузера для обеспечения стабильной производительности еще больше усложняет процесс.

DynamicScraping с помощью браузера Bright Data Scraping Browser

Чтобы справиться с этими проблемами, можно использовать единое API-решение, например Bright Data Scraping Browser. Это упрощает работу, избавляет от необходимости ручной ротации прокси и сложных настроек браузера, а также часто приводит к более успешному извлечению данных.

Настройка учетной записи Bright Data

Чтобы начать, войдите в свою учетную запись Bright Data, перейдите в раздел Proxies & Scraping, прокрутите вниз до Scraping Browser и нажмите Get Started:

Приборная панель Bright Data

Сохраните конфигурацию по умолчанию и нажмите кнопку Добавить, чтобы создать новый экземпляр Scraping Browser:

Добавить браузер для скрапинга

После того как вы создали экземпляр Scraping Browser, запишите URL-адрес Puppeteer, так как он вам скоро понадобится:

Скраппинг URL-адреса браузера

Настройте код для использования браузера для сбора данных Bright Data Scraping Browser

Теперь давайте настроим код так, чтобы вместо использования вращающихся прокси вы подключались непосредственно к конечной точке Bright Data Scraping Browser.

Создайте новый файл brightdata-scraper.js и добавьте в него следующий код:

  const puppeteer = require("puppeteer");

(async () => {
  // Choose a random proxy
  const SBR_WS_ENDPOINT = "YOUR_BRIGHT_DATA_WS_ENDPOINT"

  // Launch Puppeteer with proxy
  const browser = await puppeteer.connect({
    browserWSEndpoint: SBR_WS_ENDPOINT,
  });

  const page = await browser.newPage();

  const baseUrl = "https://books.toscrape.com/catalogue/page-";
  const books = [];

  for (let i = 1; i  {
      let books = [];
      document.querySelectorAll(".product_pod").forEach((item) => {
        let title = item.querySelector("h3 a")?.getAttribute("title") || "";
        let price = item.querySelector(".price_color")?.innerText || "";
        books.push({ title, price });
      });
      return books;
    });

    books.push(...pageBooks); // Append books from this page to the main list
  }

  console.log(books); // Print the collected data

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

Убедитесь, что вы заменили YOUR_BRIGHT_DATA_WS_ENDPOINT на URL, который вы получили в предыдущем шаге.

Этот код похож на предыдущий, но вместо того, чтобы иметь список прокси и жонглировать между различными прокси, вы подключаетесь непосредственно к конечной точке Bright Data.

Выполните следующий код:

  node brightdata-scraper.js

Ваши результаты должны быть такими же, как и раньше, но теперь вам не нужно вручную вращать прокси-серверы или настраивать агенты пользователя. Браузер Bright Data Scraping Browser справится со всем – от ротации прокси до обхода CAPTCHA – обеспечивая бесперебойную работу по сбору данных.

Превратите код в конечную точку Express

Если вы хотите интегрировать Bright Data Scraping Browser в более крупное приложение, рассмотрите возможность его использования в качестве конечной точки Express.

Начните с установки Express:

  npm install express

Создайте файл server.js и добавьте в него следующий код:

  const express = require("express");
const puppeteer = require("puppeteer");

const app = express();
const PORT = 3000;

// Needed to parse JSON bodies:
app.use(express.json());

// Your Bright Data Scraping Browser WebSocket endpoint
const SBR_WS_ENDPOINT =
 "wss://brd-customer-hl_264b448a-zone-scraping_browser2:[email protected]:9222";

/**
 POST /scraper
 Body example:
 {
    "baseUrl": "https://books.toscrape.com/catalogue/page-"
 }
*/
app.post("/scrape", async (req, res) => {
  const { baseUrl } = req.body;

  if (!baseUrl) {
    return res.status(400).json({
      success: false,
      error: 'Missing "baseUrl" in request body.',
    });
  }

  try {
    // Connect to the existing Bright Data (Luminati) Scraping Browser
    const browser = await puppeteer.connect({
      browserWSEndpoint: SBR_WS_ENDPOINT,
    });

    const page = await browser.newPage();
    const books = [];

    // Example scraping 5 pages of the base URL
    for (let i = 1; i  {
        const data = [];
        document.querySelectorAll(".product_pod").forEach((item) => {
          const title = item.querySelector("h3 a")?.getAttribute("title") || "";
          const price = item.querySelector(".price_color")?.innerText || "";
          data.push({ title, price });
        });
        return data;
      });

      books.push(...pageBooks);
    }

    // Close the browser connection
    await browser.close();

    // Return JSON with the scraped data
    return res.json({
      success: true,
      books,
    });
  } catch (error) {
    console.error("Scraping error:", error);
    return res.status(500).json({
      success: false,
      error: error.message,
    });
  }
});

// Start the Express server
app.listen(PORT, () => {
  console.log(`Server is listening on http://localhost:${PORT}`);
});

В этом коде вы инициализируете приложение Express, принимаете полезную нагрузку в формате JSON и определяете маршрут POST /scrape. Клиенты отправляют тело JSON, содержащее baseUrl, которое затем перенаправляется на конечную точку Bright Data Scraping Browser с целевым URL.

Запустите новый сервер Express:

  node server.js

Чтобы проверить конечную точку, вы можете использовать такой инструмент, как Postman (или любой другой REST-клиент по вашему выбору), или использовать curl из терминала или оболочки, как показано ниже:

  curl -X POST http://localhost/scrape 
n-H 'Content-Type: application/json' 
n-d '{u0022baseUrlu0022: u0022https://books.toscrape.com/catalogue/page-u0022}'rn

Ваш вывод должен выглядеть следующим образом:

  {
  "success": true,
  "books": [
    {
      "title": "A Light in the Attic",
      "price": "£51.77"
    },
    {
      "title": "Tipping the Velvet",
      "price": "£53.74"
    },
    {
      "title": "Soumission",
      "price": "£50.10"
    },
    {
      "title": "Sharp Objects",
      "price": "£47.82"
    },
    {
      "title": "Sapiens: A Brief History of Humankind",
      "price": "£54.23"
    },
    {
      "title": "The Requiem Red",
      "price": "£22.65"
    },
    {
      "title": "The Dirty Little Secrets of Getting Your Dream Job",
      "price": "£33.34"
    },
    {
      "title": "The Coming Woman: A Novel Based on the Life of the Infamous Feminist, Victoria Woodhull",
      "price": "£17.93"
    },
    
    ... output omitted...
    
    {
      "title": "Judo: Seven Steps to Black Belt (an Introductory Guide for Beginners)",
      "price": "£53.90"
    },
    {
      "title": "Join",
      "price": "£35.67"
    },
    {
      "title": "In the Country We Love: My Family Divided",
      "price": "£22.00"
    }
  ]
}

Ниже приведена диаграмма, показывающая разницу между ручной настройкой (вращающийся прокси) и подходом Bright Data Scraping Browser:

Ручная настройка по сравнению с браузером Bright Data Scraping Browser

Управление вращающимися вручную прокси-серверами требует постоянного внимания и настройки, что приводит к частым блокировкам и ограниченной масштабируемости.

Использование браузера Bright Data Scraping Browser упрощает процесс, избавляя вас от необходимости управлять прокси-серверами или заголовками, а также обеспечивает более быстрое время отклика благодаря оптимизированной инфраструктуре. Встроенные стратегии защиты от ботов повышают процент успеха, снижая вероятность блокировки или пометки.

Весь код для этого руководства доступен в этом репозитории GitHub.

Рассчитайте рентабельность инвестиций

Переход от ручной настройки скрапинга на основе прокси-сервера к Bright Data Scraping Browser может значительно сократить время и затраты на разработку.

Традиционная установка

Для ежедневного соскабливания новостных сайтов требуется следующее:

  • Первоначальная разработка: ~50 часов ($5,000 USD при $100 USD/час)
  • Текущее обслуживание: ~10 часов в месяц ($1,000 USD) на обновление кода, инфраструктуры, масштабирование и управление прокси.
  • Стоимость прокси/IP: ~$250 USD/месяц (зависит от потребностей в IP)

Общая предполагаемая ежемесячная стоимость: ~$1,250 USD

Настройка браузера Bright Data Scraping

  • Время разработки: 5-10 часов ($1,000 USD)
  • Обслуживание: ~2-4 часа/месяц ($200 USD)
  • Не требуетсяуправление прокси-сервером или инфраструктурой
  • Стоимость услуг Bright Data:
    • Использование трафика: $8,40 USD/GB(например, 30GB/месяц = $252 USD)

Общая предполагаемая ежемесячная стоимость: ~ $450 USD

Автоматизация управления прокси-серверами и масштабирование Bright Data Scraping Browser снижают как первоначальные затраты на разработку, так и текущее обслуживание, делая крупномасштабную работу по сбору данных более эффективной и экономически выгодной.

Заключение

Переход от традиционной конфигурации веб-скрапинга на основе прокси к Bright Data Scraping Browser избавляет от необходимости ротации прокси и ручной борьбы с ботами.

Помимо извлечения HTML, Bright Data предлагает дополнительные инструменты для упрощения извлечения данных:

  • Веб-скраперы помогут привести в порядок извлечение данных
  • API Web Unlocker для поиска более сложных сайтов
  • Наборы данных, позволяющие получить доступ к предварительно собранным структурированным данным

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

Кредитная карта не требуется