0

これらは私がしたいステップです:

  1. フライトの検索であるhttp://www.skyscanner.es/のHTMLコードを取得します。
  2. そのHTMLの一部、つまり価格のある特定の「スパン」のみを取得します。
  3. それで操作します。

これは私がしているPHPコードです:

    <?php
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, "http://www.skyscanner.es/");
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt ($ch, CURLOPT_POST, 1);
        curl_setopt ($ch, CURLOPT_POSTFIELDS, "from=Bilbao (BIO)&to=Barcelona (BCN)&depdatetext=25/03/2013&sc_returnOrOneWay=2");
        $output = curl_exec($ch);
        curl_close($ch);
        echo $output;
    ?>

しかし、私はこのような奇妙な文字列を取得します:

     ‹¥TkoÚ0ý^‰ÿpTi“ê&lt; t%<¤RuR»U+{}4ñ…X5qf›×Pÿûì$ZõÛ‚Äu¬sî=çú:ýÓ믣Éï‡1¤f!àáû§»Ï#ðHül‚àzr ¿n'÷wù!<Åã/x©1yëõÚ_·}©æÁä[°qY"G«–DŸæ 'ý¢Êf!2=x#CÔívKb FÊ\\ ¡àÐÿ,ùjàdf03d²Íу¤|x7&pì$)UÍ€kI®®:]yKe¸8¼;@àv2y€ª),520h’ Ö`R®!§s3i€ !×Èü~Pòm"m¶ÁXUÝDëBô)!“©dÛÝ‚ª9Ïâ°7³‰æ1ö?à¢|ÑÛø*F3z§ânQ¬ÐðÄîhši¢QñYoJ“§¹’ËŒÅÍqñôž'3Ž‚Y“»œ2ƳyBÔÉ7…îÏ®zÏÐ8I£Ý¡~Ë¿°ja‰RÅÍ››—/m!£BêkähÚ§ÌÛ~nÐEýÐýö´0¬iMw¨¨vkÎLw/ÏêeoæÒ&iA^ôÌ3 §Ë$E÷Þ9Ô=<êØ‘3{uûHµß)gºYMÏî…[1—š.³X¡ †¯Ð¡ý M\¤<³FŽÏÆ•{mŒ™ÇWö0öÆ\{ÞÎNˆ  ­bµ¿nœ\d|œÙ›SôÐöÓhøˆÊÎ0Œ•’Ê2¢a?°°ct¥ÙM'›‰ Z×û/6á~¦úië?®Š%—IÚÃIŠ%h+—@‚òÉöfRAB3Gœ"0®sA·¶Àj+Í€g+*8ûH%ƒwµ”÷°¦ú Ç\ä¦ÒåÊ·¿Aí¨îK÷m-¾vñà-ú¡ 

だから、私は最初のステップを通過していません!

いくつかの方法で修正しようとしましたが、何が間違っているのかまだわかりません。私はそれができると想像します:

  • 大人、子供がいくら追加しないのでリクエスト…
  • CURLOPT_URLは、フォームのアクションと同様にwww.skyscanner.es/search.htmlである必要があります。
  • POSTリクエストを行わず、http://www.skyscanner.es/flights/bio/bcn/130325/airfares-from-bilbao-to-barcelona-in-march-2013.htmlのようなURLに直接cURLを実行しますか? flt = 1

誰か助けてもらえますか?

前もって感謝します!

編集済み:タイトルを変更しました。現在の問題に近づいています。

4

2 に答える 2

2

受信しているため、本文にエンコードされているメッセージは関係ありません。

HTTP/1.1 405 Method Not Allowed

つまり、使用できませんPOST

応答のすべてのヘッダーを読むと、そのうちの 1 つが次のように述べていることがわかります。

Allow: GET, HEAD, OPTIONS, TRACE

2行を削除する場合:

curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_POSTFIELDS, "from=Bilbao (BIO)&to=Barcelona (BCN)");

そして変更:

curl_setopt($ch, CURLOPT_URL, "http://www.skyscanner.es/");

の中へ:

curl_setopt($ch, CURLOPT_URL, "http://www.skyscanner.es/vuelos/bio/bcn/130325/tarifas-de-bilbao-a-barcelona-en-marzo-2013.html");

うまくいきます。

次のコードをチェックアウトします。

<?php

    $accept = array(
        'type' => array('application/rss+xml', 'application/xml', 'application/rdf+xml', 'text/xml'),
        'charset' => array_diff(mb_list_encodings(), array('pass', 'auto', 'wchar', 'byte2be', 'byte2le', 'byte4be', 'byte4le', 'BASE64', 'UUENCODE', 'HTML-ENTITIES', 'Quoted-Printable', '7bit', '8bit'))
    );
    $header = array(
        'Accept: '.implode(', ', $accept['type']),
        'Accept-Charset: '.implode(', ', $accept['charset']),
    );
    $encoding = null;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "http://www.skyscanner.es/vuelos/bio/bcn/130325/tarifas-de-bilbao-a-barcelona-en-marzo-2013.html?flt=1");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//    curl_setopt ($ch, CURLOPT_POST, 1);
//    curl_setopt ($ch, CURLOPT_POSTFIELDS, "from=Bilbao (BIO)&to=Barcelona (BCN)");
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    $response = curl_exec($ch);
    curl_close($ch);        
    if (!$response) {
        // error fetching the response
    } else {
        echo $response;
    }
?>
于 2013-02-13T21:47:45.733 に答える
0

価格のないページが出てきたので、POSTメソッドを使っているのかなと思いました。

URL が相対パスであることがわかりました。そのため、スクリプトは読み込まれませんでした。base タグを追加しました。

[code before]
$result = str_replace("<head>", "<head><base href=\"$skyScannerURL\" />", $response);

スタイルがあり、何かを読み込もうとしましたが、bucle に入り、ページがリロードされ、URL のパラメーターが増加しています。それは ?crty=107 です。

完全なコード:

$accept = array(
    'type' => array('application/rss+xml', 'application/xml', 'application/rdf+xml', 'text/xml'),
    'charset' => array_diff(mb_list_encodings(), array('pass', 'auto', 'wchar', 'byte2be', 'byte2le', 'byte4be', 'byte4le', 'BASE64', 'UUENCODE', 'HTML-ENTITIES', 'Quoted-Printable', '7bit', '8bit'))
);
$header = array(
    'Accept: '.implode(', ', $accept['type']),
    'Accept-Charset: '.implode(', ', $accept['charset']),
);
$encoding = null;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.skyscanner.es/vuelos/bio/bcn/130325/tarifas-de-bilbao-a-barcelona-en-marzo-2013.html?flt=1");
//curl_setopt($ch, CURLOPT_URL, "http://www.skyscanner.es/flights/bio/bcn/130325/airfares-from-bilbao-to-barcelona-in-march-2013.html?flt=1");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
$response = curl_exec($ch);
curl_close($ch);        
if (!$response) {
    // error fetching the response
} else {
    $skyScannerURL = 'http://www.skyscanner.es/';
    $result = str_replace("<head>", "<head><base href=\"$skyScannerURL\" />", $response);
    echo $result;
}

ここでオンラインで見ることができます: codepad.viper-7.com

明らかに何かがうまく機能していません。ありがとうございました。

于 2013-02-14T17:57:13.100 に答える