使用Python+Selenium对大页面截图时遇TimeoutException求助
解决Selenium Chrome大页面截图超时问题
核心问题原因
当页面尺寸过大(如1560x8897)时,通过set_window_size把窗口调整到页面大小后,Chrome渲染整个超大窗口的时间超过了默认的渲染超时限制,从而抛出TimeoutException。
解决方案
1. 延长Chrome渲染超时时间
在Chrome配置中添加渲染超时参数,同时设置Selenium的全局超时:
from selenium import webdriver chrome_options = webdriver.ChromeOptions() # 保留原有有效配置 chrome_options.add_argument('--headless') chrome_options.add_argument('--disable-gpu') chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--disable-setuid-sandbox') chrome_options.add_argument('--disable-dev-shm-usage') chrome_options.add_argument('--hide-scrollbars') chrome_options.add_argument("--force-device-scale-factor=1") # 新增:延长渲染超时时间(单位:毫秒,示例设为10分钟) chrome_options.add_argument('--renderer-timeout=600000') chrome_options.add_argument('--disable-timeout-detection') # 初始化driver时设置全局超时 driver = webdriver.Chrome(options=chrome_options) driver.set_page_load_timeout(600) # 页面加载超时10分钟 driver.set_script_timeout(600) # 脚本执行超时10分钟
2. 使用Chrome DevTools Protocol(CDP)直接捕获全页面
这是最可靠的大页面截图方案,无需调整窗口大小,直接通过CDP指令让Chrome捕获整个页面:
import io import os import base64 from PIL import Image from selenium import webdriver # 初始化driver(配置保留上述优化项) chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--headless') chrome_options.add_argument('--disable-gpu') chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--disable-setuid-sandbox') chrome_options.add_argument('--disable-dev-shm-usage') chrome_options.add_argument('--hide-scrollbars') chrome_options.add_argument("--force-device-scale-factor=1") chrome_options.add_argument('--renderer-timeout=600000') driver = webdriver.Chrome(options=chrome_options) driver.get(self.url) # 等待页面完全加载(替代固定sleep的动态等待) driver.execute_script("return document.readyState === 'complete'") # 使用CDP捕获全页面截图 screenshot_data = driver.execute_cdp_cmd( "Page.captureScreenshot", { "captureBeyondViewport": True, "fromSurface": True, "clip": { "x": 0, "y": 0, "width": driver.execute_script("return document.body.scrollWidth"), "height": driver.execute_script("return document.body.scrollHeight"), "scale": 1 } } ) # 处理并保存截图 png_data = io.BytesIO(base64.b64decode(screenshot_data['data'])) image = Image.open(png_data) screen_path = os.path.join(folder_output_path, f"{number_of_screen}.png") image.save(screen_path) driver.quit()
3. 替换固定sleep为显式等待
避免使用time.sleep(10)这种固定等待,改用动态等待页面加载完成:
from selenium.webdriver.support.ui import WebDriverWait # 等待页面加载完成,最多等待60秒 WebDriverWait(driver, 60).until( lambda d: d.execute_script("return document.readyState === 'complete'") )
关键说明
- CDP方法是目前处理大页面截图最稳定的方案,它绕开了调整窗口大小的步骤,直接让Chrome内部完成全页面的渲染和捕获,不会触发大窗口渲染超时。
- 延长超时时间作为辅助方案,适用于部分场景,但对于极端大页面,CDP方法效果更好。
内容的提问来源于stack exchange,提问作者JZA
相关产品推荐
相关产品推荐

