0

PHP 関数file_get_contentsをプロキシとして使用して、2 つの異なる Web ホスト上の Web サイトをフェッチします。

ウィキペディアを除くすべての Web サイトで機能します。

毎回この出力が得られます:

WIKIMEDIA FOUNDATION
エラー
現在、サーバーで技術的な問題が発生しています。これはおそらく一時的なものであり、すぐに修正する必要があります。数分後にもう一度お試しください。

誰が問題が何であるか知っていますか?

4

5 に答える 5

5

おそらく正しい User-Agent を渡していません。ここを参照してください。

にコンテキストを渡す必要がありますfile_get_contents:

于 2013-01-19T00:25:13.157 に答える
1

ウィキメディア財団のポリシーでは、User-Agent ヘッダーが説明的でない、または欠落しているリクエストをブロックします。これは、これらのヘッダーが不適切なスクリプトから発生する傾向があるためです。「PHP」は、このヘッダーのブラックリストに登録された値の 1 つです。

デフォルトの User-Agent ヘッダーを、スクリプトと、必要に応じてシステム管理者が連絡できる方法を識別するものに変更する必要があります。

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

もちろん、コードをそのままコピーするのではなく、名前、URL、および電子メール アドレスを必ず変更してください。

于 2013-01-19T00:27:13.603 に答える
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;
于 2013-01-19T00:56:13.963 に答える
0

ウィキペディアではUser-Agent、リクエストとともに HTTP ヘッダーを送信する必要があります。デフォルトでは、file_get_contentsこれを送信しません。

fsockopenfputsfeofおよびを使用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;
于 2013-01-19T00:26:00.143 に答える
-1

すでに「数分後に再試行」したと思います。

次に試すことができるのは、 の代わりに cURL を使用しfile_get_contents、ユーザー エージェントを一般的なブラウザーの 1 つに設定することです。

それでもうまくいかない場合は、少なくとももう少し情報が得られるはずです。

于 2013-01-19T00:25:19.867 に答える