[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Парсер с Юлы бесконечно висит
syr10t
Здравствуйте.
Помогите пожалуйста советом, в чём может быть ошибка.

Пишу парсер товаров с Юлы.
Скрипт должен собрать информацию о всех товарах от определенного продавца с, например, этой страницы - https://youla.io/user/587f5b5a479e75460f8c9ed0 .

На этой странице выводится список из 40 товаров и далее должен быть переход на следующие страницы.

В скрипте используется библиотека PHP Simple HTML DOM Parser
Сделал цикл, который с первой страницы собирает все 40 товаров. Это работает.
Далее вложил этот цикл в другой, который должен обойти все страницы.
И после появления этого внешнего цикла для перебора всех страниц продавца с сорока товарами на каждой странице - происходит бесконечная загрузка скрипта, он подвисает на бесконечное время (ждал выполнения по несколько часов, ничего не дождался). Хотя товаров не очень много, в пределах 1000. Подозреваю, или ошибка в коде с циклом, который ПОЧЕМУ-ТО получился бесконечным или сайт Юлы стал блокировать запросы из-за их большого количества. Собственно по счетчику пробовал ограничивать сборку товаров - если указать выход из цикла после сборки 80 товаров (двух страниц) - работает без зависания и собирает 80 товаров/2 страницы. Если уже указать выход из цикла после 120 товаров - тут висит.

Вот код:



&#65279;<?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>";

?>

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.