Как понять смысл php скрипта парсинга данных и восстановить его работоспособность?

Ссылка скопирована
1 ответ

Добрый день уважаемые участники ресурса.

Как понять смысл php скрипта парсинга данных и восстановить его работоспособность?
Или видоизменить его содержимое для достижения результата выполнения.

Суть задачи скрипта примерно следующая необходимо используя 2 инструмента и и сами возможности PHP выкачать некоторые данные из сайта доннора к себе на локальный сайт с базой данных.
В проекте использовал :

simple_html_dom.php , который скачал на просторах интернета как готовую библиотеку ( отдельный файл на 1725 строчек кода).

Пытаюсь получать некоторые обьекты используя 2 стратегии
1) Просто создаю переменные в которые уже присваиваю содержимое обьектов, которые загружает себе из хтмл кода сам инструмент curl в слудеющем коде вывод значений этих переменных работает:

include('simple_html_dom.php'); include('db.php');   function curlGetPage($url, $referer = 'https://google.com') { 	 	$ch = curl_init(); 	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);     curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36'); 	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 	curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);     curl_setopt($ch, CURLOPT_URL, $url); 	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);     curl_setopt($ch, CURLOPT_HEADER, 0); 	 	$response = curl_exec($ch); 	return $response; 	curl_close($ch); }  $page = curlGetPage('https://**.**.ua/zaryadni-prystroyi'); $html = str_get_html($page);  $peganavi = $html->find('.pagination',0); echo $peganavi;

