杰瑞科技汇

PhantomJS爬虫如何用Python实现?

我必须强调一个非常重要的现状

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

⚠️ 重要警告:PhantomJS 已被废弃

2025 年 8 月起,PhantomJS 的官方开发团队已经宣布停止维护,这意味着它不再更新,可能存在未修复的安全漏洞,并且无法兼容最新的网页技术(如新的 JavaScript API、CSS 特性等)。

强烈建议你不要在新项目中使用 PhantomJS。

为什么还要讲它呢?

  1. 学习目的:理解“无头浏览器”(Headless Browser)的工作原理和爬虫的进阶思想。
  2. 维护旧项目:你可能需要维护或修改一个已经使用 PhantomJS 的旧项目。
  3. 替代方案:了解 PhantomJS 的优缺点后,你就能更好地理解为什么现代的无头浏览器(如 PlaywrightSelenium 配合 Chrome/Firefox)是更好的选择。

PhantomJS 是什么?

PhantomJS 是一个基于 WebKit 的无头浏览器,你可以把它想象成一个没有图形界面的“幽灵版”Chrome 或 Safari。

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

它的核心特点:

  • 无头:没有用户界面,在后台运行,不弹出任何窗口。
  • JavaScript 支持:可以像真实浏览器一样执行 JavaScript、渲染网页、处理 AJAX 请求。
  • 自动化:可以通过脚本控制,模拟用户点击、输入、滚动等操作。

Python 爬虫中使用 PhantomJS 的基本原理

Python 并不直接控制 PhantomJS,我们通常使用一个叫做 Selenium 的自动化测试工具作为桥梁。

工作流程如下:

  1. Python 脚本启动 Selenium。
  2. Selenium 启动 PhantomJS 浏览器进程。
  3. Python 通过 Selenium 发送指令(如:打开某个网址、查找元素、点击按钮)。
  4. PhantomJS 执行指令,加载并渲染网页。
  5. PhantomJS 将渲染后的页面源代码(或特定数据)返回给 Selenium。
  6. Selenium 将数据传递给 Python 脚本进行处理。
  7. 脚本结束后,Selenium 关闭 PhantomJS 进程。

环境搭建

在开始之前,你需要安装以下软件和库:

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

安装 PhantomJS

由于 PhantomJS 已被废弃,你无法从官网直接下载最新版,你需要从一些镜像站点或旧版本存档中下载。

Windows:

  1. 访问 PhantomJS 下载页面
  2. 选择 Windows 版本(phantomjs-2.1.1-windows.zip)。
  3. 下载后解压到一个固定路径,C:\phantomjs
  4. 最重要的一步:将 C:\phantomjs\bin 添加到系统的 环境变量 Path 中,这样你才能在命令行中直接运行 phantomjs 命令。

macOS / Linux:

# 使用 Homebrew (推荐)
brew install phantomjs
# Homebrew 源已移除,可以尝试第三方 tap
brew tap homebrew/cask
brew install --cask phantomjs
# 或者手动下载并配置环境变量

安装 Python 库

你需要安装 selenium 库,以及一个用于 PhantomJS 的驱动(但通常 selenium 会自动处理)。

pip install selenium

Python + PhantomJS 爬虫实例

下面我们通过一个简单的例子来演示如何使用它们爬取一个动态加载的网页。

示例:爬取今日头条的热搜榜

今日头条的热搜榜是通过 JavaScript 动态加载的,传统的 requests 库无法直接获取到最终数据,非常适合用 PhantomJS 来演示。

目标网站: https://www.toutiao.com/hotboard/

步骤:

  1. 访问 URL。
  2. 等待 JavaScript 渲染完成。
  3. 提取热搜榜的标题和链接。
  4. 关闭浏览器。

