在自动化测试、网页内容归档等场景中,用Python实现网页自动截图是非常实用的需求。Selenium作为主流的浏览器自动化工具,搭配无头模式可以在后台完成所有操作,不需要弹出浏览器窗口,非常适合服务器环境或者批量任务场景。

环境准备
首先需要安装对应的依赖库,同时下载对应浏览器版本的驱动。这里以Chrome浏览器为例,安装步骤如下:
- 安装Selenium库:执行
pip install selenium命令 - 下载ChromeDriver,确保驱动版本和本地Chrome浏览器版本匹配,将驱动放到系统环境变量可访问的路径中
配置Selenium无头模式
无头模式的核心是设置ChromeOptions参数,让浏览器在后台运行不显示界面。基础配置代码如下:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# 创建无头模式配置
chrome_options = Options()
chrome_options.add_argument('--headless') # 开启无头模式
chrome_options.add_argument('--disable-gpu') # 禁用GPU加速,避免部分环境报错
chrome_options.add_argument('--window-size=1920,1080') # 设置浏览器窗口大小
# 初始化浏览器对象
driver = webdriver.Chrome(options=chrome_options)
# 访问目标网页
driver.get('https://ipipp.com')
截取全屏网页
默认情况下Selenium的save_screenshot方法只能截取当前可视区域的屏幕,要实现全屏截图需要调整浏览器的窗口大小,或者获取网页的完整高度后设置窗口尺寸。以下是全屏截图的实现:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
driver = webdriver.Chrome(options=chrome_options)
# 访问目标网页
driver.get('https://ipipp.com')
# 获取网页完整高度
page_height = driver.execute_script('return document.body.scrollHeight')
# 设置窗口高度为网页完整高度,宽度保持1920
driver.set_window_size(1920, page_height)
# 等待页面渲染完成
import time
time.sleep(2)
# 保存全屏截图
driver.save_screenshot('full_page.png')
driver.quit()
截取滚动长屏
有些网页是动态加载内容,滚动时才会触发新内容加载,这时候需要先模拟滚动操作,等待所有内容加载完成后再截取长屏。实现步骤如下:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://ipipp.com')
# 模拟滚动加载,每次滚动1000像素,直到滚动到页面底部
last_height = driver.execute_script('return document.body.scrollHeight')
while True:
# 滚动到页面底部
driver.execute_script('window.scrollTo(0, document.body.scrollHeight);')
# 等待新内容加载
time.sleep(2)
# 获取新的页面高度
new_height = driver.execute_script('return document.body.scrollHeight')
if new_height == last_height:
break
last_height = new_height
# 设置窗口为完整页面尺寸
driver.set_window_size(1920, last_height)
time.sleep(2)
# 保存滚动长屏
driver.save_screenshot('scroll_long_page.png')
driver.quit()
截取特定HTML元素
如果只需要截取网页中的某个特定元素,比如某个<div>标签、某个按钮区域,可以通过元素定位找到目标元素,再调用元素的screenshot方法实现。以下是截取特定元素的示例:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import time
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--window-size=1920,1080')
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://ipipp.com')
time.sleep(2)
# 定位目标元素,这里以id为target_element的元素为例
target_element = driver.find_element(By.ID, 'target_element')
# 截取该元素的截图并保存
target_element.screenshot('target_element.png')
driver.quit()
注意事项
- 截图前建议添加适当的等待时间,避免页面未渲染完成导致截图内容缺失
- 如果网页有弹窗、广告等内容,需要先通过代码处理掉这些元素,再执行截图操作
- 不同浏览器的无头模式配置略有差异,如果使用Firefox等浏览器,需要对应调整配置参数
- 截取特定元素时,要确保元素在页面中是可见状态,否则可能无法正常截图