2011-12-30 1 views
3

何らかの理由で、この特定のWebページのコンテンツをcURLで取得できないようです。私はcURLを使用して "トップレベルのページ"のコンテンツを正常に取得できましたが、同じ自己構築のクイックcURL関数は、リンクされていないサブWebページのいずれかで機能していないようです。cURLを介してWebページのコンテンツを取得できないようです - ユーザーエージェントとHTTPヘッダーの両方が設定されていますか?

トップレベルのページ:http://www.deindeal.ch/

サブページ:http://www.deindeal.ch/deals/hotel-cristal-in-nuernberg-30/

私(のfunctions.php内)のcURL関数

function curl_get($url) { 
    $ch = curl_init(); 
    $header = array(
    'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
    'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7', 
    'Accept-Language: en-us;q=0.8,en;q=0.6' 
    ); 
    $options = array(
     CURLOPT_URL => $url, 
     CURLOPT_HEADER => 0, 
     CURLOPT_RETURNTRANSFER => 1, 
     CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13', 
     CURLOPT_HTTPHEADER => $header 
     ); 
    curl_setopt_array($ch, $options); 
    $return = curl_exec($ch); 
    curl_close($ch); 

    return $return; 
} 

PHPファイルを取得するには内容(テスト用にエコーを使用)

require "functions.php"; 
require "phpQuery.php"; 

echo curl_get('http://www.deindeal.ch/deals/hotel-walliserhof-zermatt-2-naechte-30/'); 

これまでのところ、私はこれが

  • を動作させるために、以下しようとしてきた両方のローカル(XAMPP)リモート(LAMP)ファイルを実行しました。
  • のように、ユーザエージェントとHTTPヘッダーには、curl_get()のすべてのオプションが現在のものとして含まれていましたが、CURLOPT_USERAGENT and CURLOPT_HTTPHEADERS`を除くすべてのオプションが含まれています。

実際のブラウザ要求を行うために提供されたデータの量に関係なく、ウェブサイトがcURLまたはその他のリモートファイルオープンメカニズムを介して要求を完全にブロックする可能性はありますか?

また、なぜ私の要求が何のために起きているのかを診断することは可能ですか?

上記の2つの質問に答える、またはcURLとは異なる方法であってもファイルの内容を取得するための編集/提案があれば助かります)。あなたのオプションに

CURLOPT_FOLLOWLOCATION => TRUE 

を:

答えて

5

を追加してみてください。

あなたは(応答ヘッダを参照するには-i含む)コマンドラインからの単純なカール要求を実行した場合、見て非常に簡単です:

$ curl -i 'http://www.deindeal.ch/deals/hotel-cristal-in-nuernberg-30/' 
HTTP/1.1 302 FOUND 
Date: Fri, 30 Dec 2011 02:42:54 GMT 
Server: Apache/2.2.16 (Debian) 
Vary: Accept-Language,Cookie,Accept-Encoding 
Content-Language: de 
Set-Cookie: csrftoken=d127d2de73fb3bd72e8986daeca86711; Domain=www.deindeal.ch; Max-Age=31449600; Path=/ 
Set-Cookie: generic_cookie=1; Path=/ 
Set-Cookie: sessionid=987b1a11224ecd0e009175470cf7317b; expires=Fri, 27-Jan-2012 02:42:54 GMT; Max-Age=2419200; Path=/ 
Location: http://www.deindeal.ch/welcome/?deal_slug=hotel-cristal-in-nuernberg-30 
Content-Length: 0 
Connection: close 
Content-Type: text/html; charset=utf-8 

あなたが見ることができるように、それはで302を返します。 Locationヘッダーその場所に直接アクセスすると、探しているコンテンツが取得されます。

そして、あなたの二つの質問に答えるために:

  1. ありませんが、カールのようなものからの要求をブロックするない possileです。消費者がHTTPを話すことができるなら、ブラウザが得ることができるものに到達することができます。
  2. HTTPプロキシを使用して診断すると便利でした。 Wireshark、フィドラー、チャールズ、他。将来あなたを助けるはずです。あるいは、私がしたようにして、コマンドラインからリクエストを出してください。

EDIT
ああ、私はあなたが今について話しているものを参照してください。したがって、初めてリンク先に移動すると、リダイレクトされ、Cookie(またはCookie)が設定されます。これらのクッキーを取得すると、リクエストは意図どおりに処理されます。

だから、あなたは、この例のように、をCookieJarを使用する必要があります。http://icfun.blogspot.com/2009/04/php-how-to-use-cookie-jar-with-curl.html

だから、あなたは、最初の要求を行うクッキーを保存し、その後、クッキーなど、あなたの後続の要求を行う必要があります。

+0

「CURLOPT_FOLLOWLOCATION」を追加してくれてありがとうございました。応答ヘッダー( 'http://www.deindeal.ch/welcome/?..'へのリダイレクト)に応じて動作しましたが、現在は応答ヘッダーブラウザでURLにアクセスしようとするよりも別の場所が表示されています。ブラウザでURLを訪問すると、自分がリダイレクトされていないことがわかります.URLは完全に要求されますが、cURLリクエストが行われると、別の場所が提供されます。 – Avicinnian

+2

上記の私の編集を参照してください。 – sberry

関連する問題