Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: cURL срабатывает через раз
 
 автор: ZeeG   (23.03.2012 в 11:23)   письмо автору
 
 

Всем доброго дня.
Пожалуйста, подскажите, в чем может быть причина.

Запрашиваю контент страницы, но cURL срабатывает через раз


 require_once("phpQuery.php");

 $url = "http://www.booking.com/searchresults.ru.html?redirect_aa=0&city=-2612321;offset=0;rows=50;";

 function get_data($url){
     $ch = curl_init();
     curl_setopt($ch, CURLOPT_URL, $url);
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
     curl_setopt($ch, CURLOPT_HEADER, 0);
     curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0)");
     $data = curl_exec($ch);
     curl_close($ch);
     return  $data;
}

$pq = phpQuery::newDocument(get_data($url));
$htr = $pq->find('table.hotellist');
echo $htr;

  Ответить  
 
 автор: Sfinks   (23.03.2012 в 11:29)   письмо автору
 
   для: ZeeG   (23.03.2012 в 11:23)
 

установите CURLOPT_HEADER в true и посмотрите что возвращает сервер в заголовках, когда "не срабатывает". Возможно ограничение по частоте обращения стоит на сервере.

  Ответить  
 
 автор: ZeeG   (23.03.2012 в 12:17)   письмо автору
 
   для: Sfinks   (23.03.2012 в 11:29)
 

спасибо, но все равно что-то не так

  Ответить  
 
 автор: MHz   (23.03.2012 в 12:26)   письмо автору
 
   для: ZeeG   (23.03.2012 в 12:17)
 

Давно писал маленького бота, для игрушки одной, часто ошибки выскакивали, я решил проблему примерно так (в функции Exec ()):

class cURL
{
    protected $Errors = 0;
    protected $Resource = NULL;
    protected $Options = array (
    
        CURLOPT_AUTOREFERER    => True,  // Автоматически устанавливать Referer
        CURLOPT_FOLLOWLOCATION => True,  // Следовать заголовкам Location
        CURLOPT_HEADER         => False, // Включить заголовки в вывод
        CURLOPT_RETURNTRANSFER => True,  // Возврат результата в качестве строки
        CURLOPT_CONNECTTIMEOUT => 10,    // Время ожидания попытки соединения
        CURLOPT_POSTFIELDS     => NULL,  // Данные POST для передачи
        CURLOPT_USERAGENT      => NULL,  // содержимое заголовка User-agent
        CURLOPT_URL            => NULL,  // Загружаемый адрес 
    
    );
    
    public function __construct ($Url, $UserAgent)
    {
        $this->Options[CURLOPT_URL] = $Url;
        $this->Options[CURLOPT_USERAGENT] = $UserAgent;
        
        $this->Resource = curl_init ();
        
        curl_setopt_array ($this->Resource, $this->Options);
    }

       ......

        public function Exec ()
    {
        $Result = curl_exec ($this->Resource);
        
        if (curl_getinfo ($this->Resource, CURLINFO_HTTP_CODE) >= 400)
        {
            $this->Errors++;
            
            if ($this->Errors >= 10)
            {
                exit ('Prevyshenie maksimalno dopustimogo kolichestva oshibok!');
            }
            
            sleep (1);
            return $Result = $this->Exec ();
        }
        
        $this->Errors = 0;
        
        file_put_contents ('deb.txt', '====================================================================================='.PHP_EOL.$Result.PHP_EOL); #, FILE_APPEND);
        return $Result;
    }
}

Извиняюсь за отсутствие комментариев. в общем проверю что статус ответа не больше 400, если больше ставил паузу в 1 сек и пробовал обратиться еще раз, если тоже самое произошло 10 раз подряд, срипт оваливался

  Ответить  
 
 автор: ZeeG   (23.03.2012 в 12:29)   письмо автору
 
   для: MHz   (23.03.2012 в 12:26)
 

Извините, а как вызвать работу данного класса? я с классами не умею работать еще.

PS

Заголовки ответа

HTTP/1.1 200 OK
Date: Fri, 23 Mar 2012 08:26:16 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Keep-Alive: timeout=5
Server: Apache
Cache-Control: max-age=0
Expires: Fri, 23 Mar 2012 08:26:16 GMT
Content-Length: 0

  Ответить  
 
 автор: MHz   (23.03.2012 в 12:33)   письмо автору
 
   для: ZeeG   (23.03.2012 в 12:29)
 

ну я просто привел часть класса чтобы понять какие параметры у меня в curl и как работает у меня функция exec ();

  Ответить  
 
 автор: MHz   (23.03.2012 в 12:46)   письмо автору
 
   для: ZeeG   (23.03.2012 в 12:29)
 

Именно при этих заголовках проблемы возникают? Может проблема в контенте? Или может сервер неправильные заголовки отдает в случае ошибок.

  Ответить  
 
 автор: ZeeG   (23.03.2012 в 13:35)   письмо автору
 
   для: MHz   (23.03.2012 в 12:46)
 

А что обычно делают в таких случаях?
Можно что-то сделать?

Я не пойму в чем дело.... то работает, то нет... если не сработало, жму F5, иногда несколько раз, до срабатывания. еще недавно всё было нормально ..

  Ответить  
 
 автор: MHz   (23.03.2012 в 15:24)   письмо автору
 
   для: ZeeG   (23.03.2012 в 13:35)
 

Для начала необходимо выяснить в чем проблема, для этого нужно вести какой-нибудь журнал в котором хранить состояние переменных в момент когда скрипт не срабатывает.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования