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

(0)
彬彬笔记彬彬笔记
上一篇 2026年3月5日 21:57
下一篇 2020年3月19日 18:05

相关推荐

发表回复

登录后才能评论
蜀ICP备14017386号-13