include('simple_html_dom.php'); include('db.php'); function curlGetPage($url, $referer = 'https://google.com') { $ch = curl_init(); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36'); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, 0); $response = curl_exec($ch); return $response; curl_close($ch); } $page = curlGetPage('https://**.**.ua/zaryadni-prystroyi'); $html = str_get_html($page); $peganavi = $html->find('.pagination',0); echo $peganavi;

Дальше пытаюсь модифицировать код с пониманием того что пытаюсь уже получать содержимое страницы в массив с обьектами:

include('simple_html_dom.php'); include('db.php');  function curlGetPage($url, $referer = 'https://google.com') { 	 	$ch = curl_init(); 	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);     curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36'); 	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 	curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);     curl_setopt($ch, CURLOPT_URL, $url); 	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);     curl_setopt($ch, CURLOPT_HEADER, 0); 	 	$response = curl_exec($ch); 	return $response; 	curl_close($ch); }  $page = curlGetPage('https://**.**.ua/zaryadni-prystroyi'); $html = str_get_html($page);  $posts = []; foreach ($html->find('.col-6 col-lg-4 col-xl-3 us-item') as $elements) { 	$img = $elements->find('.img-fluid oct-lazy',0);	//класс фото товара 	$link = $elements->find('.us-module-img', 0);// ссылка на пост фид итем товара 	$posts[] = [ 	'img' => $img->src, 	'title' =>trim($link->plaintext), 	'link' => $link->href, 	]; } //print_r($posts); foreach ($posts as $post) {     echo "Image: " . $post['img'] . "<br>";     echo "Title: " . $post['title'] . "<br>";     echo "Link: " . $post['link'] . "<br>";     echo "<br>"; // Add some space between each post's information }

include('simple_html_dom.php'); include('db.php'); function curlGetPage($url, $referer = 'https://google.com') { $ch = curl_init(); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36'); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, 0); $response = curl_exec($ch); return $response; curl_close($ch); } $page = curlGetPage('https://**.**.ua/zaryadni-prystroyi'); $html = str_get_html($page); $posts = []; foreach ($html->find('.col-6 col-lg-4 col-xl-3 us-item') as $elements) { $img = $elements->find('.img-fluid oct-lazy',0); //класс фото товара $link = $elements->find('.us-module-img', 0);// ссылка на пост фид итем товара $posts[] = [ 'img' => $img->src, 'title' =>trim($link->plaintext), 'link' => $link->href, ]; } //print_r($posts); foreach ($posts as $post) { echo "Image: " . $post['img'] . "<br>"; echo "Title: " . $post['title'] . "<br>"; echo "Link: " . $post['link'] . "<br>"; echo "<br>"; // Add some space between each post's information }

Но после вывода этого массива через 180 сек возникает завершение работы скрипта и если расскоментировать //print_r($posts); и закооментировать второй цикл foreach() тогда php выводит просто "Array()". В интернете видел образец кода, владелец которого сам выложил для пользования и утверждает что его код полностью работает. Так что я не нарушаю авторские права. Помогите разобрать логику скрипта и сделать его работоспособным. Слуюещим этапом я планировал этот код модифицировать и попытаться загружать к себе в базу данных данные товара.

Содержимое того что выложил автор в исходниках не совсем похоже с моим кодом. Но может кому то пригодиться там есть все файлы с библиотекой simple_html_dom. https://valerykoretsky.com/demo/parser/parser_demo.zip

PS/
Вероятно могу этими действиями нарушать законодательство прося создать нечто подобное для себя, поэтому закрасил домен символами ** Кто может просто понять разобраться или помочь. Отблагодарю по мере включения этого проекта в стадию работоспособности.

Дополнительно:

А вот эти строчки во втором скрипте для краткости опустили

$page = curlGetPage('https://**.**.ua/zaryadni-prystroyi'); $html = str_get_html($page);

$page = curlGetPage('https://**.**.ua/zaryadni-prystroyi'); $html = str_get_html($page);

или их там реально нет?

  • Антон, Спс что предупредили я не заметил что не успел их скопировать во второй скрипт. Сейчас отредактировал )
  • Inter_GLADOS, ну что тут скажешь... Дебажте скрипт, удостоверяйтесь, что $page содержит страницу того, что вам надо. Потом проверяйте содержимое $html, что там всё загрузилось. Следом что $html->find(....) находит указанные элементы... Ну и т.д., пошагово.

    Мы этого за вас не сделаем.

  • AUser0, так в первом скрипте он то находит элементы в html

    include('simple_html_dom.php');
    include('db.php');

    function curlGetPage($url, $referer = 'https://google.com')
    {

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36');
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, 0);

    $response = curl_exec($ch);
    return $response;
    curl_close($ch);
    }

    $page = curlGetPage('https://**.**.ua/zaryadni-prystroyi');
    $html = str_get_html($page);

    $peganavi = $html->find('.pagination',0);
    echo $peganavi;

    Вот тут он достреливает через find(''); А дальше уже я теряюсь чтото в цикле происходит явно на стороне бекенда. Как задебажить код без IDE вообще не понимаю Пробывал настроить на Visual studio code ничего не выходит.

  • Так селекторы-то разные передаются в метод find() - один находит, другой нет, видимо.
    А дебажить - выводите переменные через print_r(),var_dump() и после die(). Так и увидите, что там внутри.
  • Ответы:

    Но после вывода этого массива через 180 сек возникает завершение работы скрипта

    Используйте не серверный PHP, а консольный.
    Или, как вариант, перезапускать ваш скрипт, сделать вызов самого себя с параметрами.
    Примерно так, не проверял:

    <?php  $x = empty($_GET["x"])?1:$_GET["x"]; file_put_contents("mylog.txt", $x."n", FILE_APPEND); if($x>5) exit(); $x+=1; $ch = curl_init("http://mserver.example.com/script.php?x=".$x); curl_exec($ch); curl_close($ch);

    <?php $x = empty($_GET["x"])?1:$_GET["x"]; file_put_contents("mylog.txt", $x."n", FILE_APPEND); if($x>5) exit(); $x+=1; $ch = curl_init("http://mserver.example.com/script.php?x=".$x); curl_exec($ch); curl_close($ch);

    • Здраствуйте не совсем понял ваше решение Вы мне предложили на внешнем сервере запущенном уже запустить через хостинг этот скрипт ? - что мне этот даст ведь я запустил скрипт проверил его. Но не могу никакой отладки сделать.

      Если я на локалхосте выполняю скрипт через open server locahost сейчас то выполнения скрипта из консоли то мне нужно чтото типо такого прописать? :
      Если я могу только на localhost запустить мне нужно изменить чтото типо
      $ch = curl_init("http://127.0.0.1/script.php?x=".$x);

    • Inter_GLADOS, PHP на сервере - это один раз запустился, быстро отдал ответ и умер.
      Парсинг - это длительная работа.
      Я и предлагаю, запустить не через сервер, а через консоль, то есть просто условно
      php script.php
      Или если нужно всё-таки через сервер, то сделать как-то так, как в ответе.

      Только не копируйте мой пример, нет, это просто направление мысли, скорей всего нужно будет делать через сторонний консольный curl через exec со знаком & в конце для фонового выполнения и в начале скрипта устанавливать время, например, через usleep.
      Хотя нет, , в общем здесь нужно уже думать. Не всё так просто. А, ну почему? usleep(2000000*$x);
      Тогда память будет съедаться и лимит на одновременные подключения закончится...

    • alekssamos, Ну у по вашему примеру у меня создался пустой файл с предупреждениям об отсутствии разных методов из библиотек типо php_PDO.dll
      Я запустил этот код из консоли в новой папке но указал примерно так.
      <?php
      $x = empty($_GET["x"])?1:$_GET["x"];
      file_put_contents("mylog.txt", $x."n", FILE_APPEND);
      if($x>5) exit();
      $x+=1;
      $ch = curl_init("http://127.0.0.1/test.php?x=".$x);
      curl_exec($ch);
      curl_close($ch);
      ?>
      Создался пустой файл mylog.txt.
    • Inter_GLADOS, Во-первых, я написал или, или, но не вместе; во-вторых, в консоле уже не $_GET, а $argv, ну и часть с curl не сработает! В-третьих, это НЕ РАБОЧИЙ ПРИМЕР! НЕ КОПИРУЙ ЕГО!!! Это набросок!

      Надо было бы сделать так
      На сервере!

      $url = "http://mserver.example.com/script.php?x=".$x; shell_exec("curl " . escapeshellarg($url) . " &amp;");

      $url = "http://mserver.example.com/script.php?x=".$x; shell_exec("curl " . escapeshellarg($url) . " &amp;");

      Но нужно будет, говорю же, продумать задержку и всё равно возникнет проблема.

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

      Если только брокер очередей использовать.
      Но его нужно ставить, а значит не любой хостинг подойдёт, только выделенный сервер, только линукс, скорее всего, да и скрипты уже не будут переносимыми, значит придётся использовать докер и так далее...

      Python, всё же, будет лучше.

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Антон С. Ответ

    Для понимания смысла PHP скрипта парсинга данных и восстановления его работоспособности, необходимо провести следующие шаги:

    1. Изучение кода: Внимательно прочитайте весь скрипт, понимая, какие переменные используются, какие функции вызываются, какие данные обрабатываются. Попробуйте разобраться в логике работы скрипта.

    2. Проверка синтаксиса: Убедитесь, что весь код написан корректно с точки зрения синтаксиса PHP. Проверьте наличие ошибок, опечаток и пропущенных символов.

    3. Проверка подключенных файлов: Удостоверьтесь, что все необходимые файлы (библиотеки, классы и т.д.) подключены корректно и доступны скрипту.

    4. Проверка переменных: Проверьте значения переменных, которые передаются в функции или используются в вычислениях. Удостоверьтесь, что они содержат корректные данные и не вызывают ошибок.

    5. Отладка: Используйте инструменты отладки PHP, такие как Xdebug, для поиска ошибок в коде. Установите точки останова и просмотрите значения переменных на каждом шаге выполнения скрипта.

    6. Тестирование: После внесения изменений и исправлений в код, протестируйте скрипт на различных тестовых данных, чтобы убедиться в его корректной работоспособности.

    Применяя вышеперечисленные шаги, вы сможете разобраться в смысле PHP скрипта парсинга данных и восстановить его работоспособность. Важно быть терпеливым и методично подходить к решению проблемы, чтобы успешно восстановить функциональность скрипта.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно