- 推荐方案:使用
selenium+Chrome无头模式,这是目前业界标准,更稳定、更安全。 - 传统方案:使用
selenium+PhantomJS(不推荐,仅作了解和参考)。
推荐使用 Selenium + Chrome 无头模式
这是目前最主流、最可靠的方法,我们将使用 selenium 库来控制一个无头 Chrome 浏览器。

安装必要的库
你需要安装 selenium 和 webdriver-manager。webdriver-manager 会自动帮你下载和管理对应 Chrome 版本的驱动,非常方便。
pip install selenium pip install webdriver-manager
Python 代码示例
下面是一个完整的例子,演示如何访问一个网站、定位登录表单、输入用户名和密码、点击登录按钮,并验证登录是否成功。
我们将以 github.com 为例,因为它是一个公开的、稳定的测试目标。
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
# --- 1. 设置 Chrome 无头模式 ---
chrome_options = Options()
# chrome_options.add_argument("--headless") # 启用无头模式
chrome_options.add_argument("--disable-gpu") # 无头模式通常需要禁用GPU
chrome_options.add_argument("--window-size=1920,1080") # 设置窗口大小,避免某些元素被遮挡
# --- 2. 自动安装并配置 WebDriver ---
# 使用 webdriver-manager 自动下载和管理 chromedriver
service = Service(ChromeDriverManager().install())
# --- 3. 初始化 WebDriver ---
driver = webdriver.Chrome(service=service, options=chrome_options)
try:
# --- 4. 打开目标网站 ---
print("正在打开 GitHub 登录页面...")
driver.get("https://github.com/login")
# 等待页面加载,确保元素出现
time.sleep(2) # 简单等待,实际项目中最好使用显式等待
# --- 5. 定位并填写用户名 ---
# 使用 XPath 定位用户名输入框
username_input = driver.find_element(By.XPATH, '//*[@id="login_field"]')
username_input.send_keys("your_github_username") # 替换成你的用户名
# --- 6. 定位并填写密码 ---
# 使用 XPath 定位密码输入框
password_input = driver.find_element(By.XPATH, '//*[@id="password"]')
password_input.send_keys("your_github_password") # 替换成你的密码
# --- 7. 定位并点击登录按钮 ---
# 使用 XPath 定位登录按钮
login_button = driver.find_element(By.XPATH, '//input[@name="commit"]')
login_button.click()
print("已点击登录按钮。")
# --- 8. 验证登录是否成功 ---
# 等待页面跳转,并检查是否包含 "Repositories"(仓库)这个词,这通常是登录成功的标志
time.sleep(3) # 给页面一些加载时间
if "Repositories" in driver.page_source:
print("登录成功!")
# 你可以在这里进行后续操作,比如抓取数据
else:
print("登录失败,请检查用户名密码或页面是否有变化。")
finally:
# --- 9. 关闭浏览器 ---
# 无论成功与否,最后都要关闭浏览器,释放资源
print("正在关闭浏览器...")
driver.quit()
代码关键点解析
Options()和add_argument: 用于配置 Chrome 浏览器。--headless是关键,它让 Chrome 在后台运行,不显示图形界面。--window-size可以避免因为窗口太小导致元素找不到的问题。Service(ChromeDriverManager().install()): 这是webdriver-manager的核心功能,它会自动检测你的 Chrome 版本,下载并配置好正确的chromedriver,你无需手动下载和配置路径。webdriver.Chrome(...): 初始化一个 Chrome 浏览器实例。driver.get(url): 打开指定 URL。- *`driver.find_element(By., "selector")`**: 定位页面元素。
By.XPATH: 使用 XPath 选择器,非常强大和灵活。By.ID: 通过元素的id属性定位。By.CSS_SELECTOR: 通过 CSS 选择器定位,通常比 XPath 更简洁。By.NAME: 通过元素的name属性定位。
- **`.send_keys(keys)``: 在输入框中输入文本。
- **`.click()``: 点击元素。
driver.page_source: 获取当前页面的完整 HTML 源代码,可用于验证登录状态。driver.quit(): 非常重要! 关闭浏览器并结束 WebDriver 会话,释放所有资源,最好放在finally块中,确保无论如何都会执行。
传统方法(Selenium + PhantomJS - 不推荐)
如果你因为某些特殊原因必须使用 PhantomJS,以下是实现方法。请务必注意其安全风险和维护状态。

