이 블로그 글에서 배울 내용:
- 오픈시 스크레이퍼란 무엇인가
- OpenSea에서 자동 추출 가능한 데이터 유형
- 파이썬을 사용한 OpenSea 스크래핑 스크립트 작성 방법
- 더 발전된 솔루션이 필요한 시점과 이유
자, 시작해 보겠습니다!
OpenSea 스크레이퍼란 무엇인가요?
OpenSea 스크레이퍼는 세계 최대 NFT 마켓플레이스인OpenSea의 데이터를 추출하기 위해 설계된 도구입니다. 이 도구의 주요 목적은 다양한 NFT 관련 정보 수집을 자동화하는 것입니다. 일반적으로 수동 작업 없이 실시간 OpenSea 데이터를 가져오기 위해 자동화된 브라우저 솔루션을 사용합니다.
OpenSea에서 스크래핑할 데이터
OpenSea에서 스크래핑할 수 있는 주요 데이터 포인트는 다음과 같습니다:
- NFT 컬렉션 이름: NFT 컬렉션의 제목 또는 이름.
- 컬렉션 순위: 컬렉션의 성과에 따른 순위 또는 위치.
- NFT 이미지: NFT 컬렉션 또는 아이템과 연관된 이미지.
- 바닥 가격: 컬렉션 내 아이템의 최저 등록 가격.
- 거래량: NFT 컬렉션의 총 거래량.
- 변동률: 지정된 기간 동안 컬렉션의 가격 변동 또는 백분율 변동률.
- 토큰 ID: 컬렉션 내 각 NFT의 고유 식별자.
- 최종 판매 가격: 컬렉션 내 NFT의 가장 최근 판매 가격.
- 판매 내역: 이전 가격 및 구매자를 포함한 각 NFT 항목의 거래 내역.
- 오퍼: 컬렉션 내 NFT에 대한 활성 오퍼.
- 제작자 정보: NFT 제작자에 대한 세부 정보(예: 사용자명 또는 프로필).
- 특성/속성: NFT 아이템의 특정 특성 또는 속성(예: 희귀도, 색상 등).
- 아이템 설명: NFT 아이템에 대한 간단한 설명 또는 정보.
OpenSea 스크래핑 방법: 단계별 가이드
이 가이드 섹션에서는 OpenSea 스크래퍼를 구축하는 방법을 배웁니다. 목표는“게임” 페이지의 “인기” 섹션에서 NFT 컬렉션 데이터를 자동으로 수집하는 Python 스크립트를 개발하는 것입니다:

아래 단계를 따라 OpenSea 스크래핑 방법을 확인하세요!
1단계: 프로젝트 설정
시작하기 전에 컴퓨터에 Python 3이 설치되어 있는지 확인하세요.설치되어있지 않다면다운로드하여설치 안내를 따르세요.
프로젝트 폴더를 생성하려면 아래 명령어를 사용하세요:
mkdir opensea-scraper
opensea-scraper 디렉터리는 Python OpenSea 스크레이퍼의 프로젝트 폴더를 나타냅니다.
터미널에서 해당 디렉터리로 이동한 후가상 환경을초기화하세요:
cd opensea-scraper
python -m venv venv
선호하는 Python IDE에서 프로젝트 폴더를 로드하세요.Python 확장 기능이 설치된 Visual Studio Code또는PyCharm Community Edition을사용하면 됩니다.
프로젝트 폴더 내에 scraper.py 파일을 생성합니다. 현재 폴더 구조는 다음과 같아야 합니다:

현재 scraper.py는 빈 Python 스크립트이지만 곧 원하는 스크래핑 로직이 포함될 것입니다.
IDE 터미널에서 가상 환경을 활성화합니다. Linux 또는 macOS에서는 다음 명령을 실행하세요:
./env/bin/activate
Windows에서는 다음과 같이 실행하세요:
env/Scripts/activate
대단합니다! 이제 웹 스크래핑을 위한 Python 환경이 준비되었습니다!
2단계: 스크래핑 라이브러리 선택
코딩을 시작하기 전에 필요한 데이터를 추출하기 위한최적의 스크래핑 도구를결정해야 합니다. 이를 위해 먼저 대상 사이트의 동작 방식을 분석하는 예비 테스트를 수행하세요:
- 분석에 영향을 미칠 수 있는 사전 저장된 쿠키 및 환경 설정을 방지하기 위해 대상 페이지를 시크릿 모드로 엽니다.
- 페이지 아무 곳이나 마우스 오른쪽 버튼으로 클릭하고 “검사”를 선택하여 브라우저의 개발자 도구를 엽니다.
- “네트워크” 탭으로 이동합니다.
- 페이지를 다시 로드하고 “1시간” 및 “6시간” 버튼 클릭 등 상호작용을 수행합니다.
- “Fetch/XHR” 탭에서 활동을 모니터링합니다.
이를 통해 웹페이지가 데이터를 동적으로 로드하고 렌더링하는지 파악할 수 있습니다:

