Как скреативить OpenSea с помощью Python в 2025 году

Узнайте, как создать скребок OpenSea на базе Python для автоматического извлечения важных данных NFT.
5 мин. чтения
How to Scrape Opensea blog image

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

  • Что такое скребок OpenSea
  • Типы данных, которые вы можете автоматически извлекать из OpenSea
  • Как создать скрипт для скраппинга OpenSea с помощью Python
  • Когда и почему может потребоваться более продвинутое решение

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

Что такое скребок OpenSea?

Скрепер OpenSea – это инструмент, предназначенный для сбора данных с OpenSea, крупнейшего в мире рынка NFT. Основная цель этого инструмента – автоматизировать сбор различной информации, связанной с NFT. Как правило, он использует автоматизированные браузерные решения для получения данных OpenSea в режиме реального времени без необходимости прилагать ручные усилия.

Данные для соскоба с OpenSea

Вот некоторые ключевые данные, которые вы можете получить из OpenSea:

  • Название коллекции NFT: название или наименование коллекции NFT.
  • Ранг коллекции: Ранг или позиция коллекции, основанная на ее производительности.
  • Изображение НМТ: Изображение, связанное с коллекцией или предметом НМТ.
  • Минимальная цена: Минимальная цена, указанная для предмета в коллекции.
  • Объем: Общий торговый объем коллекции NFT.
  • Процентное изменение: Изменение цены или процентное изменение показателей коллекции за определенный период.
  • Token ID: уникальный идентификатор для каждого NFT в коллекции.
  • Последняя цена продажи: Последняя цена продажи NFT в коллекции.
  • История продаж: История сделок для каждого товара NFT, включая предыдущие цены и покупателей.
  • Предложения: Активные предложения, сделанные для NFT в коллекции.
  • Информация о создателе: Сведения о создателе NFT, например, его имя пользователя или профиль.
  • Черты/атрибуты: Специфические черты или свойства предметов NFT (например, редкость, цвет и т.д.).
  • Описание предмета: Краткое описание или информация о предмете NFT.

Как скреативить OpenSea: Пошаговое руководство

В этом разделе вы узнаете, как создать скрепер OpenSea. Цель – разработать скрипт на Python, который будет автоматически собирать данные о коллекциях NFT из раздела “Top” на странице “Gaming”:

Целевая страница OpenSea "Игры"

Выполните следующие шаги и узнайте, как соскрести OpenSea!

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

Прежде чем приступить к работе, убедитесь, что на вашем компьютере установлен Python 3. В противном случае загрузите его и следуйте инструкциям по установке.

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

mkdir opensea-scraper

Каталог opensea-scraper представляет собой папку проекта вашего скрепера Python OpenSea.

Перейдите к нему в терминале и инициализируйте виртуальную среду внутри него:

cd opensea-scraper
python -m venv venv

Загрузите папку с проектом в вашу любимую Python IDE. Подойдет Visual Studio Code с расширением Python или PyCharm Community Edition.

Создайте файл scraper.py в папке проекта, который теперь должен содержать такую структуру файлов:

Проект OpenSea Scraper

Сейчас scraper.py – это пустой Python-скрипт, но вскоре он будет содержать необходимую логику скрапинга.

В терминале IDE активируйте виртуальную среду. В Linux или macOS запустите эту команду:

./env/bin/activate

Аналогично, в Windows выполните команду:

env/Scripts/activate

Потрясающе, теперь у вас есть среда Python для веб-скраппинга!

Шаг № 2: Выбор библиотеки для скрапинга

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

  1. Откройте целевую страницу в режиме инкогнито, чтобы заранее сохраненные файлы cookie и предпочтения не повлияли на анализ.
  2. Щелкните правой кнопкой мыши в любом месте страницы и выберите “Inspect”, чтобы открыть инструменты разработчика браузера.
  3. Перейдите на вкладку “Сеть”.
  4. Перезагрузите страницу и взаимодействуйте с ней – например, нажмите на кнопки “1h” и “6h”.
  5. Следите за активностью на вкладке “Fetch/XHR”.

Это даст вам представление о том, насколько динамично загружается и отображается веб-страница:

