如何在 2025 年使用 Python 爬取 OpenSea

了解如何创建基于 Python 的 OpenSea 爬虫,以自动化方式提取关键的 NFT 数据。
5 分钟阅读
如何爬取 OpenSea 博客图片

在这篇博文中,您将了解到:

  • 什么是 OpenSea 爬虫
  • 可以从 OpenSea 自动提取哪些类型的数据
  • 如何使用 Python 创建一个 OpenSea 爬虫脚本
  • 何时以及为什么需要更高级的解决方案

让我们开始吧!

什么是 OpenSea 爬虫?

OpenSea 爬虫是一种专门从 OpenSea(全球最大的 NFT 市场)获取数据的工具。该工具的主要目标是自动化收集各种与 NFT 相关的信息。通常,它使用自动化浏览器来实时获取 OpenSea 数据,而无需人工操作。

可以从 OpenSea 爬取哪些数据

以下是您可以从 OpenSea 爬取的一些主要数据点:

  • NFT 系列名称:NFT 系列的标题或名称。
  • 系列排名:根据其表现对该系列进行的排名或位置。
  • NFT 图片:与 NFT 系列或单个项目相关的图片。
  • 地板价:该系列中项目列出的最低价格。
  • 交易量:NFT 系列的总交易量。
  • 百分比变化:该系列在指定时间内的价格变化或百分比变化。
  • Token ID:该系列中每个 NFT 的唯一标识符。
  • 最近成交价:该系列中某个 NFT 的最新成交价格。
  • 销售历史:每个 NFT 项目的交易历史,包括以往的价格和买家。
  • 出价:对该系列某个 NFT 当前有效的出价。
  • 创作者信息:关于 NFT 创作者的详细信息,如用户名或个人资料。
  • 特征/属性:NFT 项目的具体特征或属性(例如:稀有度、颜色等)。
  • 项目描述:对该 NFT 项目的一段简短说明或信息。

如何爬取 OpenSea:分步指南

在这个分步教程中,您将学习如何构建一个 OpenSea 爬虫。目标是开发一个 Python 脚本,自动从 “Gaming”页面的“Top”部分获取 NFT 系列数据:

TOpenSea“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 文件,现在您的文件夹结构应如下所示:

OpenSea 爬虫项目结构

此时,scraper.py 是一个空的 Python 脚本,但很快就会包含爬虫的核心逻辑。

在 IDE 的终端中,激活虚拟环境。Linux 或 macOS 上执行以下命令:

./env/bin/activate

在 Windows 上,则执行:

env/Scripts/activate

太好了!现在您已经在一个用于网页爬取的 Python 环境中。

步骤 #2:选择爬虫库

在开始编写代码之前,您需要先确定用于提取所需数据的 最佳爬虫工具。为此,您应首先进行一些初步测试来分析目标网站的行为,步骤如下:

  1. 以无痕模式打开目标页面,以避免预先存储的 cookie 和偏好影响分析。
  2. 在页面任意位置右键单击并选择“Inspect”(检查)以打开浏览器的开发者工具。
  3. 进入“Network”选项卡。
  4. 刷新页面并进行交互,比如点击 “1h” 或 “6h” 按钮。
  5. 在“Fetch/XHR”选项卡中监控网络活动。

通过这样的方式,您可以了解该网页是如何加载并动态渲染数据的:

注意到动态的 GraphQL 请求

在这里,您可以查看页面实时发起的所有 AJAX 请求。通过检查这些请求,您会发现 OpenSea 从服务器动态获取数据。此外,进一步分析会发现某些按钮交互会触发 JavaScript 渲染,以动态更新页面内容。

这表明要成功爬取 OpenSea,需要使用像 Selenium 这样的浏览器自动化工具!

Selenium 允许您以编程方式控制浏览器,模拟真实用户的交互行为,从而有效地提取数据。现在,让我们安装并开始使用它吧。

