使用PHP爬取网页出现error code:1020错误,求代码问题排查方案
问题排查及修复方案
1. error code 1020 报错原因
该站点接入了Cloudflare安全防护,你直接使用file_get_contents发起裸请求,缺少User-Agent等常规浏览器请求头,会被Cloudflare判定为爬虫行为直接拦截,因此返回1020错误。
2. 现有代码的语法&逻辑错误
你写的preg_replace调用存在明显参数错误:
preg_replace的参数顺序为「正则规则」「替换规则」「待处理字符串」,你的代码把第二个参数和第三个参数的分隔符写成了.(字符串拼接符),而非逗号,相当于直接把$1和$initial拼接作为替换值,没有传入待处理的目标字符串参数,逻辑完全走不通。- 用正则匹配HTML节点稳定性极差,页面结构稍有变动就会匹配失败,更推荐用DOM解析器提取字段。
3. 修复后的可运行参考代码
// 构造请求头,模拟普通浏览器请求,绕过Cloudflare基础拦截 $context = stream_context_create([ 'http' => [ 'header' => [ 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8' ] ] ]); $initial = file_get_contents('https://v2.gcchmc.org/medical-status-search/', false, $context); if ($initial === false) { die('页面请求失败'); } // 用DOM解析提取csrfmiddlewaretoken值 $dom = new DOMDocument(); libxml_use_internal_errors(true); // 屏蔽HTML不规范导致的报错 $dom->loadHTML($initial); libxml_clear_errors(); $xpath = new DOMXPath($dom); $tokenNode = $xpath->query('//input[@name="csrfmiddlewaretoken"]')->item(0); if ($tokenNode) { $csrfToken = $tokenNode->getAttribute('value'); echo $csrfToken; } else { echo '未找到csrf字段'; }
额外说明
如果添加请求头后依然返回1020错误,说明站点开启了Cloudflare的人机验证机制,普通请求无法直接绕过,需要使用无头浏览器等方案模拟真实用户操作才能获取页面内容。
内容的提问来源于stack exchange,提问作者gprialde
相关产品推荐
相关产品推荐

