Веб-скраппинг с помощью браузера Bright Data на Apify

Узнайте, как интегрировать браузер Scraping Browser от Bright Data с Apify, чтобы повысить эффективность веб-скреппинга, сократить расходы и обойти проблемы с анти-ботами.
7 мин. чтения
Scraping Browser + Apify blog image

В этой статье вы узнаете:

  • Что такое Apify
  • Почему использование Scraping Browser с Apify – это беспроигрышный вариант
  • Как интегрировать браузер для скрапинга Bright Data в скрипт Apify Python
  • Как использовать прокси-серверы Bright Data на Apify

Давайте погрузимся!

Что такое Apify?

Apify – это полнофункциональная платформа для веб-скрапинга и извлечения данных. Она позволяет создавать и запускать в облаке пользовательские инструменты для веб-скрепинга, известные как Actors. Эти Actors автоматизируют задачи, связанные со сбором, обработкой и автоматизацией данных.

На Apify вы можете монетизировать свои скрипты скраппинга, сделав их общедоступными для других пользователей. Независимо от того, планируете ли вы использовать свой Actor в частном порядке или сделать его общедоступным, решения Bright Data для скраппинга помогут сделать ваш скраппер более надежным и эффективным.

Зачем использовать браузер для скрапинга Bright Data на Apify

Чтобы оценить преимущества браузера для скрапинга Bright Data, необходимо понять, что это за инструмент и что он предлагает.

Самым большим ограничением инструментов автоматизации браузеров являются не их API, а браузеры, которыми они управляют. Scraping Browser – это веб-браузер нового поколения, специально разработанный для веб-скрапинга. В частности, он обладает следующими ключевыми особенностями:

  • Надежные отпечатки пальцев TLS для предотвращения обнаружения
  • Неограниченная масштабируемость для извлечения больших объемов данных
  • Встроенная ротация IP-адресов с помощью 150-миллионной сети IP-прокси.
  • Автоматические повторы для обработки неудачных запросов
  • Возможности решения проблемы CAPTCHA

Scraping Browser совместим со всеми основными фреймворками для автоматизации браузеров, включая Playwright, Puppeteer и Selenium. Таким образом, вам не нужно изучать новый API или устанавливать сторонние зависимости. Вы можете просто интегрировать его непосредственно в существующий скрипт автоматизации браузера.

Теперь использование Scraping Browser вместе с Apify дает еще больше преимуществ, которые заключаются в следующем:

  • Сокращение расходов на облачные вычисления: Браузеры потребляют значительное количество ресурсов, что приводит к повышению нагрузки на процессор и оперативную память. Scraping Browser, размещенный в облаке с гарантированной неограниченной масштабируемостью, позволяет сократить расходы на облако во время работы актера на Apify. Поскольку Apify взимает плату за использование сервера, даже с учетом платы за Scraping Browser такая настройка может привести к экономии средств.
  • Универсальный инструмент для обхода ботов: Scraping Browser справляется с IP-запретами, CAPTCHA, отпечатками пальцев браузера и другими барьерами, препятствующими скрапингу. Это делает ваш процесс скрапинга более эффективным и менее подверженным сбоям.
  • Встроенная интеграция с прокси-серверами: Scraping Browser включает в себя управление прокси-серверами, поэтому вам больше не нужно беспокоиться о поддержке и ручной ротации прокси-серверов.
  • Преимущества Apify: Использование Scraping Browser на облачном акторе Apify (вместо общего скрипта) дает дополнительные преимущества, такие как
    :Polylang placeholder не изменяется

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

Как интегрировать браузер для скрапинга Bright Data в Apify: Пошаговое руководство

Целевым сайтом в этом разделе будет Amazon – платформа, богатая информацией, но печально известная своими строгими антиботскими мерами. Без соответствующих инструментов вы, скорее всего, столкнетесь с печально известной капчей Amazon CAPTCHA, блокирующей ваши попытки скраппинга:

Amazon CAPTCHA блокирует ваш скрипт