安装必要的库
pip install selenium
你需要手动下载 PhantomJS 并将其路径添加到系统环境变量 PATH 中,或者在代码中指定其完整路径。
Python 代码示例
代码结构与 Chrome 方案非常相似,只是 WebDriver 的初始化方式不同。
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
# --- 1. 指定 PhantomJS 的路径 ---
# 确保 phantomjs.exe (Windows) 或 phantomjs (Linux/Mac) 在你的系统 PATH 中,
# 或者在这里提供完整的可执行文件路径。
# PHANTOMJS_PATH = 'C:/path/to/your/phantomjs.exe'
PHANTOMJS_PATH = 'phantomjs' # 如果在 PATH 中,直接写 'phantomjs'
# --- 2. 初始化 WebDriver ---
# 使用 Service 对象来指定驱动路径(新版本selenium推荐方式)
# 如果是旧版本,可以直接 driver = webdriver.PhantomJS(executable_path=PHANTOMJS_PATH)
driver = webdriver.PhantomJS(executable_path=PHANTOMJS_PATH)
try:
# --- 3. 打开目标网站 ---
print("正在使用 PhantomJS 打开 GitHub 登录页面...")
driver.get("https://github.com/login")
# PhantomJS 没有视觉界面,所以等待时间很重要
time.sleep(3)
# --- 4. 定位并填写表单 ---
# 注意:PhantomJS 对现代 JavaScript 的支持可能不如 Chrome,如果网站有复杂的动态加载,可能会失败。
username_input = driver.find_element(By.XPATH, '//*[@id="login_field"]')
username_input.send_keys("your_github_username")
password_input = driver.find_element(By.XPATH, '//*[@id="password"]')
password_input.send_keys("your_github_password")
login_button = driver.find_element(By.XPATH, '//input[@name="commit"]')
login_button.click()
print("已点击登录按钮。")
# --- 5. 验证登录 ---
time.sleep(3)
if "Repositories" in driver.page_source:
print("PhantomJS 登录成功!")
else:
print("PhantomJS 登录失败。")
finally:
# --- 6. 关闭浏览器 ---
print("正在关闭 PhantomJS...")
driver.quit()
总结与对比
| 特性 | Selenium + Chrome (推荐) | Selenium + PhantomJS (不推荐) |
|---|---|---|
| 维护状态 | 活跃,由 Google 和社区持续维护 | 已停止维护 (2025年),存在安全漏洞 |
| 功能 | 支持 Web 标准的所有新特性,JavaScript 执行引擎强大 | JavaScript 支持较旧,可能无法处理现代网站的复杂交互 |
| 调试 | 非常方便,可以轻松切换到有头模式 (--headless 去掉) 来查看浏览器操作过程,定位问题。 |
极其困难,无图形界面,无法看到页面加载和渲染过程,调试是噩梦。 |
| 安装 | webdriver-manager 自动处理驱动,非常简单。 |
需要手动下载并配置 phantomjs 可执行文件。 |
| 性能 | 稍慢,但稳定可靠。 | 曾经很快,但现已落后,且可能有未知的性能问题。 |
| 未来 | 自动化测试和爬虫的未来。 | 已被时代淘汰。 |
请毫不犹豫地选择 Selenium + Chrome 无头模式,它能为你提供一个更稳定、更安全、更易于维护和调试的自动化环境,PhantomJS 只存在于历史文档中,除非你在维护一个非常古老的项目,否则不应在新项目中使用它。
