【问题标题】:Getting data from wikisource.org site从 wikisource.org 站点获取数据
【发布时间】:2012-11-13 08:22:54
【问题描述】:

我正在尝试从该站点获取邮政编码:

http://pl.wikisource.org/wiki/Lista_kod%C3%B3w_pocztowych_w_Polsce

我的代码很简单:

 <?php
    $postalCode = $_GET['code'];

    $httpAddr = 'http://pl.wikisource.org/wiki/Lista_kod%C3%B3w_pocztowych_w_Polsce/Okr%C4%99g_'.$postalCode[0].'_'.$postalCode[0].$postalCode[1].'-xxx';

    file_get_contents($httpAddr);
    ?>

但是当我将 $postalCode 设置为 03-000(也是 01-000、05-000,但对于 07-000、61-000、62-000 有效)时,我收到错误消息:

Warning: file_get_contents(http://pl.wikisource.org/wiki/Lista_kod%C3%B3w_pocztowych_w_Polsce/Okr%C4%99g_0_03-xxx): failed to open stream: HTTP request failed! HTTP/1.0 403 Forbidden in /var/www/clients/client1/web4/web/ofix/test.php on line 5 

页面地址正确,您可以在网络浏览器中复制并粘贴它,它可以工作。 有什么想法吗?

【问题讨论】:

  • 网络服务器可能会为某些用户代理阻止它。在您的网络浏览器中输入相同的 URL 并不能证明太多。
  • 这不是一次性工作吗,您不需要反复抓取这些数据吗?
  • 但它总是适用于 02-000 之类的代码,而永远不会适用于 ex. 前缀为 01 的代码。

标签: php wikimedia


【解决方案1】:

正如 Orbit 中的 Lightness Races 所怀疑的那样,网络服务器似乎确实阻止了 PHP 的请求。

使用cURL 而不是file_get_contents() 可以揭示细节:

HTTP/1.0 403 Forbidden
脚本应使用包含联系信息的用户代理字符串,否则它们可能会在不通知的情况下被 IP 阻止。

Web 浏览器在其请求中发送一个有效的 User-Agent 标头,这就是页面在您的浏览器中加载正常但在 PHP 中加载不正常的原因。

在我在 PHP 中加载此 URL 的测试中,有时它会以 200 的 HTTP 状态代码成功,有时它会以 403 失败。请注意,错误消息显示脚本可能被阻止(即。有时它们可​​能不会被阻止)。

编辑

有关更多信息,请参阅此问题:How to get results from the Wikipedia API with PHP?

【讨论】:

  • 所以我设置了自己的 user_agent,现在它可以完美运行了。谢谢。
猜你喜欢
  • 2016-01-02
  • 1970-01-01
  • 2014-09-06
  • 2014-05-25
  • 2012-05-01
  • 2014-04-16
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
相关资源
最近更新 更多