이 섹션에서는 페이지가 실시간으로 수행하는 모든 AJAX 요청을 확인할 수 있습니다. 이러한 요청을 검사하면 OpenSea가 서버에서 데이터를 동적으로 가져오는 것을 알 수 있습니다. 또한 추가 분석을 통해 일부 버튼 상호작용이 JavaScript 렌더링을 트리거하여 페이지 콘텐츠를 동적으로 업데이트한다는 사실을 확인할 수 있습니다.
이는 OpenSea 스크래핑에Selenium과 같은 브라우저 자동화 도구가 필요함을 시사합니다!
Selenium을 사용하면 웹 브라우저를 프로그래밍 방식으로 제어하여 실제 사용자 상호작용을 모방함으로써 데이터를 효과적으로 추출할 수 있습니다. 이제 설치하고 시작해 보겠습니다.
3단계: Selenium 설치 및 설정
seleniumpip 패키지를 통해 Selenium을 얻을 수 있습니다. 활성화된 가상 환경에서 아래 명령어를 실행하여 Selenium을 설치하세요:
pip install -U selenium
브라우저 자동화 도구 사용 방법에 대한 안내는Selenium을 활용한 웹 스크래핑 가이드를 참고하세요.
scraper.py 에 Selenium을 임포트하고 Chrome을 제어할 WebDriver 객체를 초기화합니다:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
# Chrome 웹 드라이버 인스턴스 생성
driver = webdriver.Chrome(service=Service())
위 코드 조각은 Chrome과 상호작용할WebDriver인스턴스를 설정합니다. OpenSea는 헤드리스 브라우저를 탐지하여 차단하는 스크래핑 방지 조치를 사용한다는 점을 유의하세요. 구체적으로 서버는 “접근 거부” 페이지를 반환합니다.
이는 이 스크레이퍼에--headless플래그를 사용할 수 없음을 의미합니다. 대안으로Playwright Stealth또는SeleniumBase를 고려해 보세요.
OpenSea는 창 크기에 따라 레이아웃을 조정하므로, 데스크톱 버전이 렌더링되도록 브라우저 창을 최대화하세요:
driver.maximize_window()
마지막으로, 항상 WebDriver를 올바르게 종료하여 리소스를 해제하세요:
driver.quit()
훌륭합니다! 이제 OpenSea 스크래핑을 시작할 준비가 완전히 완료되었습니다.
4단계: 대상 페이지 방문
SeleniumWebDriver의get()메서드를 사용하여 브라우저가 원하는 페이지로 이동하도록 지시하세요:
driver.get("https://opensea.io/category/gaming")
이제 scraper.py 파일에 다음 내용이 포함되어야 합니다:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
# Chrome 웹 드라이버 인스턴스 생성
driver = webdriver.Chrome(service=Service())
# 반응형 렌더링 방지
driver.maximize_window()
# 대상 페이지 방문
driver.get("https://opensea.io/category/gaming")
# 스크래핑 로직...
# 브라우저 닫기 및 리소스 해제
driver.quit()
스크립트의 마지막 줄에 디버깅 중단점을 설정하고 실행하세요. 다음과 같은 메시지가 표시되어야 합니다:

“Chrome이 자동화 테스트 소프트웨어에 의해 제어되고 있습니다.”라는 메시지는 Selenium이 예상대로 Chrome을 제어하고 있음을 확인해 줍니다. 잘하셨습니다!
5단계: 웹페이지와 상호작용하기
기본적으로 “Gaming” 페이지에는 “Trending” NFT 컬렉션이 표시됩니다:

관심 대상은 “Top” NFT 컬렉션임을 기억하세요. 즉, OpenSea 스크레이퍼가 아래와 같이 “Top” 버튼을 클릭하도록 지시해야 합니다:

첫 단계로, “Top” 버튼을 마우스 오른쪽 버튼으로 클릭하고 “검사” 옵션을 선택하여 버튼을 검사하세요:

[value="top"]CSS 선택자를 사용해 해당 요소를 선택할 수 있습니다. Selenium의find_element()를사용해 페이지에 이 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 = []
다음으로 NFT 컬렉션 항목의 HTML 요소를 검사합니다:

모든 NFT 컬렉션 항목은a[data-id="Item"]CSS 선택기로 선택할 수 있습니다. 일부 요소 내 클래스명은 무작위로 생성된 것으로 보이므로 직접 타겟팅하지 마십시오. 대신data-*속성에 집중하세요. 이는 일반적으로 테스트용으로 사용되며 시간이 지나도 일관성을 유지합니다.
find_elements()를 사용하여 모든 NFT 컬렉션 항목 요소를 가져옵니다:
item_elements = driver.find_elements(By.CSS_SELECTOR, "a[data-id="Item"]")
다음으로, 각 요소를 순회하며 데이터를 추출할 준비를 합니다:
for item_element in item_elements:
# 스크래핑 로직...
훌륭합니다! 이제 OpenSea NFT 요소에서 데이터 스크래핑을 시작할 준비가 되었습니다.
7단계: NFT 컬렉션 요소 스크래핑
NFT 컬렉션 항목을 살펴보세요:

