最可靠方式是用curl_setopt($ch, curlopt_useragent, $ua)显式设置,不能仅靠curlopt_httpheader手动加头;需搭配referer、accept等头,并注意guzzle中ua须通过user_agent选项而非headers设置。

PHP用cURL伪装User-Agent最可靠
直接改User-Agent头是伪装UA最常用也最有效的方式,cURL默认不发UA,服务端一查就露馅。必须显式设置,否则很多网站(比如知乎、豆瓣API)会直接返回403或空内容。
实操要点:
- 用
curl_setopt($ch, CURLOPT_USERAGENT, $ua)设置,不能只靠curl_setopt($ch, CURLOPT_HTTPHEADER, [...])手动加头——某些旧版cURL对User-Agent有特殊处理逻辑,手动加header可能被忽略 - 推荐用主流浏览器真实UA字符串,比如:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 - 如果请求频率高,建议每次生成微调的UA(如变版本号),避免被风控系统标记为脚本集群
file_get_contents()也能伪装但限制多
file_get_contents()可以配合stream_context_create()设UA,适合简单GET请求,但不支持POST、cookie保持、重定向控制等,出错时错误信息也更难调试。
关键写法:
立即学习“PHP免费学习笔记(深入)”;
```php
$options = [
'http' => [
'method' => 'GET',
'header' => "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36\r\n"
]
];
$content = file_get_contents('https://example.com', false, stream_context_create($options));
```注意:header里的换行必须是\r\n,用\n会导致UA无效;且无法设置超时、SSL验证等参数,遇到HTTPS站点证书异常时会直接失败。
别漏掉Referer和Accept头,单设UA还不够
只改UA容易被识别为爬虫,尤其访问前端渲染型页面时。真实浏览器发起请求必然带Referer、Accept、Accept-Language等头,缺一不可。
建议组合设置:
-
Referer:设成目标站首页或上一页地址,比如https://example.com/ -
Accept:用text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 -
Accept-Language:比如zh-CN,zh;q=0.9,en;q=0.8 - cURL里统一用
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers)传数组,顺序无关
用Guzzle时UA设置位置容易搞错
Guzzle 7+ 的UA不是在headers里设,而是通过user_agent选项单独传——放错位置会被忽略。
正确写法:
```php
$client = new \GuzzleHttp\Client([
'headers' => ['Accept' => 'application/json'],
'user_agent' => 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36'
]);
```错误写法(UA不会生效):'headers' => ['User-Agent' => '...']——Guzzle会覆盖掉这个头。另外,Guzzle默认启用redirect和cookies,若目标站依赖JS跳转或登录态,得额外关掉或手动处理,不然UA设了也拿不到真正内容。
UA字符串本身不是难点,难的是配套的请求上下文:IP稳定性、请求间隔、header完整性、是否维持session。随便贴个UA跑几次可能成功,但批量或长期运行时,漏掉任意一项都可能突然失效。











