PHP使用Simple HTML DOM Parser抓取页面返回false是否被拦截?
问题排查与解决方案
原因判断
你的请求确实大概率被目标站点拦截。Lowe's这类电商平台具备完善的反爬虫机制,file_get_html默认发起的请求缺少完整的浏览器特征头、无合理Cookie携带,很容易被识别为爬虫直接拦截,因此返回false。
具体解决步骤
- 替换默认请求工具:放弃
simple_html_dom自带的file_get_html方法,改用自定义程度更高的cURL发起请求,完整模拟浏览器请求特征,示例代码如下:
require_once($_SERVER['DOCUMENT_ROOT'].'/includes/simple_html_dom.php'); // 目标商品URL $url = 'https://www.lowes.com/pd/Frigidaire-Gallery-22-cu-ft-Counter-depth-Side-by-Side-Refrigerator-with-Ice-Maker-Fingerprint-Resistant-Black-Stainless-Steel/1000368269'; // 初始化cURL $ch = curl_init($url); // 配置cURL基础参数 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 自动跟随重定向 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 配置模拟浏览器请求头,可根据自己本地真实浏览器的请求参数替换 curl_setopt($ch, CURLOPT_HTTPHEADER, [ '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', 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.3,en;q=0.2', 'Referer: https://www.lowes.com/', 'Connection: keep-alive', 'Upgrade-Insecure-Requests: 1' ]); // 启用Cookie自动存储与携带,需保证当前目录有写入权限生成cookie.txt curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt'); curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt'); // 执行请求 $response = curl_exec($ch); curl_close($ch); // 将返回内容传给simple_html_dom解析 if ($response) { $html = str_get_html($response); // 后续写你的页面解析逻辑即可 } else { // 自定义请求失败的处理逻辑 }
- 配置User-Agent轮换:提前准备至少10个以上不同设备、不同浏览器的UA字符串,每次请求随机选取使用,避免单一UA被特征识别封禁。
- 配置代理IP轮换:如果需要批量爬取,单IP很容易被站点封禁,可对接代理IP池,通过cURL的
CURLOPT_PROXY参数每次请求随机切换代理IP。 - 控制请求频率:不要短时间内发起大量请求,每次请求之间添加1-5秒的随机延时,模拟真人浏览的行为节奏,降低被识别概率。
内容的提问来源于stack exchange,提问作者napierjohn
相关产品推荐
相关产品推荐

