在 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/zh-hant/jianzhanjiaoliu/3801.html