Selenium点击下拉框后page_source未更新,仅获前12条数据问题
问题排查与解决方案
嘿,我来帮你搞定这个爬取问题!你遇到的核心问题是点击下拉加载全部数据后,页面视觉上显示了,但Selenium还没捕捉到更新后的DOM,导致只拿到初始的12条数据。下面是具体的原因分析和修复方案:
核心原因:等待机制不对
你的代码里用了driver.implicitly_wait(5),但它的作用是「当找不到元素时最多等5秒」,而不是「等待页面内容完全更新」。点击下拉选项后,页面是通过AJAX异步加载300条数据的,这个过程需要时间,但初始的12条元素已经存在,所以Selenium会直接返回旧的元素列表,不会等新数据加载完成。
修复方案:用显式等待替代隐式等待
我们需要用WebDriverWait来显式等待页面内容更新,比如等待列表元素的数量超过12,或者直接等待元素数量达到300。这样能确保我们在获取数据前,页面已经完全加载了所有内容。
修改后的完整代码
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 driver = webdriver.Chrome("/home/ronith/Downloads/chromedriver") driver.get('https://www.findinall.com/finance-category-396/#') # 点击显示300条的下拉选项 driver.find_element_by_xpath("//select[@name='per_page']/option[@value='300']").click() # 显式等待:最多等20秒,直到列表元素数量超过初始的12条 wait = WebDriverWait(driver, 20) wait.until(lambda driver: len(driver.find_elements_by_xpath('//div[@class="pro-list-tb mt15"]')) > 12) # 可选:滚动到页面底部,确保所有元素都被渲染(有些页面需要滚动才会加载全部内容) driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 再等一下,确保滚动后的元素完全加载 wait.until(lambda driver: len(driver.find_elements_by_xpath('//div[@class="pro-list-tb mt15"]')) == 300) # 现在获取所有数据 data = driver.find_elements_by_xpath('//div[@class="pro-list-tb mt15"]') for item in data: print(item.text, '\n\n') driver.close()
额外注意点
- 如果你发现等待20秒还是不够,可以适当延长等待时间(比如改成30),因为不同网络环境下加载速度不同。
- 可以在获取数据前打印
len(data),确认是否拿到了300条元素,方便调试。
内容的提问来源于stack exchange,提问作者Ronith
相关产品推荐
相关产品推荐

