如何在Selenium无头模式下截取网页全屏截图?
在Selenium无头模式下获取网页完整全屏截图的解决方案
你当前的代码设置了窗口大小但仅截取到页面左上角,这是因为无头模式下Chrome的渲染逻辑和普通模式存在差异,再加上部分网站的响应式布局适配问题,需要调整参数或使用更精准的截图方法。以下是几种可行的解决方案:
方法1:补充无头模式关键渲染参数
Chrome无头模式需要额外配置参数来确保页面正常渲染,避免布局错位:
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service options = Options() options.add_argument('--headless=new') # 添加解决无头模式渲染问题的核心参数 options.add_argument('--disable-gpu') options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') # 明确窗口尺寸+设备像素比,避免缩放问题 options.add_argument('--window-size=1920,1080') options.add_argument('--force-device-scale-factor=1') # 模拟真实浏览器UA,避免网站针对无头模式做限制 options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36') srv = Service() driver = webdriver.Chrome(service=srv, options=options) driver.get("https://www.orf.at/") # 用隐式等待替代time.sleep,确保页面加载完成 driver.implicitly_wait(5) driver.save_screenshot("screen_full.png") driver.quit()
方法2:调用Chrome DevTools API截取完整页面
如果页面内容超过窗口高度,save_screenshot只能截取当前视口,此时可以用Chrome的调试协议直接获取完整页面截图:
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service import base64 options = Options() options.add_argument('--headless=new') options.add_argument('--disable-gpu') options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36') srv = Service() driver = webdriver.Chrome(service=srv, options=options) driver.get("https://www.orf.at/") driver.implicitly_wait(5) # 通过CDP命令捕获超出视口的完整页面 screenshot_data = driver.execute_cdp_cmd( "Page.captureScreenshot", {"captureBeyondViewport": True, "fromSurface": True} ) # 将base64格式的截图数据保存为本地图片 with open("full_page.png", "wb") as f: f.write(base64.b64decode(screenshot_data['data'])) driver.quit()
方法3:动态调整窗口为页面实际高度
先获取页面的真实滚动高度,再调整窗口尺寸后截图:
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service options = Options() options.add_argument('--headless=new') options.add_argument('--disable-gpu') options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36') srv = Service() driver = webdriver.Chrome(service=srv, options=options) driver.get("https://www.orf.at/") driver.implicitly_wait(5) # 获取页面完整滚动高度 page_height = driver.execute_script("return document.body.scrollHeight") # 设置窗口尺寸为页面宽度+完整高度 driver.set_window_size(1920, page_height) driver.save_screenshot("full_screen.png") driver.quit()
注意事项
- 尽量避免使用
time.sleep,优先用implicitly_wait或显式等待(WebDriverWait),确保页面元素和布局完全加载 - 部分网站可能有反爬机制,添加真实的User-Agent参数可以降低被识别为无头浏览器的概率
内容的提问来源于stack exchange,提问作者Rapid1898
相关产品推荐
相关产品推荐

