Ubuntu寶塔下使用PHP WebDriver獲取網頁源碼教程(Selenium + Chrome + Xvfb)

在 Ubuntu 服務器中,如果已經搭建好了 PHP 環境,但又希望像瀏覽器一樣打開網頁、執行前端腳本並獲取最終源碼,那麼使用 PHP WebDriver + Selenium + Google Chrome + Xvfb 是一種非常實用的解決方案。

本教程將詳細介紹如何在 Ubuntu 寶塔面板 環境下,使用 PHP WebDriver 獲取網頁源碼,並給出完整可運行的 PHP 示例代碼,適合需要進行頁面渲染抓取、調試網頁內容、服務器端獲取動態頁面源碼的場景。

一、教程目標

通過本教程,可以實現以下功能:

  • 在 Ubuntu 服務器中通過 PHP 調用瀏覽器
  • 使用 Selenium 控制 Google Chrome 打開指定網頁
  • 等待頁面加載完成後獲取完整 HTML 源碼
  • 將網頁源碼直接輸出,便於後續採集、分析或調試

二、適用環境

本教程適用於以下環境:

  • Ubuntu 服務器
  • 寶塔面板
  • 已安裝 PHP
  • 希望通過 PHP 獲取動態網頁源碼

由於大多數服務器沒有圖形桌面環境,Chrome 在非無頭模式下無法直接啟動,所以這裡會藉助 Xvfb 虛擬顯示環境 來運行瀏覽器。

三、整體原理

整個方案的運行流程如下:

  1. 使用 Xvfb 提供虛擬顯示
  2. 使用 Selenium Server 負責接收 WebDriver 控制請求
  3. Google Chrome 實際打開網頁
  4. 通過 PHP WebDriver 連接 Selenium
  5. 訪問目標網址並獲取頁面源碼

四、安裝 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,可以實現服務器端瀏覽器渲染並獲取網頁源碼的需求。

  1. 安裝 Java
  2. 安裝 Google Chrome
  3. 安裝並啟動 Xvfb
  4. 安裝並啟動 Selenium Server
  5. 通過 Composer 安裝 php-webdriver/webdriver
  6. 使用 PHP 代碼打開網頁並獲取源碼

如果需要處理動態網頁、需要瀏覽器執行腳本後的最終 HTML,那麼這種方法通常比傳統的 PHP 請求方式更適合。

發布者:彬彬筆記,轉載請註明出處:https://www.binbinbiji.com/zh-hant/jianzhanjiaoliu/3801.html

(0)
彬彬筆記彬彬筆記
上一篇 2026年3月5日 21:57
下一篇 2020年3月19日 17:27

相關推薦

發表回復

登錄後才能評論
蜀ICP備14017386號-13