虽然 PhantomJS 目前已经停止维护,并且官方推荐使用更现代的替代品(如 Playwright 或 Selenium + Headless Chrome/Firefox),但了解如何使用它仍然很有价值,尤其是在维护旧项目时。

下面我将为你详细介绍如何使用 Python 和 PhantomJS 进行截图,并提供更现代的替代方案。
使用 Python + Selenium + PhantomJS (经典方法)
这是最常用和最稳定的方式。selenium 库提供了与 PhantomJS 交互的 API。
安装必要的库
你需要安装 selenium 库。
pip install selenium
下载 PhantomJS
pip install 只会安装 Python 库,不会下载 PhantomJS 的可执行文件,你需要手动下载。

- 访问 PhantomJS 官方下载页面:https://phantomjs.org/download.html
- 根据你的操作系统(Windows, macOS, Linux)下载对应的压缩包。
- 解压下载的文件,你会得到一个
phantomjs.exe(Windows) 或phantomjs(macOS/Linux) 的可执行文件。 - 重要:将这个可执行文件的路径添加到系统的
PATH环境变量中,或者在 Python 代码中明确指定其路径,为了方便,建议直接将其放在你的项目文件夹下。
Python 代码示例
以下是一个完整的 Python 脚本,用于截取百度首页的截图。
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
# --- 步骤 1: 设置 PhantomJS 路径 ---
# phantomjs 在系统 PATH 中,可以直接传入 'phantomjs'
# 否则,请提供完整的路径, '/path/to/your/phantomjs'
PHANTOMJS_PATH = 'phantomjs' # 假设 phantomjs.exe 或 phantomjs 在同级目录下
# --- 步骤 2: 配置 PhantomJS ---
# 设置一些参数,例如禁用图片加载可以加快速度
dcap = dict(DesiredCapabilities.PHANTOMJS)
# dcap["phantomjs.page.settings.userAgent"] = ("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36")
# dcap["phantomjs.page.settings.loadImages"] = False
# --- 步骤 3: 初始化 WebDriver ---
try:
# 创建一个 PhantomJS 的 WebDriver 实例
driver = webdriver.PhantomJS(desired_capabilities=dcap, service_args=['--ignore-ssl-errors=true', '--ssl-protocol=any'])
# --- 步骤 4: 打开目标网页 ---
url = 'https://www.baidu.com'
print(f"正在打开网页: {url}")
driver.get(url)
# --- 步骤 5: 截图 ---
# 截取整个页面的截图
screenshot_path = 'baidu_fullpage.png'
driver.save_screenshot(screenshot_path)
print(f"已保存全屏截图到: {screenshot_path}")
# 截取指定元素(例如百度搜索框)的截图
try:
search_box = driver.find_element_by_id('kw')
search_box.screenshot('baidu_searchbox.png')
print("已保存百度搜索框截图到: baidu_searchbox.png")
except Exception as e:
print(f"无法找到搜索框元素: {e}")
# --- 步骤 6: 关闭 WebDriver ---
driver.quit()
print("截图完成,WebDriver 已关闭。")
except Exception as e:
print(f"发生错误: {e}")
if 'driver' in locals():
driver.quit()
代码解释:
- 导入库: 从
selenium导入webdriver。 - 设置路径:
PHANTOMJS_PATH指向你的 PhantomJS 可执行文件。 - 配置能力 (
DesiredCapabilities): 这是 PhantomJS 的高级配置,可以设置 User-Agent、禁用图片、调整视口大小等。 - 初始化
driver:webdriver.PhantomJS()创建了一个无头浏览器实例。 - 打开网页:
driver.get(url)在浏览器中导航到指定 URL。 - 截图:
driver.save_screenshot(): 截取整个当前浏览器窗口的可见部分(即视口 viewport)。element.screenshot(): 先通过find_element_by_id等方法定位到某个 HTML 元素,然后对该元素进行截图。
- 关闭:
driver.quit()关闭浏览器并释放资源。
使用 pyppeteer (现代替代方案之一)
pyppeteer 是 Google Chrome 的无头浏览器的一个 Python 封装,是 Puppeteer (Node.js 库) 的非官方移植,它比 PhantomJS 更快、更稳定,并且支持现代网页特性。
安装 pyppeteer
pip install pyppeteer
首次运行时,pyppeteer 会自动下载一个匹配的 Chromium 浏览器,非常方便。

