使用Curl抓取数据时报Undefined offset错误的技术求助
解决Curl抓取数据时的Undefined offset:1错误
这个错误我之前也碰到过,本质就是数组索引越界——代码尝试访问一个根本不存在的数组元素。结合你的代码和场景,咱们一步步拆解问题:
错误根源分析
先看你的draw函数核心逻辑:
function draw($one,$two,$number,$resource) { $draw= explode($one,$resource); $draw= explode($two,$draw[$number]); // 这里就是触发错误的位置 $draw= $draw[0]; return $draw; }
当出现Undefined offset:1时,说明两种情况之一:
- 用
$one分割抓取到的页面内容后,得到的数组长度不够——比如你传了$number=1,但分割后数组只有1个元素(索引最大是0),自然找不到索引1的元素; - 目标页面的HTML结构变了,或者你的服务器抓取到的内容不是正常页面(比如被拦截返回的错误页),导致
$one这个分隔符出现的次数远少于预期。
至于另一台服务器能正常运行?大概率是两台服务器抓取到的页面内容不一样:
- 可能你的服务器IP被目标网站识别为爬虫,返回了403/500错误页;
- 或者目标页面针对不同地区、不同请求UA做了内容调整,你的服务器拿到的HTML结构和预期不符;
- 也可能是两台服务器的Curl配置不同,导致你的服务器抓取到的内容不完整。
解决方案
1. 给draw函数加安全防护
先避免直接访问不存在的数组索引,修改后的函数更健壮:
function draw($one,$two,$number,$resource) { $firstSplit = explode($one, $resource); // 先检查要访问的索引是否存在 if (!isset($firstSplit[$number])) { // 可以返回空字符串、null,或者根据需求抛出提示 return ''; } $secondSplit = explode($two, $firstSplit[$number]); // 同样检查第二次分割的结果 return isset($secondSplit[0]) ? $secondSplit[0] : ''; }
2. 排查Curl抓取的内容是否正常
先把抓取到的内容打印出来,确认是不是你预期的页面:
$resource2 = curl_exec($ch); // 打印内容,检查是否为目标页面,还是错误页面 echo htmlspecialchars($resource2);
如果发现是错误页面,给Curl添加浏览器模拟配置,让请求更像真实用户:
// 配置Curl模拟浏览器请求 curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 自动跟随页面跳转 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); // 设置连接超时时间 curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt'); // 保存Cookie,维持会话 curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt'); // 读取Cookie
3. 关于服务器模块的疑问
这个错误和服务器模块完全无关,不需要额外安装任何PHP模块。因为另一台服务器能正常运行,说明代码逻辑本身是可行的,问题出在抓取内容的差异上。
内容的提问来源于stack exchange,提问作者Yusuf Ihsan Atasun
相关产品推荐
相关产品推荐