В этом разделе мы создадим актор скрапинга, который использует браузер скрапинга Bright Data для извлечения данных с общей страницы поиска товаров Amazon:

Целевая страница поиска товаров Amazon

Примечание: Актор будет написан на Python, но помните, что Apify также поддерживает JavaScript.

Следуйте приведенным ниже инструкциям, чтобы узнать, как интегрировать инструменты для сбора информации Bright Data с Apify!

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

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

Шаг №1: Настройка проекта

Самый простой способ создать новый проект Apify Actor – это использовать Apify CLI. Сначала установите его глобально через Node.js с помощью следующей команды:

npm install -g apify-cli

Затем создайте новый проект Apify, выполнив команду:

npx apify-cli create

Вам будет предложено ответить на несколько вопросов. Ответьте на них следующим образом:

✔ Name of your new Actor: amazon-scraper
✔ Choose the programming language of your new Actor: Python
✔ Choose a template for your new Actor. Detailed information about the template will be shown in the next step.
Playwright + Chrome

Таким образом, Apify CLI создаст новый Python Actor в папке amazon-scraper, используя шаблон “Playwright + Chrome”. Если вы не знакомы с этими инструментами, прочитайте наше руководство по веб-скрейпингу с помощью Playwright.

Примечание: Шаблон Selenium или Puppeteer также подойдет, так как Bright Data’s Scraping Browser интегрируется с любым инструментом автоматизации браузера.

Ваш проект Apify Actor будет иметь следующую структуру:

amazon-scraper
│── .dockerignore
│── .gitignore
│── README.md
│── requirements.txt
│
├── .venv/
│   └── ...
│
├── .actor/
│   │── actor.json
│   │── Dockerfile
│   └── input_schema.json
│
├── src/
│   │── main.py
│   │── __init__.py
│   │── __main__.py
│   └── py.typed
│
└── storage/
    └── ...

Загрузите папку amazon-scraper в предпочитаемую вами среду разработки Python, например Visual Studio Code с расширением Python или PyCharm Community Edition.

Помните, что для локального запуска Actor необходимо установить браузеры Playwright. Для этого сначала активируйте папку виртуального окружения (.venv) в каталоге проекта. В Windows выполните команду:

.venv/Scripts/activate

Аналогично, в Linux/macOS запустите:

source .venv/bin/activate

Затем установите необходимые зависимости Playwright, выполнив команду:

playwright install --with-deps

Замечательно! Теперь вы можете запускать Actor локально с помощью:

apify run

Теперь ваш проект Apify полностью настроен и готов к интеграции с браузером для скрапинга Bright Data!

Шаг № 2: Подключение к целевой странице

Если вы посмотрите на URL-адрес страницы результатов поиска Amazon, то заметите, что он имеет такой формат:

https://www.amazon.com/search/s?k=<keyword>

Например:

Обратите внимание на URL-адрес целевой страницы

Целевой URL-адрес вашего скрипта должен использовать этот формат, где может быть динамически задан с помощью входного аргумента Apify. Входные параметры, которые принимает Actor, определяются в файле input_schema.json, расположенном в директории .actor.

Определение аргумента keyword делает скрипт настраиваемым, позволяя пользователям указывать предпочитаемый ими поисковый термин. Чтобы определить этот параметр, замените содержимое файла input_schema.json на следующее:

{
    "title": "Amazon Scraper",
    "type": "object",
    "schemaVersion": 1,
    "properties": {
        "keyword": {
            "title": "Search keyword",
            "type": "string",
            "description": "The keyword used to search products on Amazon",
            "editor": "textfield"
        }
    },
    "required": ["keyword"]
}

Эта конфигурация определяет необходимый параметр ключевого слова типа string.

Чтобы задать аргумент ключевого слова при локальном запуске Actor, измените файл INPUT.json внутри storage/key_value_stores/default следующим образом:

{
    "keyword": "laptop"
}

Таким образом, Actor прочитает аргумент ввода ключевого слова, используя "laptop" в качестве поискового запроса.

После развертывания Actor на платформе Apify вы увидите поле ввода, в котором можно настроить этот параметр перед запуском Actor:

