You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Selenium+Django爬取Dextool 35页懒加载市场数据如何优化代码

代码优化方案

核心问题

你的现有代码仅执行了一次表格滚动操作,仅触发了首屏数据加载,没有循环处理后续34页的加载逻辑,也没有设置新数据加载完成的等待判定,因此只能拿到第一页数据。

优化思路

  • 优先采用模拟点击下一页按钮的方式加载后续页面,比模拟滚动的稳定性更高,不会因滚动高度计算误差出现漏加载的情况
  • 每次触发下一页操作后,加入显式等待逻辑,确认新数据渲染完成后再执行爬取,避免拿到空白或重复数据
  • 加入分页终止判定,按已知的35页总数量控制循环次数即可
  • 每页加载完成后加入1-2秒的随机延时,规避站点反爬策略限制

优化后代码

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time
import random

def getData(url):
    # 新版Selenium可自动匹配chromedriver,无需指定executable_path,如需兼容旧版可保留你原有的路径配置
    driver = webdriver.Chrome()
    driver.get('https://www.dextools.io/app/uniswap/pair-explorer/0xa29fe6ef9592b5d408cca961d0fb9b1faf497d6d')
    # 等待表格加载完成
    tableElement = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.TAG_NAME, 'ngx-datatable'))
    )
    driver.execute_script("arguments[0].scrollIntoView();", tableElement)
    # 按已知总页数35控制循环
    total_page = 35
    for page in range(total_page):
        # 等待当前页所有行数据渲染完成
        WebDriverWait(driver, 10).until(
            EC.presence_of_all_elements_located((By.TAG_NAME, 'datatable-row-wrapper'))
        )
        time.sleep(random.uniform(1, 2))
        # 爬取当前页数据
        rowWrapper = tableElement.find_elements(By.TAG_NAME, 'datatable-row-wrapper')
        for row in rowWrapper:
            cells = row.find_elements(By.TAG_NAME, 'datatable-body-cell')
            date = cells[0].text
            trade_type = cells[1].text
            price_usd = cells[2].text
            price_eth = cells[3].text
            amount_cuminu = cells[4].text
            total_eth = cells[5].text
            maker = cells[6].find_element(By.TAG_NAME, 'a').get_attribute('href')
            print(date, trade_type, price_usd, price_eth, amount_cuminu, total_eth, maker)
            print('----')
        # 最后一页无需点击下一页
        if page == total_page - 1:
            break
        # 定位下一页按钮,ngx-datatable组件默认下一页按钮类为datatable-pager-next,可根据实际页面元素调整选择器
        next_btn = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.CSS_SELECTOR, '.datatable-pager-next a'))
        )
        # 用js触发点击,避免元素被遮挡导致点击失败
        driver.execute_script("arguments[0].click();", next_btn)
    driver.quit()

补充说明

如果页面没有显式的下一页按钮,仅支持滚动加载,把代码中点击下一页的逻辑替换为表格滚动到底部的操作即可,其他逻辑保持不变。

内容的提问来源于stack exchange,提问作者DENNIS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 20:45:02