使用Selenium爬取Opensea排名页面表格出现列数据缺失问题求助
问题根因
- Opensea排名页的表格采用虚拟滚动和响应式渲染逻辑,仅当前浏览器视口内的单元格会被渲染到DOM中,视口外的列、行内容默认不会生成,直接抓取外层容器文本只能拿到当前可见的部分内容。
- 你使用的
find_element_by_xpath是Selenium高版本已废弃的API,元素匹配稳定性不足。 - 没有触发页面滚动加载逻辑,榜单默认仅加载前10条左右数据,后续内容需要下滑页面才会动态生成。
- 浏览器窗口过小会导致Opensea自动隐藏表格靠后的列,也是你只能拿到5项数据的核心原因。
修复后的实现代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time import pandas as pd # 配置Chrome参数,避免反爬拦截 options = webdriver.ChromeOptions() options.add_argument('--disable-blink-features=AutomationControlled') options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option('useAutomationExtension', False) PATH = '替换为你的chromedriver本地路径' driver = webdriver.Chrome(PATH, options=options) # 最大化窗口,确保所有表格列都正常渲染 driver.maximize_window() driver.get('https://opensea.io/rankings') # 等待表格元素加载完成 wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '[data-testid="rankings-table-row"]'))) # 模拟滚动加载全量数据,滚动次数可根据需要抓取的榜单长度调整 scroll_times = 5 for _ in range(scroll_times): driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(2) wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '[data-testid="rankings-table-row"]'))) # 逐行逐单元格抓取数据 rows = driver.find_elements(By.CSS_SELECTOR, '[data-testid="rankings-table-row"]') result = [] for row in rows: cells = row.find_elements(By.CSS_SELECTOR, '[data-testid="rankings-table-cell"]') row_data = [cell.text.strip() for cell in cells if cell.text.strip()] if row_data: result.append(row_data) print(row_data) # 可按需导出为csv文件 # pd.DataFrame(result).to_csv('opensea_rankings.csv', index=False, encoding='utf-8-sig') driver.quit()
注意事项
- 运行前请确认Chrome浏览器和ChromeDriver版本完全匹配,避免驱动启动报错。
- 如果触发人机验证,可手动完成验证后再继续运行,频繁请求时建议搭配代理IP降低限流概率。
- 不要短时间内频繁发起爬取请求,避免被平台限制访问。
内容的提问来源于stack exchange,提问作者hengjuice
相关产品推荐
相关产品推荐

