В этой статье вы узнаете:
- Что такое скребок 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!
Шаг №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
в папке проекта, который теперь должен содержать такую структуру файлов:
Сейчас scraper.py
– это пустой Python-скрипт, но вскоре он будет содержать необходимую логику скрапинга.
В терминале IDE активируйте виртуальную среду. В Linux или macOS запустите эту команду:
./env/bin/activate
Аналогично, в Windows выполните команду:
env/Scripts/activate
Потрясающе, теперь у вас есть среда Python для веб-скраппинга!
Шаг № 2: Выбор библиотеки для скрапинга
Прежде чем приступать к кодированию, необходимо определить лучшие инструменты для извлечения нужных данных. Для этого сначала нужно провести предварительное тестирование, чтобы проанализировать, как ведет себя целевой сайт:
- Откройте целевую страницу в режиме инкогнито, чтобы заранее сохраненные файлы cookie и предпочтения не повлияли на анализ.
- Щелкните правой кнопкой мыши в любом месте страницы и выберите “Inspect”, чтобы открыть инструменты разработчика браузера.
- Перейдите на вкладку “Сеть”.
- Перезагрузите страницу и взаимодействуйте с ней – например, нажмите на кнопки “1h” и “6h”.
- Следите за активностью на вкладке “Fetch/XHR”.
Это даст вам представление о том, насколько динамично загружается и отображается веб-страница:
В этом разделе вы можете увидеть все 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, как и ожидалось. Отличная работа!
Шаг №5: Взаимодействие с веб-страницей
По умолчанию на странице “Игры” отображаются коллекции NFT “Trending”:
Помните, что вас интересует коллекция NFT “Top”. Другими словами, вы хотите указать своему скребку OpenSea нажать кнопку “Top”, как показано ниже:
В качестве первого шага проверьте кнопку “Вверх”, щелкнув на ней правой кнопкой мыши и выбрав опцию “Осмотреть”:
Обратите внимание, что вы можете выбрать его с помощью 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:
Обратите внимание, что вы можете выбрать все элементы коллекции 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 довольно сложна, но вы можете извлечь из нее следующие детали:
- Изображение коллекции из
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
:
Вот как структурированы данные:
- Первый столбец
.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:
Поздравляем! Вы только что прошли OpenSea, как и планировали.
Простая разблокировка данных OpenSea
OpenSea предлагает гораздо больше, чем просто рейтинги коллекций NFT. Он также предоставляет подробные страницы для каждой коллекции NFT и отдельных предметов в ней. Поскольку цены на NFT часто меняются, ваш скрипт для скрапинга должен запускаться автоматически и часто получать свежие данные. Однако большинство страниц OpenSea защищены строгими мерами защиты от скрапинга, что затрудняет поиск данных.
Как мы уже заметили, использование безголовых браузеров – не вариант, а значит, вы будете тратить ресурсы на то, чтобы держать экземпляр браузера открытым. Кроме того, при попытке взаимодействия с другими элементами на странице вы можете столкнуться с проблемами:
Например, загрузка данных может застопориться, а AJAX-запросы в браузере могут быть заблокированы, что приведет к ошибке 403 Forbidden
:
Это происходит благодаря усовершенствованным мерам защиты от ботов, которые OpenSea применяет для блокировки ботов-скрепперов.
Эти проблемы делают работу с OpenSea без соответствующих инструментов очень неприятной. Решение? Используйте специальный скрепер OpenSea от Bright Data, который позволит вам получать данные с сайта с помощью простых вызовов API или без кода без риска быть заблокированным!
Заключение
В этом пошаговом руководстве вы узнали, что такое скрепер OpenSea и какие типы данных он может собирать. Вы также создали скрипт на Python для сбора данных OpenSea NFT, и все это менее чем за 100 строк кода.
Проблема заключается в строгих антиботских мерах OpenSea, которые блокируют автоматическое взаимодействие с браузером. Обойти эти проблемы поможет наш OpenSea Scraper– инструмент, который вы можете легко интегрировать с API или no-code для получения публичных данных NFT, включая название, описание, ID токена, текущую цену, цену последней продажи, историю, предложения и многое другое.
Создайте бесплатную учетную запись Bright Data сегодня и начните использовать наши скреперные API!