Поле текста настроенного ключевого слова в консоли Apify Console

Помните, что начальным файлом Apify Actor является main.py, расположенный в папке src. Откройте этот файл и измените его на:

  1. Считывание параметра ключевого слова из входных аргументов
  2. Создайте целевой URL-адрес для страницы поиска Amazon
  3. Используйте Playwright для перехода на эту страницу

К концу этого шага ваш файл main.py должен содержать приведенную ниже логику Python:

from apify import Actor
from playwright.async_api import async_playwright


async def main() -> None:
    # Enter the context of the Actor
    async with Actor:
        # Retrieve the Actor input, and use default values if not provided
        actor_input = await Actor.get_input() or {}
        # Reading the "keyword" argument from the input data, assigning it the
        # value "laptop" as a default value
        keyword = actor_input.get("keyword")

        # Building the target url
        target_url = f"https://www.amazon.com/search/s?k={keyword}"

        # Launch Playwright and open a new browser context
        async with async_playwright() as playwright:
            # Configure the browser to launch in headless mode as per Actor configuration
            browser = await playwright.chromium.launch(
                headless=Actor.config.headless,
                args=["--disable-gpu"],
            )
            context = await browser.new_context()

            try:
                # Open a new page in the browser context and navigate to the URL
                page = await context.new_page()
                await page.goto(target_url)

                # Scraping logic...

            except Exception:
                Actor.log.exception(f"Cannot extract data from {target_url}")

            finally:
                await page.close()

Приведенный выше код:

  1. Инициализирует Apify Actor для управления жизненным циклом сценария
  2. Получает входные аргументы с помощью Actor.get_input().
  3. Извлекает аргумент ключевого слова из входных данных
  4. Создает целевой URL-адрес с помощью f-строки Python.
  5. Запускаем Playwright и запускаем безголовый браузер Chromium с отключенным GPU
  6. Создает новый контекст браузера, открывает страницу и переходит к целевому URL с помощью page.goto().
  7. Все ошибки записываются в журнал с помощью Actor.log.exception().
  8. Обеспечивает закрытие страницы Playwright после выполнения

Отлично! Ваш Apify Actor готов к использованию браузера Bright Data Scraping Browser для эффективного веб-скрепинга.

Шаг № 3: Интеграция браузера для скрапинга Bright Data

Теперь с помощью API Playwright сделайте снимок экрана после подключения к целевой странице:

await page.screenshot(path="screenshot.png")

Запустите Actor локально, и он создаст файл screenshot.png в папке проекта. Откройте его, и вы, скорее всего, увидите что-то вроде этого:

Amazon CAPTCHA блокирует ваш скрипт

Аналогичным образом вы можете получить следующую страницу ошибки Amazon:

Страница ошибки Amazon

Как видите, ваш веб-бот был заблокирован антиботами Amazon. Это лишь одна из многих проблем, с которыми вы можете столкнуться при работе с Amazon или другими популярными сайтами.

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

Для начала, если вы еще не сделали этого, создайте учетную запись Bright Data. Затем войдите в платформу. В разделе “Приборная панель пользователя” нажмите кнопку “Получить прокси-продукты”:

Нажатие кнопки "Получить прокси-продукты"

В таблице “Мои зоны” на странице “Прокси и инфраструктура скрапинга” выберите строку “scraping_browser”:

Выбор продукта Scraping Browser

Включите устройство, переключив переключатель вкл/выкл:

Включение браузера для скрапинга

Теперь на вкладке “Конфигурация” убедитесь, что опции “Премиум-домены” и “CAPTCHA Solver” включены для максимальной эффективности:

Включение опций "Премиум-домены" и "Решатель CAPTCHA"

На вкладке “Обзор” скопируйте строку подключения Playwright Scraping Browser:

Копирование строки подключения Puppeteer / Playwright Scraping Browser в буфер обмена

Добавьте строку соединения в файл main.py в качестве константы:

SBR_WS_CDP = "<YOUR_PLAYWRIGHT_SCRAPING_BROWSER_CONNECTION_STRING>"

