PHP爬虫报错求助:file_get_contents 403及find()调用空对象问题
问题解决方案
1. 解决403 Forbidden错误
服务器返回403是因为检测到请求来自脚本而非浏览器,需要模拟浏览器请求头。建议用curl替代load_file获取页面内容,设置User-Agent等请求头绕过基础反爬。
2. 修复致命错误
当load_file失败时,页面内容无法正常加载,$html调用find()会触发空指针错误。必须先确保成功获取页面内容再进行解析。
3. 修正选择器与语法错误
price-inner-text是类选择器,需添加前缀.,即.price-inner-text- 原代码中foreach末尾的分号会导致循环体为空,无法实际获取内容;单个元素直接通过索引
find(selector, 0)获取更高效
修正后的完整代码
include_once("simple_html_dom.php"); $url = 'https://eg.iherb.com/pr/california-gold-nutrition-sport-whey-protein-isolate-1-lb-16-oz-454-g/71031'; // 使用curl模拟浏览器请求获取页面内容 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 本地测试临时关闭,生产环境建议开启 $pageContent = curl_exec($ch); curl_close($ch); if (!$pageContent) { die("无法获取页面内容"); } // 加载内容到HTML解析器 $html = new simple_html_dom(); $html->load($pageContent); // 获取并输出商品名称 $productName = $html->find("h1#name", 0); echo $productName ? "商品名称:" . $productName->plaintext . "<br>" : "未找到商品名称<br>"; // 获取并输出商品价格 $price = $html->find(".price-inner-text", 0); echo $price ? "商品价格:" . $price->plaintext . "<br>" : "未找到商品价格<br>"; // 清理资源 $html->clear(); unset($html); ?>
额外提示
- 若仍被拦截,可尝试添加更多请求头(如Accept、Referer)或使用代理IP
- 抓取前请确认目标网站的
robots.txt协议及相关法律法规,避免违规
内容的提问来源于stack exchange,提问作者ALY ELTURKY
相关产品推荐
相关产品推荐

