有没有办法用 php file_get_contents 解决 403 错误?

use*_*442 0 php file-get-contents

我正在尝试使用 php file_get_contents 获取特定网页 - 当我直接查看页面时没有问题,但是当尝试使用 php 抓取它时,我得到“无法打开流:HTTP 请求失败!HTTP/1.1 403 禁止”。我试图从页面中提取一段数据。

$ft = file_get_contents('https://www.vesselfinder.com/vessels/CELEBRITY-MILLENNIUM-IMO-9189419-MMSI-249055000');

echo $ft;
Run Code Online (Sandbox Code Playgroud)

我已经在这里阅读了有关使用 stream_context_create 的各个页面,主要是用户代理部分

$context  = stream_context_create(
array(
    "http" => array(
        "header" => "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"
    )
)
Run Code Online (Sandbox Code Playgroud)

);

但是没有任何效果,我现在收到 400 错误消息。不幸的是,我的服务器似乎没有配置为使用 cURL,因此 file_get_contents 似乎是我执行此操作的唯一方法。

Cyc*_*ode 6

您需要将User-Agent标题添加到实际标题中:

$context  = stream_context_create(
  array(
    'http' => array(
      'header' => 'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36',
    ),
));
Run Code Online (Sandbox Code Playgroud)

您还可以使用该user_agent选项:

$context = stream_context_create(
  array(
    'http' => array(
      'user_agent' => 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36',
    ),
));
Run Code Online (Sandbox Code Playgroud)

上面的两个示例都应该可以工作,您现在应该能够使用以下方法获取内容:

$content = file_get_contents('https://www.vesselfinder.com/vessels/CELEBRITY-MILLENNIUM-IMO-9189419-MMSI-249055000', false, $context);

echo $content;
Run Code Online (Sandbox Code Playgroud)

这当然也可以使用命令行中的 curl 进行测试。请注意,我们正在设置自己的User-Agent标题:

curl --verbose -H 'User-Agent: YourApplication/1.0' 'https://www.vesselfinder.com/vessels/CELEBRITY-MILLENNIUM-IMO-9189419-MMSI-249055000'
Run Code Online (Sandbox Code Playgroud)

可能还值得知道User-Agentcurl 使用的默认值似乎被阻止,因此如果使用 curl 您需要使用该-H标志添加自己的。