如何用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 "未找到价格元素"; }
关键步骤说明
- 请求头模拟:添加User-Agent字段,让请求看起来来自真实浏览器,降低被拦截概率。
- HTML解析容错:启用
libxml_use_internal_errors(true)忽略页面的语法问题,保证解析流程不中断。 - XPath元素定位:用
//span[contains(@class, "price")]精准定位价格元素,若页面有多个同类元素,可补充父节点路径缩小范围。 - 数值提取:通过正则表达式剥离价格文本中的非数字内容,得到目标数值。
内容的提问来源于stack exchange,提问作者La jumate
相关产品推荐
相关产品推荐