步骤 #3:安装并设置 Selenium

可以通过 selenium pip 包来获取 Selenium。在激活的虚拟环境中运行以下命令安装 Selenium:

pip install -U selenium

想了解如何使用浏览器自动化工具,可阅读我们的 Selenium 网页爬取指南

scraper.py 中导入 Selenium 并初始化一个 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 使用了可检测无头浏览器的反爬虫措施,并会阻止此类请求。具体来说,服务器会返回 “Access Denied” 页面。

这意味着您不能在此爬虫中使用 --headless 标志。如果您有其他需求,可以考虑使用 Playwright Stealth 或 SeleniumBase 作为替代。

由于 OpenSea 会根据浏览器窗口大小进行自适应布局,因此最大化浏览器窗口,以确保渲染的是桌面版页面:

driver.maximize_window()

最后,一定要妥善关闭 WebDriver,以释放资源:

driver.quit()

做得好!您现在已经完成了在 OpenSea 爬取所需的基本环境配置。

步骤 #4:访问目标页面

使用 Selenium WebDriver 提供的 get() 方法,让浏览器进入目标页面:

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()

在脚本的最后一行设置一个调试断点并运行脚本。您将看到如下界面:

来自 Selenium 的 Chrome 窗口

“Chrome 正在被自动测试软件控制” 这条信息表明 Chrome 正在被 Selenium 正常控制。干得不错!

步骤 #5:与网页交互

默认情况下,“Gaming” 页面会显示 “Trending” (趋势)NFT 系列:

请注意默认列表为“Trending”

但我们关注的是 “Top” NFT 系列,也就是说,需要让 OpenSea 爬虫点击 “Top” 按钮,如下所示:

点击“Top”按钮

首先,右键单击 “Top” 按钮并选择 “Inspect”,以查看它的 HTML 结构:

“Top”按钮的 DevTools 部分

可以通过 [value="top"] 的 CSS 选择器来定位它。然后使用 Selenium 提供的 find_element() 方法,并调用 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 系列条目的 DevTools 部分

您可以通过使用 a[data-id="Item"] 的 CSS 选择器来选中所有的 NFT 系列条目。因为在元素的类名中有些看起来是随机生成的,所以尽量避免直接依赖它们。相反,可以利用 data-* 属性,因为它们通常用于测试并且具有较好的稳定性。

使用 find_elements() 来获取所有的 NFT 系列条目:

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 系列条目:

NFT 系列条目的 HTML 代码(第一部分)

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 列:

NFT 系列条目的 HTML 代码(第二部分)

数据结构如下:

  • 第一个 .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

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 列表中的数据导出到名为 nft_collections.csv 的文件中。它使用 Python 的 csv 模块来创建一个 writer 对象,并以结构化的格式写入数据。每条记录都以一行的形式存储,列标题对应 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

# 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 显得十分力不从心。而解决之道是:使用 Bright Data 的 OpenSea Scraper 专用方案,通过简单的 API 调用或无代码方式获取网站数据,并且不会被阻止!

结语

在这个分步教程中,您了解了什么是 OpenSea 爬虫,以及它能收集的各种数据类型。您还用不到 100 行代码完成了一个 Python 脚本来爬取 OpenSea 的 NFT 数据。

真正的挑战在于 OpenSea 的严格反爬虫措施,它可以阻止自动化浏览器的正常访问。我们提供的 OpenSea Scraper 可以通过 API 或无代码方式方便地获取公共 NFT 数据,包括名称、描述、Token ID、当前价格、最近成交价、历史记录、报价等等。

马上注册一个免费的 Bright Data 账号,启动我们的 Scraper API 吧!

支持支付宝等多种支付方式

Antonello Zanini

技术写作

5.5 years experience

Antonello是一名软件工程师,但他更喜欢称自己为技术传教士。通过写作传播知识是他的使命。

Expertise
Web 开发 网页抓取 AI 集成