Обновление прокси-скрапинга с помощью браузера для скрапинга 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(u0022puppeteeru0022);rnrn(async () =u0026gt; {rn  // Launch a headless browserrn  const browser = await puppeteer.launch({rn    headless: true,rn  });rn  const page = await browser.newPage();rnrn  const baseUrl = u0022https://books.toscrape.com/catalogue/page-u0022;rn  const books = [];rnrn  for (let i = 1; i  {rn      let books = [];rn      document.querySelectorAll(u0022.product_podu0022).forEach((item) =u0026gt; {rn        let title = item.querySelector(u0022h3 au0022)?.getAttribute(u0022titleu0022) || u0022u0022;rn        let price = item.querySelector(u0022.price_coloru0022)?.innerText || u0022u0022;rn        books.push({ title, price });rn      });rn      return books;rn    });rnrn    books.push(...pageBooks); // Append books from this page to the main listrn  }rnrn  console.log(books); // Print the collected datarnrn  await browser.close();rn})();rn

Этот скрипт использует 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 = [rn  u0022proxy1.example.com:portu0022, rn  u0022proxy2.example.com:portu0022rn  // Add more proxies herern];

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

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

  const puppeteer = require(u0022puppeteeru0022);rnrnconst proxies = [rn  u0022proxy1.example.com:portu0022, rn  u0022proxy2.example.com:portu0022rn  // Add more proxies herern];rnrn(async () =u0026gt; {rn  // Choose a random proxyrn  const randomProxy =rn    proxies[Math.floor(Math.random() * proxies.length)];rnrn  // Launch Puppeteer with proxyrn  const browser = await puppeteer.launch({rn    headless: true,rn    args: [rn      `u002du002dproxy-server=http=${randomProxy}`,rn      u0022u002du002dno-sandboxu0022,rn      u0022u002du002ddisable-setuid-sandboxu0022,rn      u0022u002du002dignore-certificate-errorsu0022,rn    ],rn  });rnrn  const page = await browser.newPage();rnrn  const baseUrl = u0022https://books.toscrape.com/catalogue/page-u0022;rn  const books = [];rnrn  for (let i = 1; i  {rn      let books = [];rn      document.querySelectorAll(u0022.product_podu0022).forEach((item) =u0026gt; {rn        let title = item.querySelector(u0022h3 au0022)?.getAttribute(u0022titleu0022) || u0022u0022;rn        let price = item.querySelector(u0022.price_coloru0022)?.innerText || u0022u0022;rn        books.push({ title, price });rn      });rn      return books;rn    });rnrn    books.push(...pageBooks); // Append books from this page to the main listrn  }rnrn  console.log(`Using proxy: ${randomProxy}`);rn  console.log(books); // Print the collected datarnrn  await browser.close();rn})();rn

Примечание: Вместо того чтобы выполнять вращение прокси вручную, вы можете использовать библиотеку типа 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(u0022puppeteeru0022);rnrn(async () =u0026gt; {rn  // Choose a random proxyrn  const SBR_WS_ENDPOINT = u0022YOUR_BRIGHT_DATA_WS_ENDPOINTu0022rnrn  // Launch Puppeteer with proxyrn  const browser = await puppeteer.connect({rn    browserWSEndpoint: SBR_WS_ENDPOINT,rn  });rnrn  const page = await browser.newPage();rnrn  const baseUrl = u0022https://books.toscrape.com/catalogue/page-u0022;rn  const books = [];rnrn  for (let i = 1; i  {rn      let books = [];rn      document.querySelectorAll(u0022.product_podu0022).forEach((item) =u0026gt; {rn        let title = item.querySelector(u0022h3 au0022)?.getAttribute(u0022titleu0022) || u0022u0022;rn        let price = item.querySelector(u0022.price_coloru0022)?.innerText || u0022u0022;rn        books.push({ title, price });rn      });rn      return books;rn    });rnrn    books.push(...pageBooks); // Append books from this page to the main listrn  }rnrn  console.log(books); // Print the collected datarnrn  await browser.close();rn})();

Убедитесь, что вы заменили 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(u0022expressu0022);rnconst puppeteer = require(u0022puppeteeru0022);rnrnconst app = express();rnconst PORT = 3000;rnrn// Needed to parse JSON bodies:rnapp.use(express.json());rnrn// Your Bright Data Scraping Browser WebSocket endpointrnconst SBR_WS_ENDPOINT =rn u0022wss://brd-customer-hl_264b448a-zone-scraping_browser2:[email protected]:9222u0022;rnrn/**rn POST /scraperrn Body example:rn {rn    u0022baseUrlu0022: u0022https://books.toscrape.com/catalogue/page-u0022rn }rn*/rnapp.post(u0022/scrapeu0022, async (req, res) =u0026gt; {rn  const { baseUrl } = req.body;rnrn  if (!baseUrl) {rn    return res.status(400).json({rn      success: false,rn      error: 'Missing u0022baseUrlu0022 in request body.',rn    });rn  }rnrn  try {rn    // Connect to the existing Bright Data (Luminati) Scraping Browserrn    const browser = await puppeteer.connect({rn      browserWSEndpoint: SBR_WS_ENDPOINT,rn    });rnrn    const page = await browser.newPage();rn    const books = [];rnrn    // Example scraping 5 pages of the base URLrn    for (let i = 1; i  {rn        const data = [];rn        document.querySelectorAll(u0022.product_podu0022).forEach((item) =u0026gt; {rn          const title = item.querySelector(u0022h3 au0022)?.getAttribute(u0022titleu0022) || u0022u0022;rn          const price = item.querySelector(u0022.price_coloru0022)?.innerText || u0022u0022;rn          data.push({ title, price });rn        });rn        return data;rn      });rnrn      books.push(...pageBooks);rn    }rnrn    // Close the browser connectionrn    await browser.close();rnrn    // Return JSON with the scraped datarn    return res.json({rn      success: true,rn      books,rn    });rn  } catch (error) {rn    console.error(u0022Scraping error:u0022, error);rn    return res.status(500).json({rn      success: false,rn      error: error.message,rn    });rn  }rn});rnrn// Start the Express serverrnapp.listen(PORT, () =u0026gt; {rn  console.log(`Server is listening on http://localhost:${PORT}`);rn});

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

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

  node server.js

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

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

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

  {rn  u0022successu0022: true,rn  u0022booksu0022: [rn    {rn      u0022titleu0022: u0022A Light in the Atticu0022,rn      u0022priceu0022: u0022£51.77u0022rn    },rn    {rn      u0022titleu0022: u0022Tipping the Velvetu0022,rn      u0022priceu0022: u0022£53.74u0022rn    },rn    {rn      u0022titleu0022: u0022Soumissionu0022,rn      u0022priceu0022: u0022£50.10u0022rn    },rn    {rn      u0022titleu0022: u0022Sharp Objectsu0022,rn      u0022priceu0022: u0022£47.82u0022rn    },rn    {rn      u0022titleu0022: u0022Sapiens: A Brief History of Humankindu0022,rn      u0022priceu0022: u0022£54.23u0022rn    },rn    {rn      u0022titleu0022: u0022The Requiem Redu0022,rn      u0022priceu0022: u0022£22.65u0022rn    },rn    {rn      u0022titleu0022: u0022The Dirty Little Secrets of Getting Your Dream Jobu0022,rn      u0022priceu0022: u0022£33.34u0022rn    },rn    {rn      u0022titleu0022: u0022The Coming Woman: A Novel Based on the Life of the Infamous Feminist, Victoria Woodhullu0022,rn      u0022priceu0022: u0022£17.93u0022rn    },rn    rn    ... output omitted...rn    rn    {rn      u0022titleu0022: u0022Judo: Seven Steps to Black Belt (an Introductory Guide for Beginners)u0022,rn      u0022priceu0022: u0022£53.90u0022rn    },rn    {rn      u0022titleu0022: u0022Joinu0022,rn      u0022priceu0022: u0022£35.67u0022rn    },rn    {rn      u0022titleu0022: u0022In the Country We Love: My Family Dividedu0022,rn      u0022priceu0022: u0022£22.00u0022rn    }rn  ]rn}

Ниже приведена диаграмма, показывающая разницу между ручной настройкой (вращающийся прокси) и подходом 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 для поиска более сложных сайтов
  • Наборы данных, позволяющие получить доступ к предварительно собранным структурированным данным

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