Python 代码示例
import asyncio
from pyppeteer import launch
async def take_screenshot():
# 启动浏览器
# headless=True 表示无头模式
browser = await launch(headless=True)
# 打开一个新页面
page = await browser.newPage()
# 设置视口大小,否则截图可能很小
await page.setViewport({'width': 1280, 'height': 800})
# 导航到目标网页
url = 'https://www.baidu.com'
print(f"正在打开网页: {url}")
await page.goto(url)
# 截取整个页面的截图
# 注意:pyppeteer 默认截取的是完整页面,而不是视口
await page.screenshot({'path': 'baidu_fullpage_pyppeteer.png'})
print("已保存全屏截图到: baidu_fullpage_pyppeteer.png")
# 截取指定元素的截图
try:
# pyppeteer 使用类似 CSS 选择器的方式定位元素
search_box = await page.querySelector('#kw')
await search_box.screenshot({'path': 'baidu_searchbox_pyppeteer.png'})
print("已保存百度搜索框截图到: baidu_searchbox_pyppeteer.png")
except Exception as e:
print(f"无法找到搜索框元素: {e}")
# 关闭浏览器
await browser.close()
print("截图完成,浏览器已关闭。")
# 运行异步函数
asyncio.get_event_loop().run_until_complete(take_screenshot())
使用 selenium + Headless Chrome (推荐方案)
这是目前最主流、最推荐的方案,它利用了 Chrome 浏览器的强大功能,并且维护良好。
安装 selenium 和 webdriver-manager
webdriver-manager 可以自动下载和管理 ChromeDriver,无需手动配置。
pip install selenium pip install webdriver-manager
Python 代码示例
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
def take_screenshot_with_chrome():
# --- 步骤 1: 配置 Chrome 选项 ---
chrome_options = Options()
# 设置为无头模式
chrome_options.add_argument('--headless')
# 设置窗口大小,确保截图完整
chrome_options.add_argument('--window-size=1280,800')
# 在某些 Linux 系统上可能需要
# chrome_options.add_argument('--no-sandbox')
# chrome_options.add_argument('--disable-dev-shm-usage')
# --- 步骤 2: 初始化 WebDriver ---
# webdriver-manager 会自动下载并管理 ChromeDriver
driver = webdriver.Chrome(
options=chrome_options,
executable_path=ChromeDriverManager().install()
)
try:
# --- 步骤 3: 打开目标网页 ---
url = 'https://www.baidu.com'
print(f"正在打开网页: {url}")
driver.get(url)
# --- 步骤 4: 截图 ---
# 截取整个视口的截图
driver.save_screenshot('baidu_fullpage_chrome.png')
print("已保存视口截图到: baidu_fullpage_chrome.png")
# 如果要截取完整长度的页面,需要先执行 JavaScript
# 1. 获取页面总高度
# 2. 设置窗口大小为页面总大小
# 3. 截图
print("正在截取完整页面长度的截图...")
total_height = driver.execute_script("return document.body.scrollHeight")
driver.set_window_size(1280, total_height)
driver.save_screenshot('baidu_fullpage_length_chrome.png')
print("已保存完整页面长度截图到: baidu_fullpage_length_chrome.png")
# 截取指定元素
try:
search_box = driver.find_element_by_id('kw')
search_box.screenshot('baidu_searchbox_chrome.png')
print("已保存百度搜索框截图到: baidu_searchbox_chrome.png")
except Exception as e:
print(f"无法找到搜索框元素: {e}")
finally:
# --- 步骤 5: 关闭 WebDriver ---
driver.quit()
print("截图完成,WebDriver 已关闭。")
# 运行函数
take_screenshot_with_chrome()
总结与对比
| 特性 | Python + Selenium + PhantomJS | Python + Pyppeteer | Python + Selenium + Headless Chrome |
|---|---|---|---|
| 维护状态 | 已停止维护 | 活跃,但非官方 | 非常活跃,官方推荐 |
| 性能 | 较慢 | 快 | 非常快 |
| 兼容性 | 较差,不支持 ES6+ 等 | 好,基于 Chromium | 最好,支持所有现代 Web 标准 |
| 配置复杂度 | 需手动下载和配置 PhantomJS | 简单,自动下载 Chromium | 简单,webdriver-manager 自动管理驱动 |
| 功能 | 基础功能齐全 | API 现代化,功能强大 | 功能最全面,生态系统最好 |
| 推荐度 | 仅用于维护旧项目 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ (首选) |
对于任何新项目,强烈推荐使用 selenium + Headless Chrome 的组合,它稳定、快速且功能强大,是业界的黄金标准。
如果你正在维护一个已经使用 PhantomJS 的旧项目,那么继续使用它是可以的,但应该有计划地将其迁移到更现代的方案上。
