【问题标题】:Is there a way to get round a 403 error with php file_get_contents?有没有办法用 php file_get_contents 解决 403 错误?
【发布时间】:2018-05-16 15:26:29
【问题描述】:

我正在尝试使用 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;

我在这里阅读了有关使用 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"
    )
)

);

但没有任何效果,我现在收到 400 错误消息。不幸的是,我的服务器似乎没有配置为使用 cURL,所以 file_get_contents 似乎是我这样做的唯一方法。

【问题讨论】:

  • 没有。它被称为Same-origin policy。
  • @icecub 但 CORS 仅 适用于从浏览器发出的 ajax 请求。 developer.mozilla.org/en-US/docs/Web/HTTP/CORS
  • @ADyson 这可能是真的。我在 Ajax 上工作了很多,所以公平地说,我从来没有意识到它只适用于它。也许我在这里错了。我也会犯错误。这就是我发表评论而不是回答的原因。
  • 如果同源策略应用于 HTTP 请求,是不是意味着我们无法在浏览器上导航到该页面?
  • @Cyclonecode 这可能是问题所在,但我认为“大多数”有点主观。取决于他们的政策,以及它是作为 API 还是基于浏览器的 UI。如果它是基于浏览器的 UI 页面,那么通过 PHP 脚本访问它可能不是解决 OP 问题的好方法。

标签: php file-get-contents


【解决方案1】:

您需要将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',
    ),
));

您也可以使用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',
    ),
));

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

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

echo $content;

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

curl --verbose -H 'User-Agent: YourApplication/1.0' 'https://www.vesselfinder.com/vessels/CELEBRITY-MILLENNIUM-IMO-9189419-MMSI-249055000'

还值得知道 curl 使用的默认 User-Agent 似乎被阻止了,所以如果使用 curl 您需要使用 -H 标志添加自己的。

【讨论】:

  • 这行得通。但是它现在可以工作了,因为您将用户代理标头伪造为不被识别为机器人/脚本。
  • @macghriogair - 是的,当然这就是原因。但是即使使用User-Agent 标头(例如User-Agent: MyApplication/1.0),这也应该有效,请求失败的原因是因为服务器不允许缺少此标头的请求。
  • 也许但是“MyApplication/1.0”的状态为 400。所以至少他们似乎期待一些已知的浏览器代理字符串。
  • 可以确认这一点。我想该网站会阻止某些标题,例如curl/*
  • 谢谢,这很好用。我很困惑,因为我之前尝试过一个用户代理但它没有用,所以我猜这个字符串有一些特定的东西。无论如何,再次感谢。
【解决方案2】:

正如@ADyson 所说,您向其发出请求的服务 Vesselfinder 似乎拒绝自动解析其数据。阅读文档:https://www.vesselfinder.com/de/realtime-ais-data#rt-web-services 你可以向他们索要 API 令牌,也许这是一个付费计划。

他们有官方 API。您需要一个 Api 密钥。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 2020-12-13
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 2021-06-05
    相关资源
    最近更新 更多