2017-02-07 6 views
0

gutenberg.orgにあるパブリックドメインブックのテキストをPHPで取得して解析する必要があります。ウェブページは、カールリクエストの異なるコンテンツを検出/表示しています - なぜですか?

ほとんどのWebページのコンテンツを取得するために、私はブラウザーのURLにナビゲートして見つけたとおりに正確にHTMLを取得するためにCURLリクエストを使用できます。

残念なことに、いくつかのページでは、最も重要なのはgutenberg.orgのページで、ウェブサイトは異なるコンテンツを表示したり、リダイレクトヘッダーを送信したりします。

たとえば、this target, gutenberg.org, pageをロードしようとすると、curl要求がthis different but logically related, gutenberg.org, pageにリダイレクトされます。私は正常に私のブラウザでクッキーとJavaScriptの両方をオフにしてターゲットページを訪問することができます。

同じサイトへの通常のブラウザ要求が行われていないときに、カール要求がリダイレクトされるのはなぜですか?ここで

私は、Webページを取得するために使用したコードは次のとおりです。

$urlToScan = "http://www.gutenberg.org/cache/epub/34175/pg34175.txt"; 

if(!isset($userAgent)){ 
    $userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"; 
} 

$ch = curl_init(); 
$timeout = 15; 
curl_setopt($ch, CURLOPT_COOKIESESSION, true); 
curl_setopt($ch, CURLOPT_USERAGENT,$userAgent); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
#curl_setopt($ch, CURLOPT_HEADER, 1); // return HTTP headers with response 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
curl_setopt($ch, CURLOPT_URL, $urlToScan); 
$html = curl_exec($ch); 
curl_close($ch); 

if($html == null){ 
    return false; 
} 
print $html; 
+0

私も問題を再現できません。期待どおりに動作しないコードを示すコードスニペットを追加できますか? – madshvero

+0

@madshvero。私はちょうどコードを追加しました。 PHPも使いましたか? –

+0

@ AlexanderO'Maraその問題はコマンドラインにはありません、atleast、良いニュースです。 –

答えて

2

ヒントは、URLにおそらくある:それは「歓迎見知らぬ人」と言います。彼らはこのページへのすべての「最初の」時間訪問者をリダイレクトしています。ページにアクセスすると、もうリダイレクトされません。

あなたのブラウザにたくさんのものを保存しているようには思えませんが、セッションIDを持つクッキーを設定します。これは本当に最も論理的なことです:セッションがあるかどうかを確認してください。

あなたがする必要があることは、カールとクッキーで接続することです。このためにブラウザのCookieを使用することはできますが、期限が切れた場合は実行する方が良いでしょう

  • ページをリクエストしてください。
  • ページがリダイレクトされた場合は、クッキーを安全にしてください(今セッションがあります)。
  • そのCookieでページを再度リクエストしてください。

すべてうまくいけば、2番目のリクエストはリダイレクトされません。クッキー/セッションが期限切れになるまで、もう一度やり直してください。リファラを追跡するウェブサイトのためであった、クッキー/クッキー瓶

+0

私はそれを考えていましたが、*クッキーを有効にしないでそのページにナビゲートすることができました。ヘッダー内のリファラーを追跡していたことがわかります!それでも、あなたの方法はおそらく最良の解決策です。 –

2

1がないcurlでクッキーやJavaScriptせずにブラウザで目的のページに移動し、まだできることが理由で作業する方法についてはthe manualを見ますヘッダーにページには、適切な参照元のヘッダーを設定することにより、クッキーなしでロードすることができます。

curl_setopt($ch, CURLOPT_REFERER, "http://www.gutenberg.org/ebooks/34175?msg=welcome_stranger"); 

としてページは、意外にも、単純にユーザーエージェントを除外することによってロードされ、@madshveroによって指摘。

+0

何か奇妙な方法:) – Nanne

+0

私は今質問に関するあなたのコメントを参照してください:それはユーザーエージェントafterallではなかった?または組み合わせ? – Nanne

+0

@Nanneそれはあなたがそれをどのように見るかに応じて、どちらかまたはどちらかでした。ユーザーエージェントが設定されている場合は、クッキーを有効にするか(ソリューション用)、または参照元を設定する必要があります。または、問題を回避し、ユーザーエージェントを渡さないようにすることもできます。 –