返回

在 php 中使用 headless chrome 抓取动态加载的数据:全面指南

php

用 headless chrome 抓取动态加载的数据

前言

在当今的网络世界中,动态加载的数据已变得无处不在。这些数据虽然重要,但可能隐藏在初始 HTML 页面中,使得传统的抓取方法无法获取。本教程将探讨如何使用 headless chrome 在 php 中访问这些请求内容,让你能够解锁这些隐藏的数据宝库。

什么是 headless chrome?

headless chrome 是一个无界面的 Chrome 浏览器,允许在没有图形用户界面 (GUI) 的情况下运行 Chrome。这使其成为自动化浏览器任务的理想选择,例如抓取数据。通过使用 php-webdriver 库,我们可以控制 headless chrome,并以编程方式模拟浏览器交互。

第 1 步:安装 php-webdriver

首先,让我们安装 php-webdriver 库:

composer require guzzle/webdriver

第 2 步:创建 headless chrome 会话

使用 WebDriver 类创建 headless chrome 会话:

$driver = WebDriver::create('chrome', [], 'http://localhost:9515');

其中 http://localhost:9515 是 headless chrome 监听的地址。

第 3 步:导航到目标 URL

导航到包含要抓取数据的网站:

$driver->get('https://example.com');

第 4 步:等待请求完成

使用 WebDriverWait 类等待请求完成:

$wait = new WebDriverWait($driver, 10);
$wait->until(
    WebDriverExpectedCondition::elementToBeClickable(
        WebDriverBy::cssSelector('body')
    )
);

这会等待页面上的元素可以点击,表明请求已完成。

第 5 步:获取请求内容

使用 NetworkConditions 类获取请求内容:

$networkConditions = $driver->manage()->getNetworkConditions();
$requests = $networkConditions->getRequests();

$requests 将包含所有已完成请求的数组。

第 6 步:过滤请求

过滤出包含所需数据的请求:

$filteredRequests = array_filter($requests, function ($request) {
    return $request->getUrl() === 'https://example.com/data.json';
});

其中 https://example.com/data.json 是包含所需数据的请求的 URL。

第 7 步:解析请求内容

解析请求内容为所需的数据:

$data = json_decode($filteredRequests[0]->getResponse()->getBody());

结论

使用 headless chrome,你可以轻松地访问动态加载的数据,从而扩展你的数据抓取能力。通过遵循这些步骤,你可以自动化此任务,节省时间和精力,同时获得更全面、更有价值的数据。

常见问题解答

  1. 我如何知道 headless chrome 是否正在运行?

    • 在终端中运行 chromedriver --version 来检查 headless chrome 是否正在运行。
  2. 为什么我的请求没有返回任何数据?

    • 确保你已正确过滤了请求。检查请求的 URL 和响应代码。
  3. 如何处理 AJAX 请求?

    • headless chrome 会自动处理 AJAX 请求。确保在等待请求完成时使用 WebDriverWait。
  4. 我可以使用 headless chrome 访问受密码保护的网站吗?

    • 是的,但你必须提供用户名和密码。使用 $driver->getCredentials()->setUsername()$driver->getCredentials()->setPassword()
  5. 如何调试 headless chrome?

    • 使用 --verbose 标志启动 headless chrome 以查看有关请求和响应的更多信息。