如何获取Lidl动态加载商品页面的商品URL?
解决动态加载页面的商品URL获取问题
因为目标页面的商品是通过JavaScript动态渲染的,file_get_contents只能获取原始静态HTML,所以拿不到动态加载的内容。给你两个可行的解决方案:
方案1:直接调用商品数据的API接口
动态页面的商品数据通常来自后端API,你可以通过浏览器开发者工具找到这个接口:
- 打开目标页面,按F12打开开发者工具,切换到「Network」面板
- 刷新页面,过滤「XHR」或「Fetch」类型的请求,找到返回商品列表的API(通常返回JSON格式)
- 复制该API的请求URL和必要的请求头(比如
User-Agent、Referer等,有些接口会校验这些) - 用PHP直接请求这个API,解析JSON数据提取商品URL
示例代码(假设找到的API是对应商品列表的接口):
$apiUrl = '你找到的API接口URL'; $options = [ 'http' => [ 'header' => "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\r\n" ] ]; $context = stream_context_create($options); $jsonData = file_get_contents($apiUrl, false, $context); if ($jsonData) { $products = json_decode($jsonData, true); // 根据API返回的实际结构调整提取逻辑 foreach ($products['items'] as $product) { echo $product['pdpUrl'] . "\n"; } } else { die('请求API失败'); }
方案2:使用无头浏览器渲染页面
用可以执行JavaScript的无头浏览器(比如Chrome的无头模式)加载页面,等JS渲染完成后再提取内容。可以用PHP的第三方库spatie/browsershot实现:
- 先安装依赖:需要安装Node.js、Puppeteer,再通过Composer安装
spatie/browsershot - 编写代码渲染页面并提取内容:
示例代码:
require 'vendor/autoload.php'; use Spatie\Browsershot\Browsershot; // 渲染页面并获取JS执行后的完整HTML $html = Browsershot::url('https://www.lidl.ch/c/de-CH/wochenaktion/a10041837?channel=store&tabCode=Current_Sales_Week') ->waitUntilNetworkIdle() // 等待网络请求完成,确保商品加载完毕 ->bodyHtml(); // 解析渲染后的HTML $dom = new DOMDocument(); libxml_use_internal_errors(true); $dom->loadHTML($html); libxml_use_internal_errors(false); $xpath = new DOMXPath($dom); // 查询所有商品链接并输出 $links = $xpath->query("//a[@class='grid-box__pdp-link']"); foreach ($links as $link) { echo $link->getAttribute('href') . "\n"; }
注意:使用无头浏览器需要服务器环境支持Node.js和Puppeteer,并且可能需要配置相应的权限和资源限制。
内容的提问来源于stack exchange,提问作者xRay
相关产品推荐
相关产品推荐

