为什么Python中Selenium交互式运行与脚本运行的输出结果存在差异?
问题原因分析
- 最核心的原因是缺少页面渲染等待逻辑:非交互式脚本执行时,代码是连续无停顿运行的,
driver.get()方法默认仅等待页面初始HTML的DOM加载完成,不会等待异步JavaScript执行、后端接口请求返回、动态内容渲染的整个过程。而在iPython交互式环境中,你手动输入每条命令的间隔,刚好给了页面足够的时间完成所有动态渲染,因此可以拿到完整的页面源码。 - 次要可能原因是无头Chrome的自动化特征被站点反爬策略识别,阻止了后续JS资源的加载:部分站点会检测浏览器是否处于自动化控制状态,对疑似爬虫的请求只返回基础静态内容,不加载动态JS组件。
解决方案
你可以通过增加显式等待逻辑、补充反检测启动参数解决该问题,修改后的参考代码如下:
#!/usr/bin/python3 import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC WINDOW_SIZE = "1920,1080" chrome_options = Options() chrome_options.add_argument("--headless=new") # 新版无头模式,和普通浏览器行为兼容性更好 chrome_options.add_argument("--window-size={0}".format(WINDOW_SIZE)) chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("--disable-dev-shm-usage") # 添加反检测参数,避免被识别为自动化爬虫 chrome_options.add_argument("--disable-blink-features=AutomationControlled") chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"]) chrome_options.add_experimental_option("useAutomationExtension", False) service = Service('/usr/local/bin/chromedriver') driver = webdriver.Chrome(service=service, options=chrome_options) # 隐式等待兜底,全局最多等待10秒查找元素 driver.implicitly_wait(10) driver.get("https://www.stakingrewards.com/staking/?page=1&sort=rank_ASC") # 显式等待:等待页面核心质押列表元素加载完成,最多等20秒 try: WebDriverWait(driver, 20).until( EC.presence_of_element_located((By.CSS_SELECTOR, "[data-testid='staking-table']")) ) # 额外等待1秒保证所有动态内容渲染完成,可根据实际情况调整 time.sleep(1) except Exception as e: print("元素加载超时:", e) src = driver.page_source # Check page source length print(len(src)) # Quit all windows related to the driver instance driver.quit()
如果调整后仍有问题,可以在获取源码前先加time.sleep(5)做验证,确认是等待时长不足的问题后,再调整显式等待的元素选择器和超时时间即可。
内容的提问来源于stack exchange,提问作者K-83Rick
相关产品推荐
相关产品推荐

