PHP 関数file_get_contents
をプロキシとして使用して、2 つの異なる Web ホスト上の Web サイトをフェッチします。
ウィキペディアを除くすべての Web サイトで機能します。
毎回この出力が得られます:
WIKIMEDIA FOUNDATION
エラー
現在、サーバーで技術的な問題が発生しています。これはおそらく一時的なものであり、すぐに修正する必要があります。数分後にもう一度お試しください。
誰が問題が何であるか知っていますか?
PHP 関数file_get_contents
をプロキシとして使用して、2 つの異なる Web ホスト上の Web サイトをフェッチします。
ウィキペディアを除くすべての Web サイトで機能します。
毎回この出力が得られます:
WIKIMEDIA FOUNDATION
エラー
現在、サーバーで技術的な問題が発生しています。これはおそらく一時的なものであり、すぐに修正する必要があります。数分後にもう一度お試しください。
誰が問題が何であるか知っていますか?
おそらく正しい User-Agent を渡していません。ここを参照してください。
にコンテキストを渡す必要がありますfile_get_contents
:
ウィキメディア財団のポリシーでは、User-Agent ヘッダーが説明的でない、または欠落しているリクエストをブロックします。これは、これらのヘッダーが不適切なスクリプトから発生する傾向があるためです。「PHP」は、このヘッダーのブラックリストに登録された値の 1 つです。
デフォルトの User-Agent ヘッダーを、スクリプトと、必要に応じてシステム管理者が連絡できる方法を識別するものに変更する必要があります。
ini_set('user_agent', 'MyCoolTool/1.1 (http://example.com/MyCoolTool/; MyCoolTool@example.com)');
もちろん、コードをそのままコピーするのではなく、名前、URL、および電子メール アドレスを必ず変更してください。
これには 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;
ウィキペディアでは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;
すでに「数分後に再試行」したと思います。
次に試すことができるのは、 の代わりに cURL を使用しfile_get_contents
、ユーザー エージェントを一般的なブラウザーの 1 つに設定することです。
それでもうまくいかない場合は、少なくとももう少し情報が得られるはずです。