维基百科不喜欢file_get_contents

时间:2013-01-19 00:19:23

标签: php proxy file-get-contents wikipedia

我使用PHP函数file_get_contents作为代理来获取两个不同网络主机上的网站。

适用于除维基百科以外的所有网站。

每次都给我这个输出:

  

WIKIMEDIA基金会
  错误
  我们的服务器目前遇到技术问题。这可能是暂时的   应尽快解决。请在几分钟后再试一次。

任何人都知道问题是什么?

5 个答案:

答案 0 :(得分:5)

您可能没有传递正确的用户代理。请参阅here

您应该将上下文传递给file_get_contents

答案 1 :(得分:1)

维基媒体基金会policy将阻止使用非描述性或缺少用户代理标头的请求,因为这些请求往往来自行为不当的脚本。 “PHP”是此标题的黑名单值之一。

您应该change the default User-Agent header到标识您的脚本以及系统管理员如有必要可以与您联系的方式:

ini_set('user_agent', 'MyCoolTool/1.1 (http://example.com/MyCoolTool/; MyCoolTool@example.com)');

当然,请务必更改名称,网址和电子邮件地址,而不是逐字复制代码。

答案 2 :(得分:0)

Wikipedia要求随请求一起发送User-Agent HTTP标头。默认情况下,file_get_contents不会发送此邮件。

您应该使用fsockopenfputsfeoffgets发送完整的HTTP请求,或者您可以使用cURL执行此操作。我个人的经验是使用f*函数,所以这是一个例子:

$attempts = 0;
do {
    $fp = @fsockopen("en.wikipedia.org",80,$errno,$errstr,5);
    $attempts++;
} while(!$fp && $attempts < 5);
if( !$fp) die("Failed to connect");
fputs($fp,"GET /wiki/Page_name_here HTTP/1.0\r\n"
     ."Host: en.wikipedia.org\r\n"
     ."User-Agent: PHP-scraper (your-email@yourwebsite.com)\r\n\r\n");
$out = "";
while(!feof($fp)) {
    $out .= fgets($fp);
}
fclose($fp);
list($head,$body) = explode("\r\n\r\n",$out);
$head = explode("\r\n",$head);
list($http,$status,$statustext) = explode(" ",array_shift($head),3);
if( $status != 200) die("HTTP status ".$status." ".$statustext);
echo $body;

答案 3 :(得分:0)

使用cURL:

$ch = curl_init('http://wikipedia.org');
curl_setopt_array($ch, array(
    CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 5.1; rv:18.0) Gecko/20100101 Firefox/18.0',
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_RETURNTRANSFER => true
);
$data = curl_exec($ch);
echo $data;

答案 4 :(得分:-1)

我认为你已经“在几分钟内再次尝试过”。

您可以尝试使用cURL代替file_get_contents,并将用户代理设置为常用浏览器。

如果它仍然不起作用,它至少应该给你一些信息。