Помогите пожалуйста советом, в чём может быть ошибка.
Пишу парсер товаров с Юлы.
Скрипт должен собрать информацию о всех товарах от определенного продавца с, например, этой страницы - https://youla.io/user/587f5b5a479e75460f8c9ed0 .
На этой странице выводится список из 40 товаров и далее должен быть переход на следующие страницы.
В скрипте используется библиотека PHP Simple HTML DOM Parser
Сделал цикл, который с первой страницы собирает все 40 товаров. Это работает.
Далее вложил этот цикл в другой, который должен обойти все страницы.
И после появления этого внешнего цикла для перебора всех страниц продавца с сорока товарами на каждой странице - происходит бесконечная загрузка скрипта, он подвисает на бесконечное время (ждал выполнения по несколько часов, ничего не дождался). Хотя товаров не очень много, в пределах 1000. Подозреваю, или ошибка в коде с циклом, который ПОЧЕМУ-ТО получился бесконечным или сайт Юлы стал блокировать запросы из-за их большого количества. Собственно по счетчику пробовал ограничивать сборку товаров - если указать выход из цикла после сборки 80 товаров (двух страниц) - работает без зависания и собирает 80 товаров/2 страницы. Если уже указать выход из цикла после 120 товаров - тут висит.
Вот код:
<?php
require_once 'modules/simplehtmldom/simple_html_dom.php';
$page_start_html = <<<page_start
<html>
<head>
<title>титле</title></head>
<body>
<h1 style=" text-align: center; color: red; ">титле</h1>
page_start;
$trader_page_link = "тут страница продавца на юле";
$trader_pages = array();
$trader_pages[] = file_get_html($trader_page_link);
$trader_page_current = current($trader_pages);
while ($trader_page_next = $trader_page_current->find("._paginator_next_button"))
{
$trader_page_next_link = $trader_page_next[0]->href;
$trader_pages[] = file_get_html($trader_page_next_link);
next($trader_pages);
$trader_page_current = current($trader_pages);
}
$table_head_html = <<<table_head
<p><table border=5>
<tr>
<td style=" width: 50 ">#</td>
<td style=" width: 150 ">Артикул</td>
<td style=" width: 300 ">Наименование</td>
<td style=" width: 200 ">Категория</td>
<td style=" width: 80 ">Цена</td>
<td style=" width: 500 ">Картинки</td>
<td style=" width: 10 ">Количество</td></tr>
table_head;
$i = 1;
echo $page_start_html . $table_head_html ;
foreach ($trader_pages as $trader_some_page_key=>$trader_some_page) // после добавления этого внешнего цикла началась проблема
{
If ($products = $trader_some_page->find("li[class=product_item]"))
{
// echo count($products[0]->children); тут всего 1 дочерний элемент, у каждого товара в списке товаров только один дочерний элемент - ссылка на страницу товара
// этот цикл собирает по 40 товаров с каждой страницы. Пока над ним не было внешнего цикла для перебора всех страниц продавца,
// он без проблем собирал ровно 40 товаров только с 1-й страницы и всё. Сейчас - собирает максимум 80 товаров.
foreach($products as $key=>$value)
{
$product_link = "https://youla.io" . $products[$key]->children[0]->href;
$product_page = file_get_html($product_link);
$vendor_code_temp = mb_stristr($product_text[0]->plaintext, "артикул");
$vendor_code = trim(substr($vendor_code_temp, 15));
echo "\r\n" . "<tr>";
echo "<td>" . $i . "</td>";
echo "<td>" . $vendor_code . "</td>";
$product_title_temp = $product_page->find("h1[class=product__title]");
$product_title = trim($product_title_temp[0]->plaintext);
echo "<td>" . $product_title . "</td>";
$category_items = $product_page->find("li[class=breadcrumbs_list__item]");
$category_items_count = count($category_items);
// - 2 потому что минус последний пункт (там - не категория, а повторение названия товара) и минус из-за старта с 0
$original_product_category = trim($category_items[$category_items_count - 2]->plaintext);
// для родительской категории - еще один минус
$original_product_category_parent = trim($category_items[$category_items_count - 3]->plaintext);
switch ($original_product_category)
{
// тут еще не дописано
default:
$product_category = "Разное";
break;
}
echo "<td>" . $product_category . "</td>";
$product_price_text = $product_page->find(".product__price");
$product_price_temp = explode(" ", $product_price_text[0]->plaintext);
$product_price = trim($product_price_temp[0]);
$product_price = str_replace(" ", "", $product_price);
echo "<td>" . $product_price . "</td>";
$product_images = $product_page->find("img[class=\"item-class product_gallery__item\"]");
$product_images_links = "";
If (count($product_images) == 1)
{
$img_small_src = $product_images[0]->src;
$img_src_temp = explode("/160_160_out/", $img_small_src);
$img_src = $img_src_temp[0] . "/720_720_out/" . $img_src_temp[1];
$product_images_links = $img_src;
}
Else
{
foreach($product_images as $key2=>$value2)
{
If ($product_images_links == "")
{
$img_small_src = $product_images[$key2]->src;
$img_src_temp = explode("/160_160_out/", $img_small_src);
$img_src = $img_src_temp[0] . "/720_720_out/" . $img_src_temp[1];
$product_images_links = $img_src;
}
Else
{
$img_small_src = $product_images[$key2]->src;
$img_src_temp = explode("/160_160_out/", $img_small_src);
$img_src = $img_src_temp[0] . "/720_720_out/" . $img_src_temp[1];
$product_images_links .= ", " . $img_src;
}
}
}
$product_images_links = trim($product_images_links);
echo "<td>" . $product_images_links . "</td>";
$product_quantity = 1;
echo "<td>" . $product_quantity . "</td>";
$product_page->clear();
echo "</tr>";
$i++;
// sleep(15); // тут пробовал делать таймаут, в том числе по 30 секунд, чтобы Юла не блокировала запросы - не помогает
}
}
Else
{
exit("The End");
}
$trader_some_page->clear();
if ($i == 121)
break;
}
echo "</table><p>";
echo "</body></html>";
?>