使用CURL与PHP Simple HTML DOM Parser爬取图片链接部分页面失效问题
问题排查与解决方案
可能的原因
1. 反爬机制拦截请求
Geekbuying对无标识的CURL请求可能存在拦截策略,部分页面会返回空内容或反爬提示页面,导致Simple HTML DOM Parser无法解析到图片标签。你的代码中CURL未设置任何请求头,极易被识别为爬虫。
2. HTML解析异常
部分页面的HTML结构可能存在格式不规范问题,或者Simple HTML DOM Parser对复杂HTML的兼容性不足,导致解析失败。
3. 请求未成功获取内容
网络波动、CURL配置缺失等情况,可能导致$htmlContent为空或不完整,后续自然无法找到图片节点。
修复步骤
步骤1:完善CURL请求头,模拟浏览器访问
给CURL添加必要的请求头,避免被反爬拦截:
include "simple_html_dom.php"; $link = "https://www.geekbuying.com/item/eufy-Clean-G40-Hybrid--Robot-Vacuum-Cleaner-520591.html"; function get_content($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 添加浏览器请求头 curl_setopt($ch, CURLOPT_HTTPHEADER, array( '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: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language: en-US,en;q=0.5', 'Connection: keep-alive', 'Upgrade-Insecure-Requests: 1' )); // 禁用SSL验证(适配部分网站证书问题) curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $htmlContent = curl_exec($ch); // 检查CURL请求是否出错 if(curl_errno($ch)){ echo 'CURL错误:' . curl_error($ch); curl_close($ch); return; } curl_close($ch); // 检查获取的内容是否为空 if(empty($htmlContent)){ echo '未获取到页面内容'; return; } $dom = new simple_html_dom(); $dom->load($htmlContent); // 检查DOM是否加载成功 if(!$dom){ echo 'DOM解析失败'; return; } foreach($dom->find('img') as $element){ $immagine = $element->src; echo "$immagine <br />"; } // 清理DOM资源,避免内存泄漏 $dom->clear(); unset($dom); } get_content($link);
步骤2:验证请求内容
在获取$htmlContent后,可以先输出部分内容(比如echo substr($htmlContent, 0, 500);),确认是否获取到了正常的商品页面HTML,而非反爬提示或空内容。
步骤3:替换解析库(可选)
如果Simple HTML DOM Parser仍存在兼容性问题,可尝试使用PHP原生的DOMDocument解析:
function get_content($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HTTPHEADER, array( '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: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8' )); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $htmlContent = curl_exec($ch); if(curl_errno($ch)){ echo 'CURL错误:' . curl_error($ch); curl_close($ch); return; } curl_close($ch); $dom = new DOMDocument(); // 禁用错误提示,兼容不规范的HTML libxml_use_internal_errors(true); $dom->loadHTML($htmlContent); libxml_clear_errors(); $images = $dom->getElementsByTagName('img'); foreach($images as $img){ $src = $img->getAttribute('src'); echo "$src <br />"; } }
关键说明
- 反爬机制是最可能的问题根源,添加请求头后绝大多数情况能解决问题。
- 务必检查CURL请求错误和返回内容的有效性,避免对无意义内容进行解析。
- 使用Simple HTML DOM Parser后记得调用
clear()释放资源,防止内存泄漏。
内容的提问来源于stack exchange,提问作者GaraGulp
相关产品推荐
相关产品推荐

