使用Curl & simple_html_dom爬取速卖通商品价格失败求助
解决速卖通商品价格爬取的「Trying to get property 'plaintext' of non-object」错误
这个错误的核心原因很明确:你的选择器没有在curl获取到的HTML中找到对应元素,find()方法返回了null,之后你直接尝试访问null的plaintext属性,就触发了这个Notice。下面分步骤帮你排查解决:
1. 先确认curl请求是否拿到了正常页面内容
速卖通有严格的反爬机制,默认的curl请求头会被识别为爬虫,可能返回验证码页面、跳转提示或者不完整的页面。你需要先模拟浏览器的请求头,同时调试查看实际获取的内容:
// 初始化curl并配置浏览器请求头 $curl = new \Curl\Curl(); // 模拟Chrome浏览器的请求标识 $curl->setHeader('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'); $curl->setHeader('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'); $curl->setHeader('Accept-Language', 'en-US,en;q=0.5'); $curl->setHeader('Connection', 'keep-alive'); $curl->setHeader('Upgrade-Insecure-Requests', '1'); $curl->get('https://www.aliexpress.com/item/32844492002.html'); $response = $curl->getRawResponse(); // 先输出响应内容,检查是否是正常的商品页面 echo htmlspecialchars($response);
如果输出的是验证码页面或"Access Denied"提示,说明你需要进一步处理反爬(比如添加有效Cookie、使用代理);如果是正常的商品页面,继续下一步。
2. 更新元素选择器
速卖通的页面结构经常迭代,你原来的选择器大概率已经失效。建议用浏览器开发者工具(F12)打开目标商品页,定位价格元素,获取最新的选择器:
比如当前该商品的价格元素可能对应这样的选择器(示例,需以实际页面为准):
div.product-price-container span.product-price
3. 添加错误处理,避免直接访问非对象
即使选择器正确,也可能因为网络波动、页面加载异常导致找不到元素,所以一定要先判断find()的结果是否存在:
$html4 = new simple_html_dom(); $html4->load($response); // 先查找元素,判断是否存在后再访问属性 $priceElement = $html4->find("div.product-price-container span.product-price", 0); if ($priceElement) { $price2 = $priceElement->plaintext; echo $price2; } else { echo "无法找到价格元素,请检查选择器或页面内容"; }
额外提醒
- 速卖通的商品价格可能是通过JavaScript动态渲染的,如果curl获取的静态HTML中没有价格,你需要改用支持JS渲染的工具(比如Puppeteer、Selenium),而不是simple_html_dom这类静态解析库。
- 爬取速卖通数据需要遵守其网站的服务条款和
robots.txt规则,避免触发反爬限制导致IP被封禁。
内容的提问来源于stack exchange,提问作者Muhammad Faisal
相关产品推荐
相关产品推荐

