Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Сеть > cURL возвращает пустую строку


Автор: lagab 22.1.2011, 17:00
Здравствуйте!
Мне необходимо использовать в одном из своих скриптов данный сервис: http://www.jde.ru/calc
Это что-то вроде калькулятора доставки.

С помощью firebug я посмотрел какие заголовки шлет форма в бэкенд аджакса, посмотрел url до бэкенд скрипта.
Набросал такой код
Код

  $url = 'http://www.jde.ru/form/calc';
  $postdata = "Ffrom=%D0%92%D0%BE%D1%80%D0%BE%D0%BD%D0%B5%D0%B6&from=%D0%92%D0%BE%D1%80%D0%BE%D0%BD%D0%B5%D0%B6&
Fto=%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0&to=%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0&weight=1&
vol_toggle=true&vol_length=&vol_width=&vol_height=&volume=0.0001&Oversize_Weight=&Oversize_Volume=&crate_volume=&
crate_markup=1&Bags_1=&
Bags_2=&Bags_3=&Bags_4=&departure_from=%D0%92%D0%BE%D1%80%D0%BE%D0%BD%D0%B5%D0%B6&departure_distance=&
TimeA_From=10&PaidA_From=&CraneA_From=0&AreaA_From=0&AddttnA_From=&
destination_to=%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0&destination_distance=&TimeA_To=10&PaidA_To=&
CraneA_To=0&AreaA_To=0&AddttnA_To=&script=on";
 $ch = curl_init($url);    
 curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; ru; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 GTB7.");
 curl_setopt($ch, CURLOPT_HTTPHEADER, array("Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3"));
 curl_setopt($ch, CURLOPT_POST, 1);
 curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
 curl_setopt($ch, CURLOPT_REFERER, 'http://www.jde.ru/calc');
 curl_setopt($ch, CURLOPT_FOLLOWLOCATION  ,1); 
 curl_setopt($ch, CURLOPT_HEADER      ,0);  // DO NOT RETURN HTTP HEADERS 
 curl_setopt($ch, CURLOPT_RETURNTRANSFER  ,1);  // RETURN THE CONTENTS OF THE CALL
 $Rec_Data = curl_exec($ch);
 echo var_dump($Rec_Data);


По идее должен прийти в ответ html код. Тем не менее мне постоянно в ответ приходит что-то вроде
Цитата

string(49) " "


То есть пустая строка. Пробовал играться с заголовками, пробовал разные варианты.
Может кто-нибудь подсказать в чем проблема?
Или как по-другому раздирбанить этот калькулятор, чтобы использовать его в своем приложении?

Автор: patap 16.2.2011, 11:59
Код

  $url = 'http://www.jde.ru/form/calc';
  $postdata = "Ffrom=%D0%98%D1%80%D0%BA%D1%83%D1%82%D1%81%D0%BA&from=%D0%98%D1%80%D0%BA%D1%83%D1%82%D1%81%D0%BA&Fto=%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0&to=%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0&weight=900&vol_length=15&vol_width=7&vol_height=3&volume=&bulky=true&bulky_all=true&Oversize_Weight=&Oversize_Volume=&crate_volume=&crate_markup=1&warm=true&Bags_1=&Bags_2=&Bags_3=&Bags_4=&departure_from=%D0%98%D1%80%D0%BA%D1%83%D1%82%D1%81%D0%BA&departure_distance=&TimeA_From=10&PaidA_From=&CraneA_From=0&AreaA_From=0&AddttnA_From=&destination=true&destination_to=%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0&destination_distance=&WarmA_To=1&SundyA_To=1&TimeA_To=10&PaidA_To=10&CraneA_To=0&AreaA_To=0&AddttnA_To=&script=on";
 
  $ch = curl_init();    
 
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_HEADER, 1);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_TIMEOUT, 3);
  curl_setopt($ch, CURLOPT_POST, 1);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
  curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.13) Gecko/20101203 MRA 5.5 (build 02842) Firefox/3.6.13',
    'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3',
    'Accept-Encoding: gzip,deflate',
    'Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7',
    'Keep-Alive: 115',
    'Connection: keep-alive',
    'Content-Type: application/x-www-form-urlencoded; charset=UTF-8',
    'X-Requested-With: XMLHttpRequest',
    'Referer: http://www.jde.ru/calc',
    'Content-Length: ' . strlen($postdata)
  ));
  $Rec_Data = curl_exec($ch);
  echo var_dump($Rec_Data);

Автор: patap 16.2.2011, 12:59
делать нехрен мне на работе smile

вот пропарсенный результат
Код

preg_match_all('#<table class="calcTable">(.*?)</table>#si', $Rec_Data, $match);
  $result = $temp = array();
  
  foreach ($match[1] as $table) {
    preg_match_all('#<td>(.*?)</td>#si', $table, $tds);
    foreach ($tds[1] as $key => $value) {
      if ($key % 2 == 0) {
        $temp['name'] = $value;
      } else {
        $temp['value'] = $value;
        array_push($result, $temp);
        $temp = array();
      }
    }
  }
  
  echo '<pre>';
  print_r($result);
  echo '</pre>';

Автор: mafangel 16.1.2015, 02:13
у меня CURL ()


Код

          $chp = curl_init($url);
          curl_setopt($chp,CURLOPT_CONNECTTIMEOUT,20);
          curl_setopt($chp,CURLOPT_TIMEOUT,20);
          curl_setopt($chp,CURLOPT_TIMEOUT_MS,20000);
          curl_setopt($chp, CURLOPT_FOLLOWLOCATION, true);
          curl_setopt($chp, CURLOPT_RETURNTRANSFER, true);
          curl_setopt($chp, CURLOPT_MAXREDIRS, 4);
          curl_setopt($chp, CURLOPT_HEADERFUNCTION, 'setCookies');
          curl_setopt($chp, CURLOPT_COOKIEJAR, $_SERVER['DOCUMENT_ROOT'].'/cookie.txt');
          curl_setopt($chp, CURLOPT_COOKIEFILE, $_SERVER['DOCUMENT_ROOT'].'/cookie.txt');
          curl_setopt($chp, CURLOPT_URL, $url);
          $res = curl_exec($chp);
          curl_close($chp);

возвращает пусто на следующий URL http://www.zagarhall.ru/shellac.htm

причем остальные парсит нормально.
Где гарантии, что в некоторых случаях я не буду получать также пусто...
проверка ответа серверов - показывает 200 - ОК...

не понимаю, почему не работатет ((

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)