如何用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,封装得很友好:
步骤:
- 先安装Node.js和Puppeteer(
npm install puppeteer) - 安装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
相关产品推荐
相关产品推荐

