0

現在、次のコードを使用してURLをカールしています。これは、URLの末尾に添付されるかPOSTデータのいずれかで正常に機能します。しかし、getとpostではありません。

ただし、高度なRESTクライアント(Google Chrome用にアドオン)を使用すると、問題なく動作します。迷惑なのですが、それを模倣するために送信するリクエストが表示されません。

これが私がそれを使って行っている電話です。

$fields = array(
        'searchPaginationResultsPerPage'=>500               );
foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
$fields_string = rtrim($fields_string,'&');

$curl = curl_init(); 
curl_setopt( $curl, CURLOPT_URL, 'http://www.microgenerationcertification.org/mcs-consumer/installer-search.php?searchPaginationPage=1' );
curl_setopt( $curl, CURLOPT_FOLLOWLOCATION, true );
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);  
curl_setopt($curl,CURLOPT_POST,count($fields));
curl_setopt($curl,CURLOPT_POSTFIELDS,$fields_string);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 80);  
$str = curl_exec($curl);  
curl_close($curl); 

これを何よりもちょっとしたテストとして使っているだけなのに、うまくいかないようです。最初の500件の結果は常に取得できますが、次の500件は取得できません。

4

3 に答える 3

0

なぜそれが失敗するのかわからない、うまく見える.. CURLをスキップしてPHPストリームメソッドに進むとどうなりますか?

$postdata = http_build_query(
    array(
        'searchPaginationResultsPerPage' => 500
    )
); 
$opts = array('http' =>
    array(
        'method'  => 'POST',
        'header'  => 'Content-type: application/x-www-form-urlencoded',
        'content' => $postdata
    )
);

$context  = stream_context_create($opts);

$result = file_get_contents('http://www.microgenerationcertification.org/mcs-consumer/installer-search.php?searchPaginationPage=1', false, $context);
于 2012-04-26T10:07:12.067 に答える
0

これは動作します

$fields = array (
        'searchPaginationResultsPerPage' => 500,
        'searchPaginationPage' => 1 
);

$headers = array (
        "Connection: keep-alive",
        "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.162 Safari/535.19",
        "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
        "Accept-Encoding: gzip,deflate,sdch",
        "Accept-Language: en-US,en;q=0.8",
        "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3" 
);

$fields_string = http_build_query ( $fields );
$cookie = 'cf6c650fc5361e46b4e6b7d5918692cd=49d369a493e3088837720400c8dba3fa; __utma=148531883.862638000.1335434431.1335434431.1335434431.1; __utmc=148531883; __utmz=148531883.1335434431.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); mcs=698afe33a415257006ed24d33c7d467d; style=default';
$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, 'http://www.microgenerationcertification.org/mcs-consumer/installer-search.php?searchPaginationPage=1&searchPaginationResultsPerPage=500' );
curl_setopt ( $ch, CURLOPT_FOLLOWLOCATION, true );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, 80 );
curl_setopt ( $ch, CURLOPT_COOKIE, $cookie );
curl_setopt ( $ch, CURLOPT_HTTPHEADER, $headers );

$str = curl_exec ( $ch );
curl_close ( $ch );

echo $str;

Cookie情報が必要であり、curlがPOSTではなくGETを使用していることを確認してください

デモを参照してください:http://codepad.viper-7.com/gTThxX (表示する前にcokkiesの有効期限が切れていないことを願っています)

于 2012-04-26T10:07:52.583 に答える
0

あなたがスクレイピングしているページを見て、次のことに気づきました。

  • ページごとの結果を変更すると、検索が再度投稿されます
  • 彼らはあなたの検索パラメータを保存するためにセッションを使用しているようです

CURLを使用するときにセッションIDを保持していないため(おそらく、必要以上に複雑になります)、これはWebサイトと同じように動作しません。

ただし、searchPaginationResultsPerPageパラメーターをURLに追加すると、正常に機能することに気付きました。このような:

http://www.microgenerationcertification.org/mcs-consumer/installer-search.php?searchPaginationPage=0&searchPaginationResultsPerPage=500

つまり、実際にfile_get_contentsを使用でき、CURLのことを気にする必要はありません。

于 2012-04-26T10:10:12.633 に答える