Замените строкой подключения, которую вы скопировали ранее.

Примечание: Если вы планируете сделать свой Актор публичным на Apify, вам следует определить SBR_WS_CDP в качестве входного аргумента Apify Actor. Таким образом, пользователи, использующие ваш Актор, смогут интегрировать свои собственные строки подключения к Scraping Browser.

Теперь обновите определение браузера в файле main.py, чтобы использовать Scraping Browser с Playwright:

browser = await playwright.chromium.connect_over_cdp(SBR_WS_CDP, timeout=120000)

Обратите внимание, что таймаут соединения должен быть установлен на большее значение, чем обычно, так как ротация IP-адресов через прокси-серверы и решение CAPTCHA может занять некоторое время.

Готово! Вы успешно интегрировали Scraping Browser в Playwright в рамках Apify Actor.

Шаг № 4: Подготовьте все объявления о продаже товаров

Чтобы извлечь списки товаров с Amazon, сначала нужно проинспектировать страницу, чтобы понять ее HTML-структуру. Для этого щелкните правой кнопкой мыши на одном из элементов продукта на странице и выберите опцию “Inspect”. Появится следующий раздел DevTools:

Проверка элемента списка продуктов

Здесь видно, что каждый элемент списка товаров может быть выбран с помощью этого CSS-селектора:

