使用simple_html_dom提取电商页面SKU时获取错误值的问题求解
你当前拿到错误SKU的核心原因是该站点的SKU属于前端动态渲染内容:curl只能获取页面初始加载的静态HTML源码,此时SKU节点的内容还没有被JavaScript逻辑替换为真实值,浏览器中看到的是JS执行完成后的最终DOM,因此二者结果不一致。另外你之前使用的选择器div#[class="product attribute sku"] div存在语法错误,#为ID选择器标识,匹配class属性不需要加该符号,不过这不是核心问题。
以下是两种可用的实现方案:
方案1:正则匹配静态JS数据(轻量高性能,无需额外工具)
该站点基于Magento2搭建,产品核心数据会提前注入到页面Script标签的全局JSON变量中,无需等待前端渲染,直接从静态源码中匹配对应字段即可,性能最高:
<?php $user_agent ='Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'; $curl = curl_init(); $link = "https://www.tradesquare.com.au/milano-decor-eden-gas-lift-bed-with-headboard-platform-storage-dark-grey-fabric-queen-dark-grey.html"; curl_setopt($curl, CURLOPT_URL, $link); curl_setopt($curl, CURLOPT_USERAGENT, $user_agent); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_HEADER, false); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); curl_setopt($curl, CURLOPT_REFERER, $link); curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); // 新增Cookie配置,规避站点反爬拦截 curl_setopt($curl, CURLOPT_COOKIEFILE, 'cookie.txt'); curl_setopt($curl, CURLOPT_COOKIEJAR, 'cookie.txt'); $str = curl_exec($curl); curl_close($curl); // 正则匹配SKU字段,无需引入simple_html_dom if (preg_match('/"sku"\s*:\s*"([a-zA-Z0-9]+)"/', $str, $matches)) { $sku = trim($matches[1]); echo $sku; } else { echo "SKU匹配失败"; } exit; ?>
方案2:无头浏览器模拟渲染(兼容性最强,适合全场景动态站点)
如果后续需要提取其他动态渲染字段,可以用无头浏览器模拟真实浏览器加载逻辑,等JS执行完成后再提取DOM内容,推荐使用chrome-php/chrome库:
- 首先通过composer安装依赖:
composer require chrome-php/chrome - 实现代码:
<?php require __DIR__ . '/vendor/autoload.php'; use HeadlessChromium\BrowserFactory; $browserFactory = new BrowserFactory(); $browser = $browserFactory->createBrowser([ 'userAgent' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', ]); try { $page = $browser->createPage(); $page->navigate('https://www.tradesquare.com.au/milano-decor-eden-gas-lift-bed-with-headboard-platform-storage-dark-grey-fabric-queen-dark-grey.html')->waitForNavigation(); // 等待SKU节点渲染完成 $page->waitForExpression('document.querySelector(\'[itemprop="sku"]\').textContent.length > 0'); // 提取SKU值 $sku = $page->evaluate('document.querySelector(\'[itemprop="sku"]\').textContent.trim()')->getReturnValue(); echo $sku; } finally { $browser->close(); } ?>
该方案获取的内容和浏览器中看到的完全一致,适配所有动态渲染站点,缺点是需要部署Chrome/Chromium运行环境,性能低于正则方案。
内容的提问来源于stack exchange,提问作者Robert-L
相关产品推荐
相关产品推荐

