使用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
相关产品推荐
相关产品推荐

