如何用PHP结合无头浏览器实现类似Selenium的Cookie抓取?
问题根源
你用curl只能获取服务器端通过HTTP响应头Set-Cookie设置的Cookie,这类Cookie是后端(比如PHP)生成并发送给客户端的。而JavaScript生成的Cookie是在浏览器环境中通过document.cookie设置的,curl作为纯HTTP请求工具,不会执行页面中的JavaScript,自然无法捕获这类客户端生成的Cookie。
PHP替代Selenium的解决方案
要获取JS生成的Cookie,必须使用能模拟完整浏览器环境、执行JavaScript的工具,以下是两种可行的PHP方案:
1. 使用php-webdriver(Selenium的PHP客户端)
php-webdriver是Selenium官方的PHP绑定,能调用ChromeDriver、GeckoDriver等浏览器驱动,模拟真实浏览器的行为,从而获取包括JS生成在内的所有Cookie。
示例代码:
require_once('vendor/autoload.php'); use Facebook\WebDriver\Remote\DesiredCapabilities; use Facebook\WebDriver\Remote\RemoteWebDriver; use Facebook\WebDriver\Chrome\ChromeOptions; // 初始化ChromeDriver(需提前安装ChromeDriver并启动,或指定本地路径) $options = new ChromeOptions(); $options->addArguments(['--headless']); // 无头模式,不显示浏览器窗口 $capabilities = DesiredCapabilities::chrome()->setCapability(ChromeOptions::CAPABILITY, $options); $driver = RemoteWebDriver::create('http://localhost:9515', $capabilities); // 访问目标页面 $driver->get('https://www.google.com/'); // 获取所有Cookie(包括JS生成的) $cookies = $driver->manage()->getCookies(); // 格式化输出 $cookieArray = []; foreach ($cookies as $cookie) { $cookieArray[$cookie->getName()] = $cookie->getValue(); } var_dump($cookieArray); // 关闭浏览器 $driver->quit();
2. 使用Puppeteer-PHP(无头浏览器工具)
Puppeteer-PHP是Node.js Puppeteer的PHP封装,能直接控制无头Chrome/Chromium,支持执行JS、获取Cookie等操作,无需额外启动Selenium服务。
示例代码:
require_once('vendor/autoload.php'); use Nesk\Puphpeteer\Puppeteer; $puppeteer = new Puppeteer(); $browser = $puppeteer->launch([ 'headless' => true, // 无头模式 ]); $page = $browser->newPage(); $page->goto('https://www.google.com/'); // 获取所有Cookie $cookies = $page->cookies(); // 格式化输出 $cookieArray = []; foreach ($cookies as $cookie) { $cookieArray[$cookie['name']] = $cookie['value']; } var_dump($cookieArray); // 关闭浏览器 $browser->close();
你原来的curl脚本(仅获取服务器端Cookie)
$ch = curl_init('https://www.google.com/'); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 1); $result = curl_exec($ch); preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $result, $matches); $cookies = array(); foreach($matches[1] as $item) { parse_str($item, $cookie); $cookies = array_merge($cookies, $cookie); } var_dump($cookies);
内容的提问来源于stack exchange,提问作者cookie-newb
相关产品推荐
相关产品推荐

