PHP cURL获取页面DOM不完整,无法提取评论内容的问题求助
问题原因
核心问题是页面内容由JavaScript动态渲染:
- cURL仅能获取服务器返回的原始HTML源码,不会执行页面中的JavaScript;
- 浏览器开发者工具中看到的
<global>标签内容,是浏览器执行JS后动态插入DOM的,因此cURL拿到的原始HTML里该标签为空。
解决方案1:直接调用评论数据API(推荐)
动态渲染的评论内容通常来自后端API,可通过浏览器抓包获取接口信息:
- 打开目标页面,启动浏览器开发者工具的「Network」面板;
- 刷新页面,筛选「XHR/Fetch」请求,找到包含评论数据的接口(通常带有
reviews/feedback等关键词); - 复制接口的URL、请求头和参数,用cURL直接请求接口,获取结构化JSON数据,无需解析HTML。
示例代码(以模拟抓包到的API为例,实际需以你抓包结果为准):
$apiUrl = 'https://www.feefo.com/api/feedback?businessId=firebrand-promotions&displayFeedbackType=SERVICE&timeFrame=YEAR'; $curli = curl_init(); curl_setopt_array($curli, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_URL => $apiUrl, CURLOPT_HTTPHEADER => [ 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36', 'Accept: application/json' ] ]); $apiResult = curl_exec($curli); $reviews = json_decode($apiResult, true); // 处理评论数据 print_r($reviews);
解决方案2:使用支持JS渲染的无头浏览器
若无法找到API或API有反爬限制,可通过无头浏览器模拟浏览器执行JS,获取渲染后的完整HTML。
示例:使用spatie/browsershot(PHP包)
- 安装依赖:
composer require spatie/browsershot
- 确保服务器已安装Chrome/Chromium和Node.js(该包依赖Puppeteer);
- 代码示例:
use Spatie\Browsershot\Browsershot; $url = 'https://www.feefo.com/en-US/reviews/firebrand-promotions?displayFeedbackType=SERVICE&timeFrame=YEAR'; // 获取渲染完成后的HTML $html = Browsershot::url($url) ->userAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36') ->waitForNetworkIdle() // 等待所有网络请求完成,确保内容加载完毕 ->html(); // 解析HTML获取目标内容 $dom = new DOMDocument(); @$dom->loadHTML($html); $xmlPath = new DOMXPath($dom); $reviews = $xmlPath->query('//global'); // 遍历输出结果 foreach ($reviews as $review) { echo $dom->saveHTML($review); }
内容的提问来源于stack exchange,提问作者Chabi_Browny
相关产品推荐
相关产品推荐

