如何用Selenium循环点击IMDB的「加载50条更多」按钮直至加载全部数据
解决IMDB页面循环点击「加载50条更多」按钮的问题
原代码的核心问题
- 未导入
TimeoutException,捕获异常时会触发未定义错误 - 按钮处于页面底部,未滚动至可见区域时无法触发点击
- 定位方式不够精准,且混用隐式等待与显式等待易导致逻辑混乱
修正后的代码
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 from selenium.common.exceptions import TimeoutException, ElementClickInterceptedException url = "https://www.imdb.com/search/title/?title_type=tv_series&release_date=2016-01-01,2024-12-01&sort=release_date,desc&countries=KR" driver = webdriver.Chrome() driver.get(url) driver.maximize_window() # 最大化窗口避免元素被遮挡 try: while True: try: # 等待加载按钮出现并滚动至可见区域 more_button = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, '//button[contains(@class, "ipc-see-more__button") and contains(text(), "Load 50 more")]')) ) # 滚动到按钮位置,确保可点击 driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", more_button) # 等待按钮可点击后点击 WebDriverWait(driver, 5).until( EC.element_to_be_clickable((By.XPATH, '//button[contains(@class, "ipc-see-more__button") and contains(text(), "Load 50 more")]')) ).click() # 等待新内容加载完成(通过等待列表元素数量变化实现) current_count = len(driver.find_elements(By.CLASS_NAME, "ipc-metadata-list-summary-item")) WebDriverWait(driver, 15).until( lambda d: len(d.find_elements(By.CLASS_NAME, "ipc-metadata-list-summary-item")) > current_count ) except (TimeoutException, ElementClickInterceptedException): # 按钮不存在或无法点击时退出循环 break finally: driver.quit()
关键优化点说明
- 导入必要异常类:新增
ElementClickInterceptedException处理按钮被遮挡的情况 - 滚动至元素可见:用
execute_script强制滚动到按钮位置,解决因元素在视口外无法点击的问题 - 精准定位按钮:结合按钮class和文本内容编写XPath,避免因class变更导致定位失败
- 等待内容加载完成:通过监听列表元素数量变化,确保新数据加载完成后再进行下一次循环
- 最大化窗口:减少因页面布局问题导致的元素遮挡
内容的提问来源于stack exchange,提问作者buttertatoes
相关产品推荐
相关产品推荐

