2013-02-13 96 views
0

这些是我想要做的步骤:执行cURL后的脚本不起作用。页面重新加载不断

  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“ê< 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ñà-ú¡ 

所以,我还没有传递的第一步!

我试图用几种方法解决它,但我不知道我在做什么错。我想,可能是:

请谁能帮助我的网址是什么?

在此先感谢!

编辑:我改变了标题,更接近我现在的问题。

+1

哇,你在刮刮板 – 2013-02-13 21:40:39

回答

2

没关系,因为你收到什么消息,在体内编码:

HTTP/1.1 405 Method Not Allowed

,这意味着你不能使用POST

如果你读了响应的所有标题,你会看到,他们中的一个说:

Allow: GET, HEAD, OPTIONS, TRACE 

如果你删除了两条线:

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; 
    } 
?> 
+0

非常感谢! 我试了一下,但我得到了一个没有航班信息的网页。这是我尝试执行POST查询的原因。 您可以尝试下面的结果:[codepad.viper-7上的示例](http://codepad.viper-7.com/COAPjA/55dev?) 任何想法? 再次感谢 – Mikel 2013-02-13 22:57:20

+0

如果您使用Tamper(FF插件),您会发现它们根本不使用POST! – alfasin 2013-02-13 23:51:22

0

我认为这是使用POST方法,因为我得到一个页面价格内部消除。

现在我意识到URL是亲戚,所以没有加载脚本。我已添加base tag

[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; 
} 

你可以在网上看到here: codepad.viper-7.com

明显的东西都不尽如人意。 再次感谢大家。