You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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时,说明两种情况之一:

  1. 用$one分割抓取到的页面内容后,得到的数组长度不够——比如你传了$number=1,但分割后数组只有1个元素(索引最大是0),自然找不到索引1的元素;
  2. 目标页面的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:05:05