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

如何用PHP抓取通过AJAX动态渲染数据的网页?附初始爬虫代码

用PHP抓取AJAX渲染页面的解决方案

当然可以!处理AJAX渲染的页面是爬虫开发中很常见的场景,针对PHP,有几种靠谱的方案,我给你详细说说:

1. 直接调用AJAX接口(最推荐、高效)

很多网站的AJAX数据其实是通过后台API接口返回的,你完全可以跳过前端页面,直接请求这些接口拿到原始数据(通常是JSON格式),这比抓取渲染后的页面再解析要高效得多。

操作步骤:

  • 打开目标页面,打开浏览器开发者工具(F12),切换到Network面板,勾选XHR/Fetch标签
  • 刷新页面,观察加载的请求,找到返回你需要数据的那个接口(看Response里的内容)
  • 复制这个接口的URL,然后在PHP里用cURL或者file_get_contents模拟请求,注意要带上必要的请求头(比如User-Agent、Cookie、X-Requested-With这些,很多接口会验证这些参数)

举个简单的cURL示例:

$url = "找到的AJAX接口URL";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
    'X-Requested-With: XMLHttpRequest' // 有些接口会验证这个头
]);
$response = curl_exec($ch);
curl_close($ch);

// 解析JSON数据
$data = json_decode($response, true);

2. 使用无头浏览器(处理复杂JS渲染场景)

如果网站的AJAX逻辑复杂,或者接口加密难以直接调用,那就用无头浏览器模拟真实浏览器的行为,让它加载页面并执行JavaScript,等AJAX内容渲染完成后再抓取页面。

PHP里最方便的工具是spatie/browsershot,它基于Node.js的Puppeteer,封装得很友好:

步骤:

  1. 先安装Node.js和Puppeteer(npm install puppeteer)
  2. 安装PHP包:composer require spatie/browsershot

示例代码:

use Spatie\Browsershot\Browsershot;

// 加载目标页面,等待网络空闲确保AJAX加载完成
$html = Browsershot::url('https://www.yocale.com/Search?latitude=29.748093&longitude=-95.37127699999996')
    ->waitUntilNetworkIdle() // 等待所有请求完成
    ->waitForSelector('.target-element') // 也可以等待特定元素出现,更精准
    ->bodyHtml();

// 现在$html就是渲染完成后的页面内容,你可以继续解析

3. 使用Symfony Panther(PHP原生无头浏览器方案)

如果你更倾向于纯PHP生态的工具,可以试试Symfony Panther,它基于ChromeDriver,能模拟浏览器执行JS:

安装:

composer require symfony/panther

示例代码:

use Symfony\Component\Panther\Client;

// 创建Chrome客户端
$client = Client::createChromeClient();
// 请求目标页面
$crawler = $client->request('GET', 'https://www.yocale.com/Search?latitude=29.748093&longitude=-95.37127699999996');

// 等待AJAX加载的元素出现
$client->waitFor('.some-ajax-loaded-element');

// 获取渲染后的完整HTML
$html = $crawler->html();

给你初始代码的小建议

你原来用file_get_contents只能获取页面的静态HTML,无法执行JavaScript,所以抓不到AJAX渲染的内容。上面的方案都能解决这个问题,优先试试第一种直接调用接口的方式,效率最高,也最不容易被反爬。

另外,注意不要过于频繁请求网站,最好加上请求间隔,伪装好User-Agent,避免被封IP哦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:13:00