2016-03-04 3 views
0

Я пишу простой искатель, который извлекает ссылки на статьи из engadget.com и для каждой статьи я сохранить весь документ HTMLWeb ползать с помощью PHP

$target_url = "http://www.engadget.com/all/page/1/"; 
    $html = new simple_html_dom(); 
    $html->load_file($target_url); 
    foreach($html->find('script') as $script){ 
     if($script->type == "application/ld+json"){ 
      $json_data = strip_tags($script); 
      if($content = json_decode($json_data)){ 
       $listElements = $content->itemListElement; 
       foreach($listElements as $element){ 
        echo "Running.."; 
        $article_url = $element->url; 
        $article_page = new simple_html_dom(); 
        try{        
         $article_page->load_file($article_url); 
        } catch (Exception $e) { 
         sleep(20); 
         $article_page->load_file($article_url); 
        } finally { 
         $filename = "raw_file".$file_num.".txt"; 
         $file = fopen("C:\\xampp\\htdocs\\files\\".$filename,"w"); 
         fwrite($file, $article_page); 
         fclose($file); 
         $file_num++; 
        } 
       }    
      } 
     } 
    } 

В большинстве случаев это работает нормально, но иногда страницы не загружается, и я получаю ошибку 503. Чтобы решить эту проблему, в настоящее время я приостанавливаю выполнение в течение 20 секунд, прежде чем повторять попытку с тем же URL. Это значительно сократило случаи сбоев, но иногда оно также не срабатывает во второй попытке. Есть ли лучший способ убедиться, что я получу данные со страницы. Есть ли способ продолжать попытки, пока страница не ответит?

ответ

1

Может быть хорошая идея, чтобы увеличить интервал динамически каждый раз исключение происходит и попробуйте еще раз, что-то вроде:

foreach ($listElements as $element) { 
    echo "Running.."; 
    $article_url = $element->url; 
    $article_page = new simple_html_dom(); 
    $interval = 0; 
    $tries = 0; 
    $success = false; 

    while (!$suceess && $tries < 5) { 
     try { 
      sleep($interval);    
      $article_page->load_file($article_url); 
      $success = true; 
     } catch (Exception $e) { 
      $interval += 20; 
      $tries ++; 
      $article_page->load_file($article_url); 
     } finally { 
      $filename = "raw_file".$file_num.".txt"; 
      $file = fopen("C:\\xampp\\htdocs\\files\\".$filename,"w"); 
      fwrite($file, $article_page); 
      fclose($file); 
      $file_num++; 
     } 
    } 
} 
+0

Спасибо ... я попробую это .... надеюсь, что это улучшит мою статистику – shantanu

+0

К сожалению, блок catch никогда не вызывался sinc e ошибки, которые я получаю, являются рекомендациями PHP, а не исключениями. Таким образом, второй loadfile никогда не будет выполнен. Теперь я сомневаюсь, что блок catch try будет эффективным. Даже после того, как успех отказа будет установлен в true, и цикл будет завершен для текущего URL ... любые мысли? – shantanu

+0

Вместо того, чтобы пытаться поймать исключение, теперь я проверяю длину строки article_page (String, потому что это то, что возвращает load_file). Если длина равна 0 (в случае ошибки), я повторяю, как было предложено в вашем решении. – shantanu

2

Возможно, на веб-сайте было установлено ограничение на интервалы запроса, чтобы избежать сбора данных. По какой-то причине ... Поэтому не копируйте содержимое другого сайта :)

Или, если есть API, используйте это для загрузки/получения содержимого.

(Технически, вы можете позволить вашим запросам петли сайта до тех пор, пока правильный ответ, используя интервалы и сброс ограничение по времени, чтобы избежать PHP от остановки.)

+0

Я не мог найти API для сайта .... я буду стараться играть с интервалом времени, как было предложено вами и @Saul ниже – shantanu

Смежные вопросы