CentOS上使用PHP与Selenium结合

1. 更新系统
首先,确保您的系统是最新的:

sudo yum update -y
Bash

2.安装OpenJDK
运行以下命令来安装OpenJDK 11(这是一个常用的版本):

sudo yum install -y java-11-openjdk java-11-openjdk-devel
Bash

安装完成后,验证Java是否正确安装:

java -version
Bash

3. 安装Selenium Server
Selenium Server作为中间件,允许您通过HTTP请求控制浏览器。您需要下载Selenium Server的最新稳定版:

wget https://github.com/SeleniumHQ/selenium/releases/download/selenium-4.25.0/selenium-server-4.25.0.jar
Bash

或者,根据最新的发布版本调整URL。

4. 安装浏览器及其驱动
这里以Chrome为例:
安装Google Chrome
添加Chrome的官方仓库:

sudo tee /etc/yum.repos.d/google-chrome.repo <<EOF animation: fadeInUp 0.5s ease forwards; 
[google-chrome]
name=Google Chrome - \$basearch
baseurl=http://dl.google.com/linux/chrome/rpm/stable/\$basearch
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub
EOF
Bash

安装Google Chrome:

sudo yum install -y google-chrome-stable
google-chrome --version
Bash

安装ChromeDriver
自动下载并安装与Chrome浏览器版本匹配的
https://googlechromelabs.github.io/chrome-for-testing/?spm=a2c6h.12873639.article-detail.8.12e9278beBFbFl#stable
ChromeDriver自动匹配脚本:

CHROME_DRIVER_VERSION=$(curl -s 'https://chromedriver.storage.googleapis.com/LATEST_RELEASE')
wget "https://storage.googleapis.com/chrome-for-testing-public/${CHROME_DRIVER_VERSION}/linux64/chromedriver-linux64.zip"
unzip chromedriver-linux64.zip
cd chromedriver-linux64
sudo mv chromedriver /usr/local/bin/
sudo chmod +x /usr/local/bin/chromedriver
cd ..
rm -f chromedriver-linux64.zip
rm -rf chromedriver-linux64
chromedriver --version
Bash

5. 使用Composer安装Facebook WebDriver

composer require facebook/webdriver
Bash

6. 编写PHP脚本来使用Selenium
创建一个新的PHP文件,例如selenium_example.php,并加入以下代码:

<?php
require 'vendor/autoload.php'; // 自动加载 Composer 安装的依赖

use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Chrome\ChromeOptions;

$host = 'http://localhost:4444/wd/hub'; // Selenium 服务器的地址

// 自定义 User-Agent
$userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36';

// HTTP 代理设置(如果为空,则不使用代理)
//$httpProxy = 'http://your_http_proxy:port'; // 例如 'http://127.0.0.1:8080'

// SOCKS5 代理设置(如果为空,则不使用代理)
//$socks5Proxy = 'socks5://your_socks5_proxy:port'; // 例如 'socks5://127.0.0.1:1080'

// 隧道代理设置(假设为 SOCKS5 代理)
//$tunnelProxy = 'socks5://your_tunnel_proxy:port'; // 例如 'socks5://127.0.0.1:1080'

try {
    // 创建 Chrome 浏览器选项
    $options = new ChromeOptions();
    $options->addArguments([
        '--headless',           // 启动无头模式,即不显示浏览器窗口
        '--no-sandbox',         // 禁用沙盒模式,以避免权限问题
        '--disable-dev-shm-usage', // 禁用 /dev/shm 使用,以减少内存消耗
        '--disable-gpu',       // 禁用 GPU 加速,通常在无头模式下需要
        '--disable-extensions', // 禁用浏览器扩展
        '--disable-popup-blocking', // 禁用弹出窗口阻止
        '--disable-infobars', // 禁用信息栏
        '--disable-notifications', // 禁用通知
        '--window-size=1200x600' // 设置浏览器窗口大小,可能有助于加载速度
    ]);

    // 如果 User-Agent 不为空,则设置自定义 User-Agent
    if (!empty($userAgent)) {
        $options->addArguments(["--user-agent={$userAgent}"]);
    }

    // 设置 HTTP 代理
    if (!empty($httpProxy)) {
        $options->addArguments(["--proxy-server={$httpProxy}"]);
    }

    // 设置 SOCKS5 代理
    if (!empty($socks5Proxy)) {
        $options->addArguments(["--proxy-server={$socks5Proxy}"]);
    }

    // 设置隧道代理(如果与 SOCKS5 代理不同)
    if (!empty($tunnelProxy) && empty($socks5Proxy)) {
        $options->addArguments(["--proxy-server={$tunnelProxy}"]);
    }

    // 设置浏览器的能力
    $capabilities = DesiredCapabilities::chrome();
    $capabilities->setCapability(ChromeOptions::CAPABILITY, $options);

    // 连接到 Selenium 服务器,创建一个新的浏览器实例
    $driver = RemoteWebDriver::create($host, $capabilities);

    // 设置隐式等待时间
    //$driver->manage()->timeouts()->implicitlyWait(30); // 等待最多 30 秒以查找元素

    // 访问指定的网页
    $driver->get('https://www.qq.com'); // 访问指定的网页地址

    // 定义 cookies(如果有的话)
    $cookies = [
        //['name' => 'cookie_name1', 'value' => 'cookie_value1', 'domain' => '.qq.com'],
    ];

    // 添加 cookies(如果 cookies 不为空)
    if (!empty($cookies)) {
        foreach ($cookies as $cookie) {
            $driver->manage()->addCookie([
                'name' => $cookie['name'], // Cookie 名称
                'value' => $cookie['value'], // Cookie 值
                'domain' => $cookie['domain'] // Cookie 域名
            ]);
        }
    }

    // 重新加载页面以使 cookie 生效
    $driver->navigate()->refresh(); // 刷新页面以使 cookies 生效

    // 获取网页的完整 HTML 源码
    $pageSource = $driver->getPageSource(); // 获取网页的 HTML 源码

    // 输出网页源码
    echo $pageSource; // 打印网页源码

} catch (Exception $e) {
    // 捕获并输出异常信息
    echo "Error: " . $e->getMessage();
} finally {
    // 确保浏览器实例被关闭
    if (isset($driver)) {
        $driver->quit(); // 关闭浏览器并退出 WebDriver
    }
}

7. 启动Selenium Server
启动Selenium Server,确保它正在监听默认端口4444:

java -jar selenium-server-4.25.0.jar standalone
Bash

常见问题
1.Chrome浏览器版本与chromedriver版本不匹配

google-chrome --version
chromedriver --version
Bash

2.系统缺少了依赖库,具体缺失哪个不清楚,自查(或尝试更新系统版本)

CentOS上使用PHP与Selenium结合
https://www.byue.cc/index.php/archives/13/
本文作者 八月
发布时间 2024-09-17
许可协议 CC BY-NC-SA 4.0
发表新评论