使用cURL和PHP发送POST数据以检索航空公司信息

时间:2014-01-24 11:36:45

标签: php post curl web-scraping

我总是使用PHP Simple HTML DOM Parser制作网页抓取脚本,但这次我需要使用cURL,因为表单使用POST而且我不知道为什么我的脚本不起作用。

我正在使用Burp Proxy获取所有POST信息。

我想使用cURL进行查询。

这是功能,我将以http://flyfirstnation.com为例:

<?php

function curl_get_contents($url)
{
  $curl_moteur = curl_init();
  curl_setopt($curl_moteur, CURLOPT_URL, $url);
  curl_setopt($curl_moteur, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt ($curl_moteur, CURLOPT_POST, true);
  curl_setopt ($curl_moteur, CURLOPT_POSTFIELDS, '{"FormData":{"Origin":["LOS"],"VarsSessionID":"","Destination":["ABV"],"DepartureDate":["24-Jan-2014"],"ReturnDate":["28-Jan-2014","28-Jan-2014"],"Adults":"1","Children":"0","Seniors":0,"Students":0,"Infants":"0","Youths":0,"Teachers":0,"SeatedInfants":0,"EVoucher":"","SearchUser":"PUBLIC"},"IsMMBChangeFlightMode":false}');


  curl_setopt($curl_moteur,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');

  curl_setopt($curl_moteur, CURLOPT_FOLLOWLOCATION, 1);
  $web = curl_exec($curl_moteur);
  curl_close($curl_moteur);
  return $web;
}


echo curl_get_contents('reservations.flyfirstnation.com');

?>

这是我收到的错误消息:

  

无法显示页面

     

由于无效,无法显示您要查找的页面   方法(HTTP动词)用于尝试访问。请试试   以下内容:

     

如果您认为此请求,请与网站管理员联系   应该被允许。确保显示的网站地址   您的浏览器的地址栏拼写和格式正确。   HTTP错误405 - 用于访问此页面的HTTP谓词不是   允许。 Internet信息服务(IIS)

     

技术信息(支持人员)

     

转到Microsoft产品支持服务并执行标题搜索   对于单词HTTP和405.打开IIS帮助,可以在IIS中访问   管理器(inetmgr),并搜索标题为“设置应用程序”的主题   映射,使用网站权限保护您的站点,以及关于   自定义错误消息。

3 个答案:

答案 0 :(得分:2)

它似乎是CURLOPT_POSTFIELDS值中的一个问题,它必须是一个键值PHP数组,如下所示:

$postFields = array(
    "FormData" => array(
        "Origin" => array(
        ...
        )
    )
);

更多信息:http://php.net/manual/en/function.curl-setopt.php

答案 1 :(得分:0)

您在POST操作期间发布JSON数据。您需要使用HTTP标头指定它。

curl_setopt($curl_moteur, CURLOPT_HTTPHEADER, array("Content-Type: application/json") );

答案 2 :(得分:0)

如果您使用GET转到reservations.flyfirstnation.com(例如在浏览器中),您会立即重定向到使用http://reservations.flyfirstnation.com/VARS/Public/FlightSelect.aspx将其数据发布到的网站。您尝试POST reservations.flyfirstnation.com,这是不允许的(HTTP错误405)。

如果您按照这样发布数据,它将起作用:

echo curl_get_contents('http://reservations.flyfirstnation.com/VARS/Public/FlightSelect.aspx');

我尝试了它,它有效(也就是说,我得到一个HTML文档,不知道它是否正确)。