我使用PHP函数file_get_contents
作为代理来获取两个不同网络主机上的网站。
适用于除维基百科以外的所有网站。
每次都给我这个输出:
WIKIMEDIA基金会
错误
我们的服务器目前遇到技术问题。这可能是暂时的 应尽快解决。请在几分钟后再试一次。
任何人都知道问题是什么?
答案 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
不会发送此邮件。
您应该使用fsockopen
,fputs
,feof
和fgets
发送完整的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
,并将用户代理设置为常用浏览器。
如果它仍然不起作用,它至少应该给你一些信息。