PHP Simple HTML DOM Parser无返回结果问题求助
解决PHP Simple HTML DOM Parser无法获取亚马逊商品价格的问题
核心问题分析
- 亚马逊反爬拦截:直接用
file_get_html请求时,未携带浏览器标识(User-Agent)等必要请求头,亚马逊会判定为爬虫,返回验证码页面或空内容,导致$html无法正确获取商品页DOM。 - 协议跳转问题:你使用
http协议请求,亚马逊会强制跳转到https,但file_get_html默认无法正确处理跳转,导致获取的内容异常。 - 元素处理错误:即使成功获取到
.a-price-whole元素,直接echo $price输出的是对象实例而非文本内容,需要提取innertext属性。
修复后的代码示例
<?php require_once($_SERVER['DOCUMENT_ROOT'] . '/assets/html_dom_parser/simple_html_dom.php'); $amazonASIN = "B0C89F1V5S"; $url = "https://www.amazon.co.uk/dp/" . $amazonASIN; // 用CURL模拟浏览器请求,携带必要请求头 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 自动跟随跳转 curl_setopt($ch, CURLOPT_HTTPHEADER, [ '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', 'Accept-Language: en-GB,en;q=0.9' ]); $htmlContent = curl_exec($ch); curl_close($ch); // 加载HTML到Simple HTML DOM $html = str_get_html($htmlContent); if($html) { $priceElement = $html->find('.a-price-whole', 0); if($priceElement) { $price = trim($priceElement->innertext); echo 'price is ' . $price; } else { echo '未找到价格元素'; } } else { echo '无法获取页面内容'; } ?>
额外说明
- 请求头的重要性:User-Agent必须设置成主流浏览器的标识,否则极易被亚马逊拦截。若仍被拦截,可尝试添加更多请求头(如Accept、Referer等)。
- 反爬机制限制:即使设置了请求头,亚马逊仍可能通过Cookie、验证码等方式拦截爬虫。长期需求建议使用亚马逊官方API,避免触发反爬。
- 元素选择器验证:亚马逊页面结构可能随时变更,需通过浏览器开发者工具确认
.a-price-whole是否仍是价格元素的正确选择器。
内容的提问来源于stack exchange,提问作者Lewis Hardisty
相关产品推荐
相关产品推荐

