[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Парсер для магазина
kap
Изучаю PHP, написал парсер для ИМ (Curl, phpQuery). Парсит 200 товаров и дальше не хватает памяти.
Т.к. пишу скрипт первый раз, то само собой все неоптимизировано.
Подскажите основные проблемы, что лучше делать по другому. Не прошу досканально разбирать скрипт, просто может поверхностно что-то можно сказать...

<?php
require ('phpQuery/phpQuery.php');

//-- устанавливаем соединение с базой и выставляем кодировку
$db = mysql_connect ("localhost","user","qwerty");
mysql_select_db ("db_shop",$db) or die("Could not select database");

$url = "http://www.style-ok.ru/"; //ссылка на главную страницу сайта
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT, 3);
curl_setopt($ch, CURLOPT_POST, 0);
$result = curl_exec($ch);

$document = phpQuery::newDocument($result);
$hentr = $document->find('ul#menu');

//-- вычисляем максимальное количество категорий в таблице
$select1 = mysql_query ("SELECT MAX(category_id) AS category_id FROM oc_test_category");
$row1 = mysql_fetch_array($select1);
$id_category = $row1[0]+1; // id для категорий
$date_time = date('Y-m-d h:i:s');


//-- вычисляем максимальный номер товара в таблице
$select3 = mysql_query ("SELECT MAX(product_id) AS product_id FROM oc_test_product");
$row3 = mysql_fetch_array($select3);
$id_product = $row3[0]+1; // id для товара


$o = 1; // счетчик для артикула

$x = 'li#m_';
echo '<ul>';
for ($i=8; $i<=8; $i++)
{
$m = $x.$i;
$hentry = pq($hentr)->find($m);
$category_1 = pq($hentry)->find('a.drop');
$category_1_text = pq($category_1)->text(); //-- название корневой категории
$category_1_link = pq($category_1)->attr('href'); //-- ссылка на корневую категорию

$id_category2 = $id_category+1;
echo '<li>';
echo $category_1_text;
echo " (id = $id_category)";
echo '<br>';
echo '<ul>';


$category_2_li = pq($hentry)->find('li');
$category_2 = pq($category_2_li)->find('a');
foreach ($category_2 as $category_2) {
$category_2_text = pq($category_2)->text(); //-- название подкатегории
$category_2_link = pq($category_2)->attr('href'); //-- ссылка на подкатегорию
//добавление категории второго уровня


echo '<li>';
echo $category_2_text;
echo " (id = $id_category2)";
echo '</li>';
$id_category2++;

$url2 = $url.$category_2_link; // ссылка на страницу подкатегории
$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_URL,$url2);
curl_setopt($ch2, CURLOPT_FAILONERROR, 1);
curl_setopt($ch2, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch2, CURLOPT_TIMEOUT, 3);
curl_setopt($ch2, CURLOPT_POST, 0);
$result2 = curl_exec($ch2);

$manufacturers_block = phpQuery::newDocument($result2)->find('div.block-manufacturers'); // Блок с производителями на странице категории
$manufacturer = pq($manufacturers_block)->find('a.title');

foreach ($manufacturer as $manufacturer) {
$manufacturer_text = pq($manufacturer)->text(); //-- название производителя
$manufacturer_href = pq($manufacturer)->attr('href');
$manufacturer_link = $url.$manufacturer_href;

echo '<span style="font-weight: bold; margin-left: 30px;">';
echo $manufacturer_text;
echo '</span>';
echo " (ссылка - $manufacturer_link)";
echo '<br>';



$ch3 = curl_init();
curl_setopt($ch3, CURLOPT_URL,$manufacturer_link);
curl_setopt($ch3, CURLOPT_FAILONERROR, 1);
curl_setopt($ch3, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch3, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch3, CURLOPT_TIMEOUT, 3);
curl_setopt($ch3, CURLOPT_POST, 0);
$result3 = curl_exec($ch3);

$document3 = phpQuery::newDocument($result3);

$main_block = $document3->find('div.MiddleCenter');
$pages_block = pq($main_block)->find('div.padding6px'); // блок с количеством страниц товаров
$pages = pq($pages_block)->text();
$pieces = explode(" ", $pages);

// Если есть блок с количеством страниц в категории, то перелистываем все категории, иначе страница с товаром одна
if (isset($pieces[3])) {
$pages_block_a = pq($pages_block)->find('a');
$pages_href = pq($pages_block_a)->attr('href');

$pattern = '/(.*)\?\manf=\d+&pn_pr=/';
preg_match($pattern, $pages_href, $matches);
echo '<span style="margin-left: 60px;">';
echo "У данного производителя $pieces[3] стр. с товаром";
echo '</span>';
echo '<br>';
for ($i=1; $i<=$pieces[3]; $i++) {
$link_cat = $url.$matches[0].$i;
echo '<span style="margin-left: 90px;">';
echo $link_cat;
echo '</span>';
echo '<br>';

$ch4 = curl_init();
curl_setopt($ch4, CURLOPT_URL,$link_cat);
curl_setopt($ch4, CURLOPT_FAILONERROR, 1);
curl_setopt($ch4, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch4, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch4, CURLOPT_TIMEOUT, 3);
curl_setopt($ch4, CURLOPT_POST, 0);
$result4 = curl_exec($ch4);
$document4 = phpQuery::newDocument($result4);
$main_block2 = $document4->find('div.MiddleCenter');
$item_block = $main_block2->find('td.padding10px ');
$item_title_block = $item_block->find('a.bigtitle');

// ищем блоки с товаром, переходим на страницу товара для дальнейшего парсинга

foreach ($item_title_block as $item_title_block) {
$general_url = "http://www.style-ok.ru";
$item_title = pq($item_title_block)->text();
$item_a = pq($item_title_block)->attr('href');
$item_link = $url.$item_a;
echo '<span style="margin-left: 150px;">';
echo "$item_title (ссылка - $item_link)";
echo '</span>';
echo '<br>';

$ch5 = curl_init();
curl_setopt($ch5, CURLOPT_URL,$item_link);
curl_setopt($ch5, CURLOPT_FAILONERROR, 1);
curl_setopt($ch5, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch5, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch5, CURLOPT_TIMEOUT, 3);
curl_setopt($ch5, CURLOPT_POST, 0);
$result5 = curl_exec($ch5);

$document5 = phpQuery::newDocument($result5);

// поиск названия товара
$title_block = $document5->find('h1');
$title = pq($title_block)->text();

// поиск цены товара
$price_block = $document5->find('div.priceBlock');
$price_span = $price_block->find('span.price');
$price_all = pq($price_span)->text();
$price = explode(" ", $price_all);
$my_price = round($price[0]*1.4); // цена товара с наценкой

// поиск описания товара

$description_block = $document5->find('div#desc_data');
$description_block2 = $description_block->find('div.padding10px');
$description_block3 = $description_block2->find('div');
$description = pq($description_block3)->html();
$desc = explode("<b>", $description);
$string = iconv("windows-1251","utf-8",$desc[0]);
$desc2 = htmlspecialchars("$string", ENT_QUOTES);


// поиск изображение товара
$img_block = $document5->find('a#blackImg');
$img_a = pq($img_block)->attr('href');
$img_link = $general_url.$img_a; // полная ссылка на изображение товара


if ($price[0]==0) { // проверка наличия цены на товар
echo "Нет такого товара в магазине!";
}
else {
// артикул товара типа JAG00001
$model_word = strtoupper(substr("$manufacturer_text", 0, 3));
$model_digit = vsprintf("%05s", $o);
$model = $model_word.$model_digit;

// изображение товара
$images_product_link = "$img_link";
$images_product_name1 = explode("/", $img_link);
$images_product_name = end($images_product_name1);


echo "Название - $title (id - $id_product)";
echo "<br>";
echo "Артикул - $model";
echo "<br>";
echo "Цена - $my_price руб. ($price руб.)";
echo "<br>";
echo "<br>";
echo "$desc2";
echo "<br>";
echo "<br>";
echo "<br>";


}

$id_product++;
curl_close($ch5);
$o++;

}

curl_close($ch4);
}
}


else {
$main_block2 = $document3->find('div.MiddleCenter');
$item_block = $main_block2->find('td.padding10px ');
$item_title_block = $item_block->find('a.bigtitle');

// ищем блоки с товаром, переходим на страницу товара для дальнейшего парсинга

foreach ($item_title_block as $item_title_block) {
$general_url = "http://www.style-ok.ru";
$item_title = pq($item_title_block)->text();
$item_a = pq($item_title_block)->attr('href');
$item_link = $url.$item_a;
echo '<span style="margin-left: 150px;">';
echo "$item_title (ссылка - $item_link)";
echo '</span>';
echo '<br>';

$ch5 = curl_init();
curl_setopt($ch5, CURLOPT_URL,$item_link);
curl_setopt($ch5, CURLOPT_FAILONERROR, 1);
curl_setopt($ch5, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch5, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch5, CURLOPT_TIMEOUT, 3);
curl_setopt($ch5, CURLOPT_POST, 0);
$result5 = curl_exec($ch5);

$document5 = phpQuery::newDocument($result5);

// поиск названия товара
$title_block = $document5->find('h1');
$title = pq($title_block)->text();

// поиск цены товара
$price_block = $document5->find('div.priceBlock');
$price_span = $price_block->find('span.price');
$price_all = pq($price_span)->text();
$price = explode(" ", $price_all);
$my_price = round($price[0]*1.4); // цена товара с наценкой

// поиск описания товара

$description_block = $document5->find('div#desc_data');
$description_block2 = $description_block->find('div.padding10px');
$description_block3 = $description_block2->find('div');
$description = pq($description_block3)->html();
$desc = explode("<b>", $description);
$string = iconv("windows-1251","utf-8",$desc[0]);
$desc2 = htmlspecialchars("$string", ENT_QUOTES);


// поиск изображение товара
$img_block = $document5->find('a#blackImg');
$img_a = pq($img_block)->attr('href');
$img_link = $general_url.$img_a; // полная ссылка на изображение товара


if ($price[0]==0) { // проверка наличия цены на товар
echo "Нет такого товара в магазине!";
}
else {
// артикул товара типа JAG00001
$model_word = strtoupper(substr("$manufacturer_text", 0, 3));
$model_digit = vsprintf("%05s", $o);
$model = $model_word.$model_digit;

// изображение товара
$images_product_link = "$img_link";
$images_product_name1 = explode("/", $img_link);
$images_product_name = end($images_product_name1);


echo "Название - $title (id - $id_product)";
echo "<br>";
echo "Артикул - $model";
echo "<br>";
echo "Цена - $my_price руб. ($price руб.)";
echo "<br>";
echo "<br>";
echo "$desc2";
echo "<br>";
echo "<br>";
echo "<br>";


}

$id_product++;
curl_close($ch5);
$o++;

}

}



curl_close($ch3);


}

}

echo '</ul>';
echo '</li>';
echo '</ul>';
echo '</li>';
$id_category = $id_category2;
}
echo '</ul>';

curl_close($ch);
?>
Быстрый ответ:

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