重要提示:PhantomJS 已被废弃
也是最重要的一点:PhantomJS 项目已于 2025 年官方宣布停止维护,这意味着它不再接收安全更新、错误修复或新功能支持,在新项目中,强烈建议使用其现代替代品。
PhantomJS 的现代替代品:
- Headless Chrome/Chromium:这是目前最主流的方案,它通过
selenium库来驱动,是功能最强大、兼容性最好的选择。 - Headless Firefox:同样通过
selenium库驱动,是另一个优秀的开源选择。 - Playwright:由微软开发的新一代自动化工具,性能优异,支持 Chromium, Firefox, 和 WebKit。
尽管 PhantomJS 已废弃,但如果你需要维护旧项目或在特定环境中使用,了解如何调用它仍然是有价值的,下面我们详细介绍。
使用 Selenium 库(最常用)
这是最经典、最主流的方法,Selenium 是一个用于 Web 应用程序测试的工具,它可以模拟用户在浏览器上的操作,通过 Selenium,你可以用 Python 代码来驱动 PhantomJS 浏览器。
步骤 1:安装 Selenium
你需要安装 Selenium 库。
pip install selenium
步骤 2:下载 PhantomJS
Selenium 本身不包含 PhantomJS 浏览器,你需要单独下载它。
- 访问 PhantomJS 官方下载页面:https://phantomjs.org/download.html
- 根据你的操作系统选择对应的版本(Windows, macOS, Linux)。
- 下载后,解压压缩包,你会得到一个可执行文件
phantomjs(或phantomjs.exe)。
步骤 3:配置环境变量(推荐)
为了让 Python 能够在任何地方找到 phantomjs 可执行文件,最好将解压后的 bin 目录路径添加到系统的 环境变量 PATH 中。
- Windows: 将
phantomjs.exe所在的文件夹路径添加到系统环境变量的Path中。 - macOS / Linux: 将
phantomjs所在的文件夹路径添加到~/.bash_profile或~/.zshrc文件中,export PATH=$PATH:/path/to/phantomjs/bin,然后运行source ~/.bash_profile或source ~/.zshrc使其生效。
如果不想配置环境变量,你需要在代码中提供 phantomjs.exe 的完整路径。
步骤 4:编写 Python 代码
下面是一个简单的例子,使用 Selenium 和 PhantomJS 访问百度,并搜索 "Python"。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
# 1. 指定 PhantomJS 可执行文件的路径
# 如果你已经将 phantomjs 添加到系统 PATH 中,可以省略此步
# driver = webdriver.PhantomJS(executable_path='/path/to/your/phantomjs')
# 如果配置了环境变量,直接实例化即可
driver = webdriver.PhantomJS()
# 2. 设置一个隐式等待时间(秒)
# 这意味着在查找元素时,如果元素没有立即出现,会等待最多10秒
driver.implicitly_wait(10)
# 3. 访问目标网页
print("正在访问百度首页...")
driver.get("https://www.baidu.com")
# 4. 获取页面标题并打印
print(f"页面标题是: {driver.title}")
# 5. 定位搜索框并输入内容
try:
# 通过 name 属性定位搜索框
search_box = driver.find_element_by_name("wd")
search_box.send_keys("Python")
print("已在搜索框输入 'Python'")
# 模拟按下回车键
search_box.send_keys(Keys.RETURN)
print("已按下回车键进行搜索")
except Exception as e:
print(f"发生错误: {e}")
driver.quit()
exit()
# 6. 等待搜索结果加载
# 现代网页多为异步加载,隐式等待可能不够,可以显式等待
time.sleep(2) # 简单的等待,不推荐在生产环境使用
# 7. 获取并打印搜索结果的URL
print("\n搜索结果URL:")
results = driver.find_elements_by_css_selector("h3 > a")
for i, result in enumerate(results):
print(f"{i+1}. {result.get_attribute('href')}")
# 8. 关闭浏览器
print("\n任务完成,正在关闭浏览器...")
driver.quit()
运行代码
将上述代码保存为 phantomjs_test.py,然后在终端中运行:
python phantomjs_test.py
由于 PhantomJS 是无头(无界面)的,运行时你不会看到任何浏览器窗口弹出,但可以在终端看到打印的输出信息。
使用 pyppeteer 库(更现代的方案)
pyppeteer 是 Google 的 Puppeteer 的 Python 非官方端口,Puppeteer 是一个控制 Headless Chrome 的强大库,虽然 pyppeteer 主要用于控制 Chrome,但它也兼容旧版的 PhantomJS,这种方法比直接使用 Selenium + PhantomJS 更“现代化”。
步骤 1:安装 pyppeteer
pip install pyppeteer
pyppeteer 在首次运行时会自动下载一个兼容的 Chromium 浏览器,这非常方便,你无需手动下载任何浏览器。
步骤 2:编写 Python 代码
import asyncio
from pyppeteer import launch
async def main():
# 1. 启动浏览器
# phantomjsPath 指向你的 phantomjs 可执行文件路径
# 如果不指定,pyppeteer 会尝试使用默认的 Chrome/Chromium
browser = await launch({
'headless': True,
'executablePath': '/path/to/your/phantomjs' # 指向 phantomjs
})
# 2. 打开新页面
page = await browser.newPage()
# 3. 设置视口大小,某些网站需要
await page.setViewport({'width': 1024, 'height': 768})
# 4. 访问目标网页
print("正在访问百度首页...")
await page.goto('https://www.baidu.com')
# 5. 获取页面标题= await page.title()
print(f"页面标题是: {title}")
# 6. 定位搜索框并输入内容
# pyppeteer 使用类似 CSS selector 或 XPath 的方式
await page.type('input[name="wd"]', 'Python')
print("已在搜索框输入 'Python'")
# 7. 点击搜索按钮
await page.click('#su') # 百度搜索按钮的 id
print("已点击搜索按钮")
# 8. 等待搜索结果加载
# 等待一个包含特定选择器的元素出现
await page.waitForSelector('h3') # 等待 h3 标签出现,表明结果已加载
# 9. 获取搜索结果
print("\n搜索结果URL:")
links = await page.querySelectorAll('h3 > a')
for i, link in enumerate(links):
href = await link.getProperty('href')
print(f"{i+1}. {href.jsonValue()}")
# 10. 关闭浏览器
print("\n任务完成,正在关闭浏览器...")
await browser.close()
# 运行异步主函数
asyncio.get_event_loop().run_until_complete(main())
总结与对比
| 特性 | Selenium + PhantomJS | Pyppeteer + PhantomJS | Selenium + Headless Chrome (推荐) |
|---|---|---|---|
| 维护状态 | 已废弃 | 已废弃 | 积极维护 |
| 易用性 | 需要手动下载和配置 PhantomJS | 需要手动下载和配置 PhantomJS | pip install 即可,自动下载驱动 |
| 功能 | 基础功能齐全 | API 更现代,基于 Promise | 功能最全,与最新 Web 标准兼容 |
| 性能 | 较慢 | 较慢 | 快 |
| 社区支持 | 基本停止 | 基本停止 | 非常活跃 |
| 推荐度 | 仅限维护旧项目 | 仅限维护旧项目 | 所有新项目的首选 |
最终建议
请不要再为任何新项目安装和使用 PhantomJS。
如果你需要做网页自动化、爬虫或截图,请直接使用 Selenium + Headless Chrome。
使用 Selenium + Headless Chrome 的示例代码:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# 配置 Chrome 选项
chrome_options = Options()
chrome_options.add_argument("--headless") # 无头模式
chrome_options.add_argument("--disable-gpu") # 禁用GPU加速,在某些系统上需要
# 如果不想看到浏览器一闪而过,可以禁用沙盒
# chrome_options.add_argument("--no-sandbox")
# 实例化驱动
# 确保你的电脑上已安装 Chrome 浏览器
# Selenium 4.x 通常能自动找到 ChromeDriver,无需手动配置
driver = webdriver.Chrome(options=chrome_options)
try:
driver.get("https://www.baidu.com")
print(f"页面标题: {driver.title}")
driver.save_screenshot("baidu_screenshot.png") # 截图
print("截图已保存为 baidu_screenshot.png")
finally:
driver.quit()
这个方案是当前业界最稳定、最可靠的选择。