Обратите внимание на динамический запрос GraphQL

В этом разделе вы можете увидеть все AJAX-запросы, которые выполняет страница в режиме реального времени. Проанализировав эти запросы, вы заметите, что OpenSea динамически получает данные с сервера. Кроме того, дальнейший анализ показывает, что некоторые взаимодействия с кнопками вызывают рендеринг JavaScript для динамического обновления содержимого страницы.

Это говорит о том, что для создания скрапа OpenSea требуется инструмент автоматизации браузера, например Selenium!

Selenium позволяет программно управлять веб-браузером, имитируя реальное взаимодействие с пользователем для эффективного извлечения данных. Итак, давайте установим его и приступим к работе.

Шаг № 3: Установка и настройка Selenium

Вы можете получить Selenium с помощью пакета selenium pip. В активированной виртуальной среде выполните приведенную ниже команду для установки Selenium:

pip install -U selenium

О том, как использовать инструмент автоматизации браузера, читайте в нашем руководстве по веб-скрептингу с помощью Selenium.

Импортируйте Selenium в scraper.py и инициализируйте объект WebDriver для управления Chrome:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service

# Create a Chrome web driver instance
driver = webdriver.Chrome(service=Service())

В приведенном выше фрагменте создается экземпляр WebDriver для взаимодействия с Chrome. Помните, что OpenSea использует меры по борьбе со скрапингом, которые обнаруживают безголовые браузеры и блокируют их. В частности, сервер возвращает страницу “Доступ запрещен”.

Это означает, что вы не можете использовать флаг --headless для этого скрепера. В качестве альтернативного подхода рассмотрите Playwright Stealth или SeleniumBase.

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

driver.maximize_window() 

Наконец, всегда убедитесь, что вы правильно закрыли WebDriver, чтобы освободить ресурсы:

driver.quit()

Замечательно! Теперь вы полностью настроены, чтобы начать скраппинг OpenSea.

Шаг № 4: Посетите целевую страницу

Используйте метод get() из Selenium WebDriver, чтобы сообщить браузеру о переходе на нужную страницу:

driver.get("https://opensea.io/category/gaming")

Теперь ваш файл scraper.py должен содержать следующие строки:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service

# Create a Chrome web driver instance
driver = webdriver.Chrome(service=Service())

# To avoid the responsive rendering
driver.maximize_window()

# Visit the target page
driver.get("https://opensea.io/category/gaming")

# Scraping logic...

# close the browser and release its resources
driver.quit()

Установите точку останова отладки на последней строке скрипта и запустите его. Вот что вы должны увидеть:

Окно Chrome из Selenium

Сообщение “Chrome управляется программой автоматизированного тестирования.” подтверждает, что Selenium управляет Chrome, как и ожидалось. Отличная работа!

Шаг №5: Взаимодействие с веб-страницей

По умолчанию на странице “Игры” отображаются коллекции NFT “Trending”:

Обратите внимание, что по умолчанию используется список "Trending".

Помните, что вас интересует коллекция NFT “Top”. Другими словами, вы хотите указать своему скребку OpenSea нажать кнопку “Top”, как показано ниже:

Нажатие кнопки "Вверх"

В качестве первого шага проверьте кнопку “Вверх”, щелкнув на ней правой кнопкой мыши и выбрав опцию “Осмотреть”:

Раздел DevTools для кнопки "Вверх"

Обратите внимание, что вы можете выбрать его с помощью CSS-селектора [value="top"]. Используйте функцию find_element() из Selenium, чтобы применить этот CSS-селектор на странице. Затем, выбрав элемент, щелкните на нем с помощью функции click():

top_element = driver.find_element(By.CSS_SELECTOR, "[value="top"]")
top_element.click()

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

from selenium.webdriver.common.by import By

Отлично! Эти строки кода смоделируют нужное взаимодействие.

Шаг #6: Приготовьтесь к соскабливанию коллекций NFT

На целевой странице отображаются 10 лучших коллекций NFT для выбранной категории. Поскольку это список, инициализируйте пустой массив для хранения информации:

nft_collections = []

Далее просмотрите HTML-элемент записи коллекции NFT:

