You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中Selenium搭配代理无法获取页面内容的问题排查

问题概述

这段PHP代码通过Selenium ChromeDriver借助代理服务器获取网页内容,已通过CURL确认代理服务器可用,但代码执行后返回空页面源码,页面截图也为空,无法获取目标页面内容,且全程无报错信息。

原代码如下:

<?php

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

$proxyAddress = 'user:password@127.0.0.1:49001';
$capabilities = DesiredCapabilities::chrome();
// Disable accepting SSL certificates
$capabilities->setCapability(WebDriverCapabilityType::ACCEPT_SSL_CERTS, true);
// Create an instance of ChromeOptions:
$chromeOptions = new ChromeOptions();
$chromeOptions->addArguments(['--headless', '--no-sandbox', '--disable-gpu', '--proxy-server=http://' . $proxyAddress]);

$chromeOptions->setExperimentalOption('w3c', true);
$capabilities->setCapability(ChromeOptions::CAPABILITY, $chromeOptions);

$driver = RemoteWebDriver::create('http://127.0.0.1:9515', $capabilities);

$driver->get("https://site.....");
echo $driver->getPageSource();

$driver->takeScreenshot('/path/..../screen_123.jpg');

$driver->quit();
排查与解决方案

1. 修复代理认证格式问题

Chrome的--proxy-server参数不支持直接在地址中嵌入用户名和密码,需通过--proxy-auth参数单独配置认证信息:

  • 拆分代理地址中的认证部分与IP端口部分
  • 添加--proxy-auth=user:password到Chrome启动参数列表

2. 添加页面加载等待

直接调用get()后立即获取源码,可能页面还未完成渲染(尤其是动态内容页面),需添加显式等待:

  • 使用WebDriverWait等待核心元素加载完成,或等待文档进入就绪状态

3. 优化Headless模式参数

部分网站会检测Headless浏览器并返回空内容,添加模拟正常浏览器的参数:

  • 设置真实的--user-agent字符串
  • 添加窗口大小参数--window-size=1920,1080
  • 优先使用新版Headless模式--headless=new,行为更接近正常Chrome

4. 验证代理生效状态

先访问可显示当前IP的页面(如http://httpbin.org/ip),确认Chrome是否正确使用代理IP

5. 排查隐藏错误

开启ChromeDriver日志功能,查看是否有未抛出的异常:

  • 创建RemoteWebDriver时配置日志输出,或查看Chrome控制台的错误信息
修改后的示例代码
<?php

use Facebook\WebDriver\Chrome\ChromeOptions;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\Remote\WebDriverCapabilityType;
use Facebook\WebDriver\WebDriverWait;
use Facebook\WebDriver\WebDriverExpectedCondition;

// 拆分代理认证与地址信息
$proxyUser = 'user';
$proxyPass = 'password';
$proxyHostPort = '127.0.0.1:49001';

$capabilities = DesiredCapabilities::chrome();
$capabilities->setCapability(WebDriverCapabilityType::ACCEPT_SSL_CERTS, true);

$chromeOptions = new ChromeOptions();
$chromeOptions->addArguments([
    '--headless=new',
    '--no-sandbox',
    '--disable-gpu',
    '--proxy-server=http://' . $proxyHostPort,
    '--proxy-auth=' . $proxyUser . ':' . $proxyPass,
    '--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
    '--window-size=1920,1080'
]);

$chromeOptions->setExperimentalOption('w3c', true);
$capabilities->setCapability(ChromeOptions::CAPABILITY, $chromeOptions);

$driver = RemoteWebDriver::create('http://127.0.0.1:9515', $capabilities);

// 访问目标页面
$driver->get("https://site.....");

// 显式等待页面核心元素加载完成
$wait = new WebDriverWait($driver, 10);
$wait->until(WebDriverExpectedCondition::presenceOfElementLocated(\Facebook\WebDriver\WebDriverBy::tagName('body')));

// 获取并输出页面源码
echo $driver->getPageSource();

$driver->takeScreenshot('/path/..../screen_123.jpg');

$driver->quit();

内容的提问来源于stack exchange,提问作者User

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 03:50:01