HTML 구조는 상당히 복잡하지만, 다음과 같은 세부 정보를 추출할 수 있습니다:
img[alt="Collection Image"]에서 컬렉션 이미지[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를 직접 사용할 수 없으며 /를 로 이스케이프 처리해야 합니다.
자, 이제 NFT 컬렉션을 가져오는 OpenSea 스크래핑 로직이 완성되었습니다.
단계 #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로 내보내기
파이썬은 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 리스트에서 스크랩한 데이터를 nft_collections.csv라는 CSV 파일로 내보냅니다. Python의 csv 모듈을 사용하여 구조화된 형식으로 데이터를 쓰는 라이터 객체를 생성합니다. 각 항목은 nft_collections 리스트의 사전 키에 해당하는 열 헤더와 함께 행으로 저장됩니다.
Python 표준 라이브러리에서csv를다음과 같이 임포트합니다:
imprort csv
10단계: 모든 것을 통합하기
다음은 OpenSea 스크레이퍼의 최종 코드입니다:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import csv
# Chrome 웹 드라이버 인스턴스 생성
driver = webdriver.Chrome(service=Service())
# 반응형 렌더링 방지
driver.maximize_window()
# 대상 페이지 방문
driver.get("https://opensea.io/category/gaming")
# "Top" NFT 선택
top_element = driver.find_element(By.CSS_SELECTOR, "[value="top"]")
top_element.click()
# 스크래핑된 데이터 저장 위치
nft_collections = []
# 모든 NFT 컬렉션 HTML 요소 선택
item_elements = driver.find_elements(By.CSS_SELECTOR, "a[data-id="Item"]")
# 반복 처리하여 데이터 스크래핑
for item_element in item_elements:
# 스크래핑 로직
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
# 수집된 데이터로 새로운 NFT 컬렉션 객체 생성
nft_collection = {
"rank": rank,
"image": image,
"name": name,
"floor_price": floor_price,
"volume": volume,
"percentage": percentage
}
# 리스트에 추가
nft_collections.append(nft_collection)
# 컬렉션을 순위(rank) 오름차순으로 정렬
nft_collections.sort(key=lambda x: x["rank"])
# 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)
# 브라우저를 닫고 리소스를 해제
driver.quit()
자, 이제 완성되었습니다! 100줄 미만의 코드로 간단한 Python OpenSea 스크래핑 스크립트를 만들 수 있습니다.
터미널에서 다음 명령어로 실행하세요:
python scraper.py
잠시 후 프로젝트 폴더에nft_collections.csv파일이 생성됩니다:

축하합니다! 계획대로 OpenSea를 스크래핑했습니다.
OpenSea 데이터 손쉽게 활용하기
OpenSea는 단순한 NFT 컬렉션 순위 이상의 정보를 제공합니다. 각 NFT 컬렉션과 그 안의 개별 아이템에 대한 상세 페이지도 제공하죠. NFT 가격은 자주 변동하기 때문에 최신 데이터를 수집하려면 스크래핑 스크립트를 자동으로 자주 실행해야 합니다. 하지만 대부분의 OpenSea 페이지는 강력한 스크래핑 방지 조치로 보호되어 데이터 수집이 어렵습니다.
앞서 살펴본 바와 같이 헤드리스 브라우저 사용은 선택지가 아닙니다. 즉, 브라우저 인스턴스를 계속 열어두는 데 자원을 낭비하게 됩니다. 또한 페이지의 다른 요소와 상호작용할 때 다음과 같은 문제가 발생할 수 있습니다:

예를 들어, 데이터 로딩이 멈출 수 있으며 브라우저의 AJAX 요청이 차단되어403 Forbidden오류가 발생할 수 있습니다:

이는 OpenSea가스크래핑 봇을 차단하기 위해 구현한 고급 안티봇 조치로 인해 발생합니다.
이러한 문제들로 인해 적절한 도구 없이 OpenSea를 스크래핑하는 것은 좌절스러운 경험이 됩니다. 해결책은? Bright Data의 전용 OpenSea 스크래퍼를 사용하세요. 간단한 API 호출이나 코드 없이도 사이트에서 데이터를 가져올 수 있으며 차단될 위험이 없습니다!
결론
이 단계별 튜토리얼에서는 OpenSea 스크레이퍼의 정의와 수집 가능한 데이터 유형을 학습했습니다. 또한 100줄 미만의 코드로 OpenSea NFT 데이터를 스크레이핑하는 Python 스크립트를 구축했습니다.
문제는 자동화된 브라우저 상호작용을 차단하는 OpenSea의 강력한 봇 방지 조치에 있습니다. API 또는 노코드로 쉽게 통합하여 이름, 설명, 토큰 ID, 현재 가격, 마지막 판매 가격, 이력, 오퍼 등 공개 NFT 데이터를 추출할 수 있는 저희OpenSea 스크레이퍼로 이러한 문제를 해결하세요.
지금 바로 Bright Data 무료 계정을 생성하고 스크레이퍼 API를 사용해 보세요!