Раздел DevTools для элемента коллекции NFT

Обратите внимание, что вы можете выбрать все элементы коллекции NFT с помощью CSS-селектора a[data-id="Item"]. Поскольку некоторые имена классов в элементах генерируются случайным образом, избегайте их прямого указания. Вместо этого сосредоточьтесь на атрибутах data-*, поскольку они обычно используются для тестирования и остаются неизменными с течением времени.

Получите все элементы записей коллекции NFT с помощью функции find_elements():

item_elements = driver.find_elements(By.CSS_SELECTOR, "a[data-id="Item"]")

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

for item_element in item_elements:
    # Scraping logic...

Потрясающе! Вы готовы приступить к сбору данных из элементов OpenSea NFT.

Шаг #7: Соскребите элементы коллекции NFT

Осмотрите запись о сборе NFT:

HTML-код элемента коллекции NFT (часть 1)

Структура HTML довольно сложна, но вы можете извлечь из нее следующие детали:

  • Изображение коллекции из img[alt="Изображение коллекции"].
  • Ранг коллекции от [data-id="TextBody"]
  • Имя коллекции из [tabindex="-1"]

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

image_element = item_element.find_element(By.CSS_SELECTOR, "img[alt="Collection Image"]")
image = image_element.get_attribute("src")

rank_element = item_element.find_element(By.CSS_SELECTOR, "[data-id="TextBody"]")
rank = int(rank_element.text)

name_element = item_element.find_element(By.CSS_SELECTOR, "[tabindex="-1"]")
name = name_element.text

Свойство .text извлекает текстовое содержимое выбранного элемента. Поскольку значение rank в дальнейшем будет использоваться для сортировки собранных данных, оно преобразуется в целое число. Тем временем .get_attribute("src") извлекает значение атрибута src, извлекая URL-адрес изображения.

Затем сосредоточьтесь на столбцах .w-1/5:

HTML-код элемента коллекции NFT (часть 2)

Вот как структурированы данные:

  • Первый столбец .w-1/5 содержит минимальную цену.
  • Второй столбец .w-1/5 содержит объем и процентное изменение, каждое в отдельных элементах.

Извлеките эти значения с помощью следующей логики:

floor_price_element = item_element.find_element(By.CSS_SELECTOR, ".w-1\/5")
floor_price = floor_price_element.text

volume_column = item_element.find_elements(By.CSS_SELECTOR, ".w-1\/5")[1]

volume_element = volume_column.find_element(By.CSS_SELECTOR, "[tabindex="-1"]")
volume = volume_element.text

percentage_element = volume_column.find_element(By.CSS_SELECTOR, ".leading-sm")
percentage = percentage_element.text 

Обратите внимание, что вы не можете использовать .w-1/5 напрямую, но вам нужно экранировать / с помощью \.

Вот и все! Логика скрапинга OpenSea для получения коллекций NFT завершена.

Шаг № 8: Соберите собранные данные

В настоящее время у вас есть отсканированные данные, распределенные по нескольким переменным. Наполните новый объект nft_collection этими данными:

nft_collection = {
    "rank": rank,
    "image": image,
    "name": name,
    "floor_price": floor_price,
    "volume": volume,
    "percentage": percentage
}

Затем не забудьте добавить его в массив nft_collections:

nft_collections.append(nft_collection)

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

nft_collections.sort(key=lambda x: x["rank"])

Фантастика! Осталось только экспортировать эту информацию в человекочитаемый файл типа CSV.

Шаг № 9: Экспорт собранных данных в CSV

В Python встроена поддержка экспорта данных в такие форматы, как CSV. Добейтесь этого с помощью этих строк кода:

csv_filename = "nft_collections.csv"
with open(csv_filename, mode="w", newline="", encoding="utf-8") as file:
    writer = csv.DictWriter(file, fieldnames=nft_collections[0].keys())
    writer.writeheader()
    writer.writerows(nft_collections)

Этот сниппет экспортирует собранные данные из списка nft_collections в CSV-файл с именем nft_collections.csv. Он использует модуль Python csv для создания объекта writer, который записывает данные в структурированном формате. Каждая запись хранится в виде строки с заголовками столбцов, соответствующими ключам словаря в списке nft_collections.