代码实现 (phantomjs_crawler.py):

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def toutiao_crawler():
    """
    使用 PhantomJS 爬取今日头条热搜榜
    """
    # 1. 指定 PhantomJS 的可执行文件路径
    # 如果你已经将 phantomjs 添加到环境变量,可以直接写 'phantomjs'
    # 否则需要写上完整路径, 'C:/phantomjs/bin/phantomjs.exe'
    executable_path = 'phantomjs'
    # 2. 创建一个 PhantomJS 的 WebDriver 实例
    # service_args 参数可以用来配置 PhantomJS,例如禁用图片加载以加快速度
    service_args = [
        '--load-images=no',  # 不加载图片
        '--disk-cache=true'  # 开启缓存
    ]
    driver = webdriver.PhantomJS(executable_path=executable_path, service_args=service_args)
    try:
        # 3. 访问目标页面
        print("正在访问今日头条...")
        driver.get("https://www.toutiao.com/hotboard/")
        # 4. 等待页面元素加载完成
        # 这是非常关键的一步,因为页面是动态加载的
        # 我们等待 class 为 "HotItem-title" 的元素出现
        # WebDriverWait 会每隔一段时间检查一次,直到超时或条件满足
        wait = WebDriverWait(driver, 10)  # 最多等待10秒
        wait.until(EC.presence_of_element_located((By.CLASS_NAME, "HotItem-title")))
        print("页面加载完成,开始提取数据...")
        # 5. 定义要爬取的数据
        # 热搜榜的每个条目都在一个 class 为 "HotItem" 的 div 中
        hot_items = driver.find_elements(By.CLASS_NAME, "HotItem")
        hot_data = []
        for item in hot_items:
            # 标题在 class 为 "HotItem-title" 的 a 标签里
            title_element = item.find_element(By.CLASS_NAME, "HotItem-title")
            title = title_element.text
            link = title_element.get_attribute("href")
            # 热度在 class 为 "HotItem-value" 的 div 里
            heat_element = item.find_element(By.CLASS_NAME, "HotItem-value")
            heat = heat_element.text
            hot_data.append({
                "title": title,
                "link": link,
                "heat": heat
            })
        # 6. 打印结果
        for data in hot_data:
            print(f"标题: {data['title']}, 热度: {data['heat']}")
    except Exception as e:
        print(f"爬取过程中发生错误: {e}")
    finally:
        # 7. 关闭浏览器,释放资源
        print("爬取结束,关闭浏览器。")
        driver.quit()
if __name__ == "__main__":
    toutiao_crawler()

如何运行:

  1. 确保你已经安装好 PhantomJS 并配置好环境变量。
  2. 将上述代码保存为 phantomjs_crawler.py
  3. 在终端运行:python phantomjs_crawler.py

你会看到终端依次输出访问信息、加载信息和最终爬取到的热搜数据。


PhantomJS 的优缺点

优点 (与 requests 相比)

  • 处理动态内容:能完美解决由 JavaScript 渲染的页面问题。
  • 模拟真实用户:可以执行点击、输入、滚动、切换标签页等复杂交互。
  • 获取完整页面:得到的是浏览器渲染后的最终 HTML,方便解析。

缺点 (与现的无头浏览器相比)

  • 已停止维护:这是最大的硬伤,安全性和兼容性无法保证。
  • 调试困难:因为没有图形界面,出错时很难直观地看到页面状态。
  • 性能问题:WebKit 引擎相对老旧,启动速度和运行效率可能不如基于 Chromium/Firefox 的新浏览器。
  • 功能有限:对现代 Web API 的支持较差。

现代替代方案:Playwright 或 Selenium + Chrome/Firefox

由于 PhantomJS 的局限性,强烈推荐使用以下现代方案,它们的工作原理和 PhantomJS + Selenium 类似,但功能更强大、更稳定。

Selenium + Chrome 无头模式

  1. 安装 Chrome 浏览器
  2. 安装 ChromeDriver:这是 Selenium 控制 Chrome 的驱动,需要你的 Chrome 版本匹配。
  3. 安装 selenium

代码示例 (只需修改驱动部分):

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加速
# ... 其他配置
driver = webdriver.Chrome(options=chrome_options)
# 后续代码与 PhantomJS 示例完全相同
driver.get("https://www.toutiao.com/hotboard/")
# ... 爬取逻辑 ...
driver.quit()

Playwright (强烈推荐)

Playwright 是微软开发的新一代自动化工具,它更现代、更稳定、更强大。

  1. 安装 Playwright:

    pip install playwright
    playwright install  # 安装浏览器驱动
  2. 代码示例:

    from playwright.sync_api import sync_playwright
    def run(playwright):
        # 启动一个无头浏览器
        browser = playwright.chromium.launch(headless=True)
        page = browser.new_page()
        # 访问页面
        page.goto("https://www.toutiao.com/hotboard/")
        # 等待元素出现
        page.wait_for_selector(".HotItem-title")
        # 使用 Playwright 强大的选择器提取数据
        items = page.query_selector_all(".HotItem")
        hot_data = []
        for item in items:
            title = item.query_selector(".HotItem-title").inner_text()
            heat = item.query_selector(".HotItem-value").inner_text()
            hot_data.append({"title": title, "heat": heat})
        for data in hot_data:
            print(f"标题: {data['title']}, 热度: {data['heat']}")
        browser.close()
    with sync_playwright() as playwright:
        run(playwright)
特性 PhantomJS Selenium + Chrome/Firefox Playwright
状态 已废弃 活跃,行业标准 活跃,微软出品,未来趋势
浏览器内核 WebKit (旧) Chromium / Firefox Chromium / Firefox / WebKit
易用性 简单 较简单 非常简单,API 更优雅
功能 基础 强大 鶴立鸡群,支持多浏览器、自动等待、拦截网络请求等
推荐度 不推荐 推荐 强烈推荐

请将 PhantomJS 作为了解无头浏览器历史的一个学习案例,在所有新的爬虫或自动化项目中,请直接选择 PlaywrightSelenium + Chrome/Firefox,它们能让你走得更远、更稳。

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