使用Selenium无法点击下一页且未知总页数的爬取问题
解决AskLaila翻页爬取问题
你的代码核心问题是固定循环次数+未判断下一页按钮状态,到第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 from selenium.common.exceptions import TimeoutException, NoSuchElementException dist = [] def extract_url(): # 等待当前页的结果链接加载完成,避免提前操作 WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.XPATH, "//h2[@class='resultTitle']//a")) ) # 提取当前页所有经销商链接 urls = driver.find_elements(By.XPATH, "//h2[@class='resultTitle']//a") for url in urls: dist.append(url.get_attribute("href")) # 滚动到底部,确保下一页按钮完全加载 driver.execute_script("window.scrollTo(0, document.body.scrollHeight)") try: # 等待下一页按钮可点击,排除已禁用的按钮(最后一页的按钮通常会加disabled属性) next_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, "//li[@class='btnNextPre']//a[not(@disabled)]")) ) next_btn.click() # 等待页面跳转完成:直到当前页的第一个链接失效,说明新页面已加载 WebDriverWait(driver, 10).until( EC.staleness_of(urls[0]) ) return True # 存在下一页,继续循环 except (TimeoutException, NoSuchElementException): # 没有可点击的下一页按钮,终止循环 return False # 初始化浏览器(根据你的浏览器类型调整,比如Firefox) driver = webdriver.Chrome() driver.get("https://www.asklaila.com/search/Delhi-NCR/-/book-distributor/") # 循环爬取所有页面 while True: has_next_page = extract_url() if not has_next_page: break # 关闭浏览器,释放资源 driver.quit() # 查看爬取结果 print(f"共获取到 {len(dist)} 个经销商链接")
关键优化点
- 等待机制替代硬操作:用
WebDriverWait等待元素加载,解决页面加载延迟导致的元素找不到问题(这是你第5页后失效的主要原因) - 动态判断下一页:通过
not(@disabled)筛选可点击的按钮,最后一页的按钮会被禁用,此时自动退出循环 - 页面跳转验证:用
staleness_of确保页面完全跳转后再继续爬取,避免重复抓取同一页内容 - 异常捕获:处理按钮不存在或超时的情况,避免程序崩溃
内容的提问来源于stack exchange,提问作者Lalit Joshi
相关产品推荐
相关产品推荐

