PHP中file_get_contents设置User-Agent仍报403 Forbidden错误
问题根因
Browns Fashion 配置了多层反爬校验规则,仅添加老旧版本的User-Agent无法绕过拦截,返回403是必然结果:
- 你当前代码里使用的Chrome/50.0是2016年发布的过时浏览器标识,反爬规则会直接将这类UA标记为爬虫流量
- 真实浏览器发起请求时会携带完整的协议头,仅带UA的请求特征和正常用户访问差异极大,会被规则直接识别拦截
file_get_contents本身的请求构造灵活度极低,无法模拟真实浏览器的TLS握手、Cookie携带、跳转跟随等行为,很容易触发反爬。
可落地的解决步骤
1. 替换请求方式,补全完整请求头
放弃file_get_contents,使用cURL扩展构造请求,补全真实浏览器的常规请求头,使用近期版本的浏览器UA,参考代码如下:
<?php include('simple_html_dom.php'); $target = "https://www.brownsfashion.com/uk/shopping/jem-18k-yellow-gold-octogone-double-paved-ring-17648795"; $ch = curl_init($target); $requestHeaders = [ 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.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: en-GB,en;q=0.9', 'Accept-Encoding: gzip, deflate, br', 'Referer: https://www.brownsfashion.com/uk', 'Connection: keep-alive', 'Upgrade-Insecure-Requests: 1', 'Sec-Fetch-Dest: document', 'Sec-Fetch-Mode: navigate', 'Sec-Fetch-Site: same-origin', 'Sec-Fetch-User: ?1' ]; curl_setopt_array($ch, [ CURLOPT_HTTPHEADER => $requestHeaders, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_ENCODING => '', CURLOPT_TIMEOUT => 15, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_2TLS ]); $resp = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($status === 200) { $html = str_get_html($resp); // 提取页面标题 $pageTitle = $html->find('title', 0)->plaintext; echo $pageTitle; } else { echo "请求异常,状态码:" . $status; } ?>
2. 仍返回403时的调整方案
如果补全请求头后依然被拦截,说明触发了更严格的校验规则,按以下顺序调整:
- 先请求站点首页,通过cURL的Cookie jar功能存储服务端下发的合法Cookie,再携带该Cookie请求商品详情页
- 降低请求频率,单IP请求间隔控制在3-5秒以上,短时间高频访问会直接被IP封禁
- 若站点启用了JS动态校验(如Cloudflare 5秒盾),基础HTTP请求无法直接绕过,需要使用Playwright、Puppeteer这类无头浏览器工具,模拟真实浏览器完成JS渲染、校验流程后再提取页面内容。
注意:爬取站点内容前请先确认目标站点的服务条款与robots规则,合规获取公开数据,避免违规访问带来的相关风险。
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