[data-component-type=\"s-search-result\"]

Нацеливание на атрибуты пользовательских данных-* идеально, поскольку эти атрибуты обычно используются для тестирования или мониторинга. Таким образом, они, как правило, остаются неизменными с течением времени.

Теперь используйте локатор Playwright, чтобы получить все элементы продукта на странице:

product_elements = page.locator("[data-component-type=\"s-search-result\"]")

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

for product_element in await product_elements.all():
    # Data extraction logic...

Потрясающе! Пора реализовать логику извлечения данных Amazon.

Шаг #5: Реализация логики скрапинга

Сначала проверьте отдельный элемент списка товаров:

Элемент изображения продукта

В этом разделе вы можете получить изображение продукта из атрибута src элемента .s-image:

image_element = product_element.locator(".s-image").nth(0)
image = await image_element.get_attribute("src")

Обратите внимание, что nth(0) требуется для получения первого HTML-элемента, соответствующего локатору.

Затем изучите название продукта:

Элемент названия продукта

Вы можете получить URL-адрес и название продукта из и

внутри элемента [data-cy="title-recipe"] соответственно:

title_header_element = product_element.locator("[data-cy=\"title-recipe\"]").nth(0)

link_element = title_header_element.locator("a").nth(0)
url = None if url_text == "javascript:void(0)" else "https://amazon.com" + url_text

title_element = title_header_element.locator("h2").nth(0)
title = await title_element.get_attribute("aria-label")

Обратите внимание на логику, используемую для игнорирования “javascript:void(0)” URL-адреса (которые появляются на специальных рекламных продуктах) и обработку для преобразования URL-адресов продуктов в абсолютные.

Затем загляните в раздел отзывов:

Элемент обзора продукции

Из [data-cy="reviews-block"] можно получить рейтинг рецензии из aria-label элемента элемента:

rating_element =  product_element.locator("[data-cy=\"reviews-block\"] a").nth(0)
rating_text = await rating_element.get_attribute("aria-label")
rating_match = re.search(r"(\d+(\.\d+)?) out of 5 stars", rating_text)
if rating_match:
    rating = rating_match.group(1)
else:
    rating = None

Поскольку текст рейтинга в aria-label имеет формат “X из 5 звезд”, вы можете извлечь значение рейтинга X с помощью простого regex. Смотрите, как использовать regex для веб-скрапинга.

Не забудьте импортировать re из стандартной библиотеки Python:

import re

Теперь проверьте элемент подсчета отзывов:

Элемент подсчета рецензий

Извлеките количество отзывов из элемента элемента [data-component-type="s-client-side-analytics"]:

review_count_element = product_element.locator("[data-component-type=\"s-client-side-analytics\"] a").nth(0)
review_count_text = await review_count_element.text_content()
review_count = int(review_count_text.replace(",", ""))

Обратите внимание на простую логику преобразования строки типа “2 539” в числовое значение в Python.

Наконец, проверьте узел цены продукта:

Элемент цены продукта

Соберите цену продукта из элемента .a-offscreen внутри [data-cy="price-recipe"]:

price_element_locator = product_element.locator("[data-cy=\"price-recipe\"] .a-offscreen")
# If the price element is on the product element
if await price_element_locator.count() > 0:
    price = await price_element_locator.nth(0).text_content()
else:
    price = None

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

Чтобы сценарий заработал, обновите импорт Playwright:

from playwright.async_api import async_playwright, TimeoutError

Прекрасно! Логика соскабливания данных о товарах Amazon завершена.

Обратите внимание, что целью этой статьи не является глубокое изучение логики работы с данными Amazon. Для получения более подробной информации следуйте нашему руководству по поиску данных о товарах Amazon на Python.

Шаг № 6: Сбор данных, полученных в результате сканирования

В качестве последней инструкции цикла for заполните объект продукта полученными данными:

product = {
    "image": image,
    "url": url,
    "title": title,
    "rating": rating,
    "review_count": review_count,
    "price": price
}

Затем поместите его в набор данных Apify:

await Actor.push_data(product)

push_data() гарантирует, что собранные данные будут зарегистрированы в Apify, что позволит вам получить к ним доступ через API или экспортировать их в один из множества поддерживаемых форматов (например, CSV, JSON, Excel, JSONL и т. д.).

Шаг №7: Соберите все вместе

Вот что должен содержать ваш финальный файл Apify + Bright Data Actor main.py:

from apify import Actor
from playwright.async_api import async_playwright, TimeoutError
import re

async def main() -> None:
    # Enter the context of the Actor
    async with Actor:
        # Retrieve the Actor input, and use default values if not provided
        actor_input = await Actor.get_input() or {}
        # Reading the "keyword" argument from the input data, assigning it the
        # value "laptop" as a default value
        keyword = actor_input.get("keyword")

        # Building the target url
        target_url = f"https://www.amazon.com/search/s?k={keyword}"

        # Launch Playwright and open a new browser context
        async with async_playwright() as playwright:
            # Your Bright Data Scraping API connection string
            SBR_WS_CDP = "wss://brd-customer-hl_4bcb8ada-zone-scraping_browser:[email protected]:9222"

            # Configure Playwright to connect to Scraping Browser and open a new context
            browser = await playwright.chromium.connect_over_cdp(SBR_WS_CDP, timeout=120000)
            context = await browser.new_context()

            try:
                # Open a new page in the browser context and navigate to the URL
                page = await context.new_page()
                await page.goto(target_url)

                # Use a locator to select all product elements
                product_elements = page.locator("[data-component-type=\"s-search-result\"]")

                # Iterate over all product elements and scrape data from them
                for product_element in await product_elements.all():
                    # Product scraping logic
                    image_element = product_element.locator(".s-image").nth(0)
                    image = await image_element.get_attribute("src")

                    title_header_element = product_element.locator("[data-cy=\"title-recipe\"]").nth(0)

                    link_element = title_header_element.locator("a").nth(0)
                    url_text = await link_element.get_attribute("href")
                    url = None if url_text == "javascript:void(0)" else "https://amazon.com" + url_text

                    title_element = title_header_element.locator("h2").nth(0)
                    title = await title_element.get_attribute("aria-label")

                    rating_element =  product_element.locator("[data-cy=\"reviews-block\"] a").nth(0)
                    rating_text = await rating_element.get_attribute("aria-label")
                    rating_match = re.search(r"(\d+(\.\d+)?) out of 5 stars", rating_text)
                    if rating_match:
                        rating = rating_match.group(1)
                    else:
                        rating = None

                    review_count_element = product_element.locator("[data-component-type=\"s-client-side-analytics\"] a").nth(0)
                    review_count_text = await review_count_element.text_content()
                    review_count = int(review_count_text.replace(",", ""))

                    price_element_locator = product_element.locator("[data-cy=\"price-recipe\"] .a-offscreen")
                    # If the price element is on the product element
                    if await price_element_locator.count() > 0:
                        price = await price_element_locator.nth(0).text_content()
                    else:
                        price = None

                    # Populate a new dictionary with the scraped data
                    product = {
                        "image": image,
                        "url": url,
                        "title": title,
                        "rating": rating,
                        "review_count": review_count,
                        "price": price
                    }
                    # Add it to the Actor dataset
                    await Actor.push_data(product)
            except Exception:
                Actor.log.exception(f"Cannot extract data from {target_url}")

            finally:
                await page.close()

Как видите, интеграция браузера для скрапинга Bright Data с шаблоном Apify “Playwright + Chrome” проста и требует всего нескольких строк кода.

Шаг #8: Развертывание на Apify и запуск исполнителя

Чтобы развернуть локальный Actor в Apify, выполните следующую команду в папке проекта:

apify push

Если вы еще не вошли в систему, вам будет предложено пройти аутентификацию через Apify CLI.

После завершения развертывания вам будет задан следующий вопрос:

✔ Do you want to open the Actor detail in your browser?

Ответьте “Y” или “yes”, чтобы перенаправить вас на страницу Actor в консоли Apify Console:

Страница Apify вашего актера

При желании вы можете вручную перейти на эту же страницу:

  1. Вход в Apify в браузере
  2. Переход к консоли
  3. Посещение страницы “Актер”

Нажмите кнопку “Start Actor”, чтобы запустить Amazon Scraper Actor. Как и ожидалось, вам будет предложено ввести ключевое слово. Попробуйте ввести что-то вроде “игровое кресло”:

Заполнение элемента ввода текстового поля с ключевым словом

После этого нажмите кнопку “Сохранить и начать”, чтобы запустить программу Actor и вычистить объявления о продаже “игровых кресел” с Amazon.

По окончании работы вы увидите полученные данные в разделе Output:

Полученные данные в табличном формате

Чтобы экспортировать данные, перейдите на вкладку “Хранилище”, выберите опцию “CSV” и нажмите кнопку “Загрузить”:

Нажатие кнопки "Загрузить"

Загруженный файл CSV будет содержать следующие данные:

Полученные данные в формате CSV

И вуаля! Браузер для скрапинга Bright Data + интеграция с Apify работают как одно целое. Больше никаких CAPTCHA или блоков при работе с Amazon или любым другим сайтом.

[Дополнительно] Интеграция Bright Data Proxy в Apify

Использование таких продуктов для скрапинга, как Scraping Browser или Web Unlocker, непосредственно в Apify очень удобно и просто.

В то же время, предположим, что у вас уже есть актор на Apify и вам просто нужно усовершенствовать его с помощью прокси (например, чтобы избежать запрета IP-адресов). Помните, что вы можете интегрировать прокси Bright Data непосредственно в ваш Apify Actor, как описано в нашей документации или руководстве по интеграции.

Заключение

В этом уроке вы узнали, как создать Apify Actor, который интегрируется со Scraping Browser в Playwright для программного сбора данных с Amazon. Мы начали с нуля, выполнив все шаги по созданию локального скрипта для сбора данных и его развертыванию в Apify.

Теперь вы понимаете преимущества использования профессионального инструмента для скраппинга, такого как Scraping Browser, для облачного скраппинга в Apify. Следуя тем же или аналогичным процедурам, Apify поддерживает все другие продукты Bright Data:

  • Услуги прокси: 4 различных типа прокси-серверов для обхода ограничений по местоположению, включая 150 миллионов IP-адресов жителей.
  • API для веб-скреперов: Специальные конечные точки для извлечения свежих структурированных веб-данных из более чем 100 популярных доменов.
  • SERP API: API для обработки всех текущих операций по разблокировке SERP и извлечению одной страницы

Зарегистрируйтесь на сайте Bright Data и протестируйте наши совместимые прокси-сервисы и продукты для скраппинга бесплатно!

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