При веб-скреппинге часто приходится обходить механизмы защиты от ботов, загружать динамический контент с помощью таких инструментов автоматизации браузера, как 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:
Сохраните конфигурацию по умолчанию и нажмите кнопку Добавить, чтобы создать новый экземпляр Scraping Browser:
После того как вы создали экземпляр Scraping Browser, запишите URL-адрес Puppeteer, так как он вам скоро понадобится:
Настройте код для использования браузера для сбора данных 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 упрощает процесс, избавляя вас от необходимости управлять прокси-серверами или заголовками, а также обеспечивает более быстрое время отклика благодаря оптимизированной инфраструктуре. Встроенные стратегии защиты от ботов повышают процент успеха, снижая вероятность блокировки или пометки.
Весь код для этого руководства доступен в этом репозитории 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 для поиска более сложных сайтов
- Наборы данных, позволяющие получить доступ к предварительно собранным структурированным данным
Эти решения могут упростить процесс скраппинга, снизить рабочую нагрузку и улучшить масштабируемость.