杰瑞科技汇

python调用phantomjs

重要提示:PhantomJS 已被废弃

也是最重要的一点:PhantomJS 项目已于 2025 年官方宣布停止维护,这意味着它不再接收安全更新、错误修复或新功能支持,在新项目中,强烈建议使用其现代替代品。

PhantomJS 的现代替代品:

  1. Headless Chrome/Chromium:这是目前最主流的方案,它通过 selenium 库来驱动,是功能最强大、兼容性最好的选择。
  2. Headless Firefox:同样通过 selenium 库驱动,是另一个优秀的开源选择。
  3. Playwright:由微软开发的新一代自动化工具,性能优异,支持 Chromium, Firefox, 和 WebKit。

尽管 PhantomJS 已废弃,但如果你需要维护旧项目或在特定环境中使用,了解如何调用它仍然是有价值的,下面我们详细介绍。


使用 Selenium 库(最常用)

这是最经典、最主流的方法,Selenium 是一个用于 Web 应用程序测试的工具,它可以模拟用户在浏览器上的操作,通过 Selenium,你可以用 Python 代码来驱动 PhantomJS 浏览器。

步骤 1:安装 Selenium

你需要安装 Selenium 库。

pip install selenium

步骤 2:下载 PhantomJS

Selenium 本身不包含 PhantomJS 浏览器,你需要单独下载它。

  1. 访问 PhantomJS 官方下载页面:https://phantomjs.org/download.html
  2. 根据你的操作系统选择对应的版本(Windows, macOS, Linux)。
  3. 下载后,解压压缩包,你会得到一个可执行文件 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_profilesource ~/.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()

这个方案是当前业界最稳定、最可靠的选择。

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