在 Ubuntu 服务器中,如果已经搭建好了 PHP 环境,但又希望像浏览器一样打开网页、执行前端脚本并获取最终源码,那么使用 PHP WebDriver + Selenium + Google Chrome + Xvfb 是一种非常实用的解决方案。
本教程将详细介绍如何在 Ubuntu 宝塔面板 环境下,使用 PHP WebDriver 获取网页源码,并给出完整可运行的 PHP 示例代码,适合需要进行页面渲染抓取、调试网页内容、服务器端获取动态页面源码的场景。
一、教程目标
通过本教程,可以实现以下功能:
- 在 Ubuntu 服务器中通过 PHP 调用浏览器
- 使用 Selenium 控制 Google Chrome 打开指定网页
- 等待页面加载完成后获取完整 HTML 源码
- 将网页源码直接输出,便于后续采集、分析或调试
二、适用环境
本教程适用于以下环境:
- Ubuntu 服务器
- 宝塔面板
- 已安装 PHP
- 希望通过 PHP 获取动态网页源码
由于大多数服务器没有图形桌面环境,Chrome 在非无头模式下无法直接启动,所以这里会借助 Xvfb 虚拟显示环境 来运行浏览器。
三、整体原理
整个方案的运行流程如下:
- 使用 Xvfb 提供虚拟显示
- 使用 Selenium Server 负责接收 WebDriver 控制请求
- 由 Google Chrome 实际打开网页
- 通过 PHP WebDriver 连接 Selenium
- 访问目标网址并获取页面源码
四、安装 Java
Selenium Server 依赖 Java 运行,因此需要先安装 Java 环境:
sudo apt update
sudo apt install -y default-jre
java -version
如果能够正常输出 Java 版本信息,说明安装成功。
五、安装 Google Chrome
如果服务器尚未安装 Chrome,可以执行以下命令:
cd /tmp
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo apt install -y ./google-chrome-stable_current_amd64.deb
google-chrome --version
六、安装 Xvfb 虚拟显示环境
Ubuntu 服务器通常没有桌面环境,而 Chrome 在非无头模式下需要显示环境,因此需要安装 Xvfb。
sudo apt install -y xvfb
安装完成后,启动一个虚拟显示:
Xvfb :99 -screen 0 1280x900x24 &
export DISPLAY=:99
检查 Xvfb 是否正常启动:
echo $DISPLAY
ps -ef | grep Xvfb
七、安装 Selenium Server
接下来下载并启动 Selenium Server:
cd /www/server
wget https://github.com/SeleniumHQ/selenium/releases/download/selenium-4.31.0/selenium-server-4.31.0.jar
使用以下命令启动 Selenium,并让其继承虚拟显示环境:
pkill -f selenium-server
DISPLAY=:99 nohup java -jar /www/server/selenium-server-4.31.0.jar standalone > /www/server/selenium.log 2>&1 &
检查 Selenium 是否正常监听:
ss -lntp | grep 4444
curl http://127.0.0.1:4444/status
八、安装 PHP WebDriver 依赖
进入网站项目目录,通过 Composer 安装 PHP WebDriver:
cd /www/wwwroot/项目目录
composer require php-webdriver/webdriver
九、PHP 获取网页源码完整代码
下面是一份完整的 PHP 示例代码,可以直接保存为 PHP 文件使用。
<?php
require_once __DIR__ . '/vendor/autoload.php';
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Chrome\ChromeOptions;
function fetchPageContent($url)
{
$host = 'http://127.0.0.1:4444';
$driver = null;
$options = new ChromeOptions();
$options->addArguments([
'--incognito',
'--disable-gpu',
'--no-sandbox',
'--disable-dev-shm-usage',
'--disable-software-rasterizer',
'--disable-extensions',
'--lang=zh-CN',
'--window-size=1200,800',
'--start-minimized',
]);
$capabilities = DesiredCapabilities::chrome();
$capabilities->setCapability(ChromeOptions::CAPABILITY, $options);
try {
$driver = RemoteWebDriver::create($host, $capabilities, 5000, 120000);
$driver->manage()->timeouts()->pageLoadTimeout(15);
$driver->manage()->timeouts()->setScriptTimeout(15);
$driver->manage()->timeouts()->implicitlyWait(3);
$driver->get($url);
sleep(2);
return $driver->getPageSource();
} catch (\Throwable $e) {
return 'Error: ' . $e->getMessage();
} finally {
if ($driver !== null) {
try {
$driver->quit();
} catch (\Throwable $e2) {
}
}
}
}
header('Content-Type: text/plain; charset=UTF-8');
$url = 'https://www.baidu.com';
echo fetchPageContent($url);
十、代码说明
这份代码的核心作用是通过 PHP 连接 Selenium,启动 Chrome,访问指定网址,并输出页面源码。
其中 --no-sandbox、--disable-dev-shm-usage 等参数,在 Linux 服务器环境中比较常用,能够提高 Chrome 启动的稳定性。
十一、如何输出完整源码
如果希望浏览器直接显示网页源码文本,而不是把 HTML 渲染成页面,建议使用下面这一行:
header('Content-Type: text/plain; charset=UTF-8');
这样获取到什么内容,就输出什么内容,特别适合调试网页源码或查看实际返回结果。
十二、函数调用方式
封装完成后,只需要传入一个网址即可使用:
$url = 'https://example.com';
$html = fetchPageContent($url);
echo $html;
十三、常见问题
1. Chrome instance exited
这类错误通常与没有启动 Xvfb、没有设置 DISPLAY=:99,或者 Selenium 没有继承 DISPLAY 环境变量有关。
DISPLAY=:99 nohup java -jar /www/server/selenium-server-4.31.0.jar standalone > /www/server/selenium.log 2>&1 &
2. Running as root without –no-sandbox is not supported
原因是使用 root 用户启动 Chrome,但没有添加 --no-sandbox 参数。
'--no-sandbox'
3. 无法连接 Selenium
可以通过下面的命令检查 4444 端口是否正常监听:
ss -lntp | grep 4444
curl http://127.0.0.1:4444/status
4. 页面内容不完整
某些网页依赖 JavaScript 渲染,页面加载后还需要额外等待,可以将等待时间适当调大。
sleep(5);
十四、总结
在 Ubuntu 宝塔环境中,使用 PHP WebDriver + Selenium + Chrome + Xvfb,可以实现服务器端浏览器渲染并获取网页源码的需求。
- 安装 Java
- 安装 Google Chrome
- 安装并启动 Xvfb
- 安装并启动 Selenium Server
- 通过 Composer 安装 php-webdriver/webdriver
- 使用 PHP 代码打开网页并获取源码
如果需要处理动态网页、需要浏览器执行脚本后的最终 HTML,那么这种方法通常比传统的 PHP 请求方式更适合。
发布者:彬彬笔记,转载请注明出处:https://www.binbinbiji.com/jianzhanjiaoliu/3801.html