Python爬虫中如何循环点击加载更多按钮并解决点击报错问题
问题根因
- 仅在页面初始加载时获取了一次加载更多按钮元素,每次点击触发页面DOM更新后,旧的元素引用会失效,触发
StaleElementReferenceException - 循环终止逻辑缺陷:仅判断按钮是否展示,没有校验按钮可交互状态。所有商品加载完成后按钮不会消失,但已经处于不可点击状态,直接调用原生
click()方法就会触发Button is not clickable at point报错 - 点击逻辑不一致:首次点击用JS执行,循环内用Selenium原生点击,容易因为元素不在视口、被浮层遮挡触发点击失败
- 索引计算错误:
j = len(prodd)+1会导致每次采集跳过1个商品,出现链接漏抓 - 异常捕获不全:没有捕获元素不可点击、点击被拦截的相关异常,遇到对应报错会直接终止程序,无法正常退出循环
修正后代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.common.exceptions import ( StaleElementReferenceException, ElementClickInterceptedException, ElementNotInteractableException ) import time url = 'https://mamaearth.in/shop' # Selenium 4.6+版本内置Selenium Manager,无需手动指定chromedriver路径 driver = webdriver.Chrome() driver.get(url) time.sleep(3) j = 0 while True: try: # 每次循环重新定位按钮,避免DOM更新导致元素引用过期 load_more_btn = driver.find_element( By.XPATH, '//button[@class="Button__MinimalButton-sc-wiqi81-0 Button__Styled-sc-wiqi81-1 cLpIaN"]' ) # 滚动到按钮位置,避免元素不在可视区域 driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", load_more_btn) time.sleep(1) # 用JS触发点击,规避元素遮挡、样式拦截导致的原生点击失败 driver.execute_script("arguments[0].click();", load_more_btn) time.sleep(5) # 提取当前加载完成的所有商品 products = driver.find_elements(By.CLASS_NAME, "uniquewhite") # 仅提取上次采集后新增的商品链接 new_products = products[j:] for product in new_products: product_link = product.find_element(By.TAG_NAME, 'a').get_attribute('href') print(product_link) # 更新索引,修复原逻辑+1导致的漏抓问题 j = len(products) time.sleep(2) except (StaleElementReferenceException, ElementClickInterceptedException, ElementNotInteractableException): # 触发上述任意异常说明按钮已不可点击,所有商品加载完成,退出循环 break # 补抓最后一页加载完成后未采集的商品链接,避免漏数据 products = driver.find_elements(By.CLASS_NAME, "uniquewhite") new_products = products[j:] for product in new_products: product_link = product.find_element(By.TAG_NAME, 'a').get_attribute('href') print(product_link) driver.quit()
关键调整说明
- 适配新版Selenium API:替换所有已废弃的
find_element_by_*旧写法,改用官方推荐的By类定位方式 - 每次循环重新定位加载更多按钮,从根源解决DOM刷新导致的元素引用失效问题
- 统一点击逻辑:点击前先滚动按钮到视口中间,再用JS触发点击,避免浮层遮挡、元素偏移导致的点击报错
- 完善异常捕获逻辑:覆盖元素过期、点击被拦截、元素不可交互三类场景,触发异常即判定加载完成,自动退出循环,不会出现死循环
- 修复索引计算错误,移除多余的
+1偏移,避免商品链接漏抓 - 循环退出后增加一次补采集逻辑,覆盖最后一页加载完成后未进入采集分支的场景,保证数据完整性
内容的提问来源于stack exchange,提问作者Abhishek Singh
相关产品推荐
相关产品推荐

