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

如何通过程序(优先PHP)获取JavaScript渲染的动态表格内容?

解决方案

你遇到的是JS动态渲染内容的抓取问题,传统curl只能获取初始静态HTML,不会执行页面内的JavaScript逻辑,因此拿不到异步加载的表格数据。优先PHP的实现方案可按优先级选择以下两种:

方案1:直接抓取数据接口(优先推荐)

这是效率最高、维护成本最低的方案:

  • 打开Chrome/Firefox浏览器,按F12调出开发者工具,切换到「网络」面板,筛选「XHR/ Fetch」类型的请求
  • 刷新目标页面,在请求列表中查找返回表格数据的接口,这类接口返回内容一般为JSON格式,包含完整的表格行数据
  • 拿到接口地址后直接用原有curl_exec逻辑请求该接口即可,解析返回的JSON就能直接拿到所需数据,无需处理页面渲染逻辑

方案2:使用PHP无头浏览器渲染页面后提取数据

如果接口有加密、鉴权等无法直接调用的情况,可使用支持JS渲染的无头浏览器工具加载完整页面后提取数据,推荐使用Symfony Panther组件:

  1. 首先通过Composer安装依赖:
composer require symfony/panther
  1. 参考代码示例:
<?php
require __DIR__.'/vendor/autoload.php';

use Symfony\Component\Panther\Client;

// 初始化无头Chrome客户端
$client = Client::createChromeClient();
// 访问目标页面
$client->request('GET', 'http://www.pla.co.uk/hydrographics/ltoverview.cfm');
// 等待表格动态内容加载完成,可替换为目标表格的实际选择器
$client->waitFor('table tbody tr');
// 获取渲染完成的页面 crawler 对象
$crawler = $client->getCrawler();

$tableData = [];
// 遍历表格行提取数据
$crawler->filter('table tbody tr')->each(function ($trNode) use (&$tableData) {
    $row = [];
    $trNode->filter('td')->each(function ($tdNode) use (&$row) {
        $row[] = trim($tdNode->text());
    });
    if (!empty($row)) {
        $tableData[] = $row;
    }
});

// 此处接入你原有筛选逻辑处理$tableData即可
print_r($tableData);
?>

注意事项

  • 请确保你仍持有对方网站的抓取授权,遵守目标站点的使用规则与robots协议
  • 可适当降低请求频率、增加请求延时,避免触发目标站点的反爬策略导致IP被封禁
  • 若目标站点有反爬校验,可在请求时补充正常浏览器的User-Agent、Cookie等头信息

备选方案

如果PHP方案落地有障碍,也可以选择用Node.js Puppeteer、Python Playwright等工具抓取数据后存入公共数据库,PHP直接读取数据库获取处理后的内容即可,整体流程同样稳定可靠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 00:27:01