杰瑞科技汇

Python如何用PhantomJS实现截图?

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

Python如何用PhantomJS实现截图?-图1
(图片来源网络,侵删)

下面我将为你详细介绍如何使用 Python 和 PhantomJS 进行截图,并提供更现代的替代方案。


使用 Python + Selenium + PhantomJS (经典方法)

这是最常用和最稳定的方式。selenium 库提供了与 PhantomJS 交互的 API。

安装必要的库

你需要安装 selenium 库。

pip install selenium

下载 PhantomJS

pip install 只会安装 Python 库,不会下载 PhantomJS 的可执行文件,你需要手动下载。

Python如何用PhantomJS实现截图?-图2
(图片来源网络,侵删)
  1. 访问 PhantomJS 官方下载页面:https://phantomjs.org/download.html
  2. 根据你的操作系统(Windows, macOS, Linux)下载对应的压缩包。
  3. 解压下载的文件,你会得到一个 phantomjs.exe (Windows) 或 phantomjs (macOS/Linux) 的可执行文件。
  4. 重要:将这个可执行文件的路径添加到系统的 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()

代码解释:

  1. 导入库: 从 selenium 导入 webdriver
  2. 设置路径: PHANTOMJS_PATH 指向你的 PhantomJS 可执行文件。
  3. 配置能力 (DesiredCapabilities): 这是 PhantomJS 的高级配置,可以设置 User-Agent、禁用图片、调整视口大小等。
  4. 初始化 driver: webdriver.PhantomJS() 创建了一个无头浏览器实例。
  5. 打开网页: driver.get(url) 在浏览器中导航到指定 URL。
  6. 截图:
    • driver.save_screenshot(): 截取整个当前浏览器窗口的可见部分(即视口 viewport)。
    • element.screenshot(): 先通过 find_element_by_id 等方法定位到某个 HTML 元素,然后对该元素进行截图。
  7. 关闭: driver.quit() 关闭浏览器并释放资源。

使用 pyppeteer (现代替代方案之一)

pyppeteer 是 Google Chrome 的无头浏览器的一个 Python 封装,是 Puppeteer (Node.js 库) 的非官方移植,它比 PhantomJS 更快、更稳定,并且支持现代网页特性。

安装 pyppeteer

pip install pyppeteer

首次运行时,pyppeteer 会自动下载一个匹配的 Chromium 浏览器,非常方便。

Python如何用PhantomJS实现截图?-图3
(图片来源网络,侵删)

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 浏览器的强大功能,并且维护良好。

安装 seleniumwebdriver-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 的旧项目,那么继续使用它是可以的,但应该有计划地将其迁移到更现代的方案上。

分享:
扫描分享到社交APP
上一篇
下一篇