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

如何用PHP编写简单网页爬虫获取指定商品价格?

解决PHP网页爬虫提取商品价格的问题

目标:爬取指定商品页面中的价格数值“4699”,原代码无法正常运行,以下是问题分析和修正方案:

原代码的核心问题

  • XPath表达式无效:原表达式'/<span class="price">[0-9]*\.[0-9]+/i'不符合XPath语法规范,不能直接用这种方式混合标签选择和正则匹配。
  • 反爬拦截风险:直接调用file_get_contents请求页面,可能因缺少浏览器标识(User-Agent)被网站拦截,导致获取不到有效HTML内容。
  • 节点内容输出错误:直接echo $node无法输出元素文本,需调用节点的nodeValue属性获取内容。

修正后的可运行代码

// 构造请求头,模拟浏览器访问以避免反爬拦截
$opts = [
    '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($opts);

// 获取目标页面HTML内容
$html = file_get_contents("https://www.flanco.ro/telefon-mobil-apple-iphone-14-5g-128gb-purple.html", false, $context);

if (!$html) {
    die("无法获取页面内容");
}

$doc = new DomDocument();
// 忽略HTML解析时的语法错误,避免页面不规范导致解析失败
libxml_use_internal_errors(true);
$doc->loadHtml($html);
libxml_clear_errors();

$xpath = new DomXPath($doc);
// 定位class包含price的span元素(可根据页面实际结构调整为更精确的路径)
$nodes = $xpath->query('//span[contains(@class, "price")]');

if ($nodes->length > 0) {
    $priceText = $nodes->item(0)->nodeValue;
    // 从价格文本中提取纯数字部分
    preg_match('/\d+/', $priceText, $matches);
    if (!empty($matches)) {
        echo "提取到的价格:" . $matches[0]; // 输出结果为4699
    } else {
        echo "未提取到价格数值";
    }
} else {
    echo "未找到价格元素";
}

关键步骤说明

  1. 请求头模拟:添加User-Agent字段,让请求看起来来自真实浏览器,降低被拦截概率。
  2. HTML解析容错:启用libxml_use_internal_errors(true)忽略页面的语法问题,保证解析流程不中断。
  3. XPath元素定位:用//span[contains(@class, "price")]精准定位价格元素,若页面有多个同类元素,可补充父节点路径缩小范围。
  4. 数值提取:通过正则表达式剥离价格文本中的非数字内容,得到目标数值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 19:40:26