php - Guzzle 7 - 403 Forbidden(适用于 CURL)
问题描述
更新:似乎用户代理不是某些主机提供 HTML 所需的唯一标头,我还必须添加“接受”标头,最后这为我解决了许多主机的问题:
$response = $client->request('GET', 'http://acme.com', ['headers' => ['user-agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36',
'accept'=> 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9'
]]);
我正在尝试使用 Guzzle 检索一些网站,但收到 403 禁止错误(当它们在浏览器中正常工作时),我怀疑这是由于主机禁止非标准用户代理。为了解决这个问题,我试图在 Guzzle 中设置 User-Agent 以模仿浏览器,但我找不到任何实际有效的方法。我可以浏览该网站,还可以使用 WGET 和 CURL -L 毫无问题地下载 HTML,所以问题似乎出在 Guzzle 上。
我试过了:
$client = new Client(['allow_redirects' => ['track_redirects' => true]]);
$client->setUserAgent("Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.62 Safari/537.36");
$response = $client->get($domain_name);
奇怪的是,这个 ^ 导致一个错误,似乎说 Guzzle 正在尝试浏览到 User-Agent 值:cURL 错误 6:无法解析主机:Mozilla(请参阅https://curl.haxx.se/libcurl/c/ libcurl-errors.html ) 用于 Mozilla/5.0%20(Windows%20NT%206.2;%20WOW64)%20AppleWebKit/537.36%20(KHTML,%20like
$domain_name = 'http://www.' . $domain_name;
$client = new Client(['headers' => ['User-Agent' => 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36']]);
$response = $client->get($domain_name);
^导致“客户端错误:GET http://www.xxx.co.uk
导致 `403 Forbidden'”错误
$domain_name = 'http://www.' . $domain_name;
$client = new Client(['allow_redirects' => ['track_redirects' => true]]);
$client->setServerParameter('user-agent', "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36");
$response = $client->get($domain_name);
^导致“传递给 GuzzleHttp\Client::request() 的参数 3 必须是数组类型,给定字符串”错误
$domain_name = 'http://www.' . $domain_name;
$client = new Client(['allow_redirects' => ['track_redirects' => true]]);
$client->setHeader("user-agent", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36");
$response = $client->get($domain_name);
^ 还会导致“传递给 GuzzleHttp\Client::request() 的参数 3 必须是数组类型,给定字符串”错误
有什么建议么?我想我在这里掉了一个兔子洞!
我想知道这里是否发生了其他事情,因为据我了解,Guzzle 只是 CURL 的包装器,CURL 可以毫无问题地从同一个 IP 获取同一个网页。
解决方案
更新:似乎用户代理不是某些主机提供 HTML 所需的唯一标头,我还必须添加“接受”标头,最后这为我解决了许多主机的问题:
$response = $client->request('GET', 'http://acme.com', ['headers' => ['user-agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36',
'accept'=>'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9']]);
推荐阅读
- python - 运行命令时将数据添加到 json 文件 discord.py
- excel - 行 VBA Excel 的范围
- javascript - 在不返回任何内容的 JavaScript 函数中是否需要返回
- python - 用 scipy 在 Spyder 上阅读 wav
- docker - 如何组织多个 Dockerfile,docker-compose.yaml 和 .dockerignore
- spring - 什么是实体类?
- xamarin - Xamarin webview 中的本机弹出窗口
- php - 无法使用 $_FILES 函数将图像文件发布到给定目录
- python - 如何使用 networkx 访问连接的组件?
- pandas - 将单个元素列表转换为 df 的值