如何使用curl抓取sbplay1.com网页并提取指定a标签的href属性
PHP curl抓取sbplay1.com失效修复方案
核心问题原因
目标站点有基础反爬校验,你当前的curl请求配置不符合正常浏览器的请求特征,被站点拦截返回了异常内容(通常是4XX/5XX错误、或者反爬验证页),导致后续DOM解析拿不到a标签。
具体调整点
- 移除错误的
Content-Type: application/json请求头,普通GET请求网页不需要该请求头 - 替换规范的Accept、Accept-Language、Referer等请求头,模拟真实浏览器请求
- 增加curl错误校验逻辑,方便排查请求阶段的问题
- 增加DOM解析警告屏蔽,避免HTML不规范导致的解析报错
- 建议不要固定取索引为3的a标签,先输出所有a标签的href确认站点结构是否符合预期
修复后代码
<?php $url = "https://sbplay1.com"; $ch = curl_init(); // 模拟浏览器完整请求头 curl_setopt($ch, CURLOPT_HTTPHEADER, [ '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,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2', 'Referer: https://www.baidu.com' ]); 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_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 超时设置避免卡死 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($ch, CURLOPT_TIMEOUT, 15); $html = curl_exec($ch); // 排查curl错误 if(curl_errno($ch)){ echo 'curl请求错误: ' . curl_error($ch); exit; } curl_close($ch); // 调试时可以先输出$html确认是否拿到了正常页面内容 // var_dump($html); $dom = new DOMDocument; // 屏蔽HTML不规范导致的解析警告 libxml_use_internal_errors(true); $dom->loadHTML($html); libxml_clear_errors(); // 先遍历所有a标签确认索引,确认对应位置后再按索引取值 $aNodes = $dom->getElementsByTagName('a'); foreach($aNodes as $k => $node){ $href = $node->getAttribute("href"); echo "索引{$k}: {$href}<br>"; } // 确认索引后再使用下方代码取对应值 // $node = $aNodes->item(3); // $ids = $node->getAttribute("href"); // echo $ids; ?>
额外说明
如果调整后还是拿不到正常内容,可先取消代码中var_dump($html)的注释,查看返回的内容是否是正常的站点页面,若返回的是验证页,说明站点有更复杂的人机验证,需要额外处理Cookie或者JavaScript渲染逻辑。
内容的提问来源于stack exchange,提问作者Mr. New
相关产品推荐
相关产品推荐