Импортируйте csv из стандартной библиотеки Python с помощью:

imprort csv

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

Это финальный код вашего скребка OpenSea:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import csv

# Create a Chrome web driver instance
driver = webdriver.Chrome(service=Service())

# To avoid the responsive rendering
driver.maximize_window()

# Visit the target page
driver.get("https://opensea.io/category/gaming")

# Select the "Top" NFTs
top_element = driver.find_element(By.CSS_SELECTOR, "[value="top"]")
top_element.click()

# Where to store the scraped data
nft_collections = []

# Select all NFT collection HTML elements
item_elements = driver.find_elements(By.CSS_SELECTOR, "a[data-id="Item"]")
# Iterate over them and scrape data from them
for item_element in item_elements:
    # Scraping logic
    image_element = item_element.find_element(By.CSS_SELECTOR, "img[alt="Collection Image"]")
    image = image_element.get_attribute("src")

    rank_element = item_element.find_element(By.CSS_SELECTOR, "[data-id="TextBody"]")
    rank = int(rank_element.text)

    name_element = item_element.find_element(By.CSS_SELECTOR, "[tabindex="-1"]")
    name = name_element.text

    floor_price_element = item_element.find_element(By.CSS_SELECTOR, ".w-1\/5")
    floor_price = floor_price_element.text

    volume_column = item_element.find_elements(By.CSS_SELECTOR, ".w-1\/5")[1]

    volume_element = volume_column.find_element(By.CSS_SELECTOR, "[tabindex="-1"]")
    volume = volume_element.text

    percentage_element = volume_column.find_element(By.CSS_SELECTOR, ".leading-sm")
    percentage = percentage_element.text

    # Populate a new NFT collection object with the scraped data
    nft_collection = {
        "rank": rank,
        "image": image,
        "name": name,
        "floor_price": floor_price,
        "volume": volume,
        "percentage": percentage
    }
    # Add it to the list
    nft_collections.append(nft_collection)

# Sort the collections by rank in ascending order
nft_collections.sort(key=lambda x: x["rank"])

# Save to CSV
csv_filename = "nft_collections.csv"
with open(csv_filename, mode="w", newline="", encoding="utf-8") as file:
    writer = csv.DictWriter(file, fieldnames=nft_collections[0].keys())
    writer.writeheader()
    writer.writerows(nft_collections)

# close the browser and release its resources
driver.quit()

И вуаля! Менее чем за 100 строк кода вы можете создать простой скрипт Python OpenSea.

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

python scraper.py

Через некоторое время в папке проекта появится файл nft_collections.csv:

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

Поздравляем! Вы только что прошли OpenSea, как и планировали.

Простая разблокировка данных OpenSea

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

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

Контролируемая страница может загружаться вечно

Например, загрузка данных может застопориться, а AJAX-запросы в браузере могут быть заблокированы, что приведет к ошибке 403 Forbidden:

Запрос 403 заблокирован AJAX

Это происходит благодаря усовершенствованным мерам защиты от ботов, которые OpenSea применяет для блокировки ботов-скрепперов.

Эти проблемы делают работу с OpenSea без соответствующих инструментов очень неприятной. Решение? Используйте специальный скрепер OpenSea от Bright Data, который позволит вам получать данные с сайта с помощью простых вызовов API или без кода без риска быть заблокированным!

Заключение

В этом пошаговом руководстве вы узнали, что такое скрепер OpenSea и какие типы данных он может собирать. Вы также создали скрипт на Python для сбора данных OpenSea NFT, и все это менее чем за 100 строк кода.

Проблема заключается в строгих антиботских мерах OpenSea, которые блокируют автоматическое взаимодействие с браузером. Обойти эти проблемы поможет наш OpenSea Scraper– инструмент, который вы можете легко интегрировать с API или no-code для получения публичных данных NFT, включая название, описание, ID токена, текущую цену, цену последней продажи, историю, предложения и многое другое.

Создайте бесплатную учетную запись Bright Data сегодня и начните использовать наши скреперные API!