@admiz

Как исправить ошибку при парсинге данных PHP?

У меня возникла задача спарсить товары с сайта, и я написал скрипт, состоящий из следующих этапов:

Парсинг количества страниц в категории;
Парсинг товаров с указанных страниц;
Парсинг цен и названий товаров на каждой странице товара.
Однако при запуске скрипт выполняется очень долго и в конце выдает ошибку:
Fatal error: Maximum execution time of 30 seconds exceeded in /var/www/parser/vendor/masterminds/html5/src/HTML5/Parser/DOMTreeBuilder.php on line 671

Можете ли вы подсказать решение, чтобы код сразу работал так, как нужно?

<?php
   use Symfony\Component\BrowserKit\HttpBrowser;
   use Symfony\Component\HttpClient\HttpClient;
   class Agrostadion {
        public function getParse() {
            $paginate = 1;
            $browser = new HttpBrowser(HttpClient::create());
            $crawler = $browser->request('GET', "https://agrostadion.com/catalog/zasobi-zakhystu-roslyn/herbitsydy/");
            $paginate = $crawler->filter(".module-pagination")->eq(0);

           
            $paginate_array =  explode(' ',$paginate->text());
            
            foreach($paginate_array as $key => $value){
                if(!is_numeric($value)){
                    unset($paginate_array[$key]);
                }
            }
       
            $paginate_count = array_pop($paginate_array);   
            for($i=1; $i<=$paginate_count; $i++) {
                $response = $browser->request('GET', 'https://agrostadion.com/catalog/zasobi-zakhystu-roslyn/?PAGEN_1='.$i);
                $response->filter('.catalog_block div .catalog_item_wrapp .inner_wrap .item_info .item-title a')->each(function ($node) use (&$links) {
                     $links[] = $node->attr("href").'';
                });
                
               
            }  
            foreach($links as $link) {
                $response = $browser->request('GET', 'https://agrostadion.com'.$link);
                $response->filter('.topic .topic__heading')->each(function ($node) use (&$names) {
                     $names[] = $node->text().'';
                });
            }
            dd($names);
        }
   }
?>
  • Вопрос задан
  • 120 просмотров
Решения вопроса 1
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
парсинг это не самая простая задача. И не самая быстрая. По этому нормально что парсинг происходит не очень быстро, а настройки сервера не позволяют довести дело до конца.
Варианты:
1) разбивайте парсер на части, где каждый шаг сохраняет результат в промежуточной таблице с полем "обработано", и вызывайте его последовательно, как отдельные скрипты
2) Отключите ограничение на время работы скрипта, это делается либо в конфиге пхп, либо командой set_time_limit(0); Но возможно что ограничения сервера не позволят вам этого сделать.
3) Запускайте скрипт из консоли, правда придется переписать его так, чтобы лара смогла его запустить, не помню навскидку как там организуется работа с cli скриптами, в других фреймворках часто есть возможность запустить конторллер из командной строки. В зенде вроде есть возможность использовать CliController.
4) Очереди, раббитмкю как вариант. Формируйте очередь из задач, и они будут выполняться одна за другой как отдельные задачи.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@pantsarny
Запускаете Парсинг из консоли
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы