[ Сообщений: 7 ] 
Начать новую тему Ответить на тему
Автор Сообщение
СообщениеДобавлено: 02 фев 2007, 17:58 
Аватара пользователя

Сообщения: 5
Поблагодарили: 0 раз.
Вот мой парсер, лог его работы:

22:17:51: Начало работы
22:19:22: Получил данный XML (22996) кб.
22:19:34: Обработал XML данные
22:23:29: Сохранил товары
22:23:29: Сохранил брэнды
22:23:29: Сохранил адверты
22:23:30: Сохранил категории
22:23:30: Завершено

как видите, работает давольно быстро, а вот сам код:


xmlParse.inc.php
Код:
<?php
function xml2array($contents, $get_attributes=1) {
    if(!$contents) return array();

    if(!function_exists('xml_parser_create')) {
        //print "'xml_parser_create()' function not found!";
        return array();
    }
    //Get the XML parser of PHP - PHP must have this module for the parser to work
    $parser = xml_parser_create();
    xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, 0 );
    xml_parser_set_option( $parser, XML_OPTION_SKIP_WHITE, 1 );
    xml_parse_into_struct( $parser, $contents, $xml_values );
    xml_parser_free( $parser );

    if(!$xml_values) return;//Hmm...

    //Initializations
    $xml_array = array();
    $parents = array();
    $opened_tags = array();
    $arr = array();

    $current = &$xml_array;

    //Go through the tags.
    foreach($xml_values as $data) {
        unset($attributes,$value);//Remove existing values, or there will be trouble
        extract($data);//We could use the array by itself, but this cooler.

        $result = '';
        if($get_attributes) {//The second argument of the function decides this.
            $result = array();
            if(isset($value)) $result['value'] = $value;

            //Set the attributes too.
            if(isset($attributes)) {
                foreach($attributes as $attr => $val) {
                    if($get_attributes == 1) $result['attr'][$attr] = $val; //Set all the attributes in a array called 'attr'
                    /**  :TODO: should we change the key name to '_attr'? Someone may use the tagname 'attr'. Same goes for 'value' too */
                }
            }
        } elseif(isset($value)) {
            $result = $value;
        }

        //See tag status and do the needed.
        if($type == "open") {//The starting of the tag '<tag>'
            $parent[$level-1] = &$current;

            if(!is_array($current) or (!in_array($tag, array_keys($current)))) { //Insert New tag
                $current[$tag] = $result;
                $current = &$current[$tag];

            } else { //There was another element with the same tag name
                if(isset($current[$tag][0])) {
                    array_push($current[$tag], $result);
                } else {
                    $current[$tag] = array($current[$tag],$result);
                }
                $last = count($current[$tag]) - 1;
                $current = &$current[$tag][$last];
            }

        } elseif($type == "complete") { //Tags that ends in 1 line '<tag />'
            //See if the key is already taken.
            if(!isset($current[$tag])) { //New Key
                $current[$tag] = $result;

            } else { //If taken, put all things inside a list(array)
                if((is_array($current[$tag]) and $get_attributes == 0)//If it is already an array...
                        or (isset($current[$tag][0]) and is_array($current[$tag][0]) and $get_attributes == 1)) {
                    array_push($current[$tag],$result); // ...push the new element into that array.
                } else { //If it is not an array...
                    $current[$tag] = array($current[$tag],$result); //...Make it an array using using the existing value and the new value
                }
            }

        } elseif($type == 'close') { //End of tag '</tag>'
            $current = &$parent[$level-1];
        }
    }

    return($xml_array);
}

?>



parser.php
Код:
<?
set_time_limit(360);
ignore_user_abort(1);
include("xmlParse.inc.php");

function getXml()
{


   $handle = fopen ("http://mixmarket.biz/mixml.plx?id=xxxxxxxxx", "r");

   if (!$handle)
      return;

   while (!feof ($handle))
   {
      $buffer .= fgets($handle, 4096);
   }
   fclose ($handle);

return $buffer;
}



function updateCateg($data)
{

   $data = $data[mixml][categories][category];

   _m_q("truncate table categ");
   $so = sizeof($data);
   for ($a=0;$a<$so;$a++)
   {
      $cur = $data[$a];
      $catId = $cur[attr][id];
      $parentId = $cur[attr][parentId];
      $catName = utf8win1251($cur[value]);
      _m_q("запрос на вставку в базу");

   }
return $so;

}




$xml = getXml();

$data = xml2array($xml,1);

echo "Update Advert: ";flush();
$so = updateAdvert($data);
echo " ($so) [ OK ] <br>\n";flush();

// дальше поочереди запуск функция для обработки товаров, категорий итд...

?>


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

Не судите строго, первый парсер для работы с mix. думаю в будущем сделаю его еще быстрее и лучше.

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

Последний раз редактировалось geosub 02 фев 2007, 19:13, всего редактировалось 1 раз.
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 30 сен 2010, 22:27 
Аватара пользователя

Сообщения: 1
Поблагодарили: 0 раз.
немного изменил файл parser.

для наглядности будет виден сразу вывод информации:


Код:
<?
set_time_limit(360);
ignore_user_abort(1);
include("xmlParse.inc.php");

function getXml()
{
   $handle = fopen ("http://price.mixmarket.biz/mixml.plx?id=xxxxxxxxxx", "r");
   if (!$handle)
      return;
   while (!feof ($handle))
   {
      $buffer .= fgets($handle, 4096);
   }
   fclose ($handle);
return $buffer;
}

function updateCateg($data)
{
   $data = $data[mixml][offers][offer];
   $so = sizeof($data);
   for ($a=0; $a<$so; $a++)
      { $s++ ;
      $cur = $data[$a];
      $catId = $cur[attr][id];
     $name = $cur[name];
   }
return $so;
}


$xml = getXml();
$data = xml2array($xml, 0);
$so = updateCateg($data);


?>


Меняя в строке
Код:
$data = xml2array($xml, 0);
0 на 1, можно переключать вывод общих строк или их параметры. Пока объеденить у меня не получилось. Но работаю над этим ..

Спасибо, geosub за рабочий код ! )

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 01 окт 2010, 20:03 
Аватара пользователя

Сообщения: 59
Поблагодарили: 5 раз.
А с большими файлами на сколько отработает быстро? К примеру, если включить все товары своего-магазина по всем реклам, то насколько быстро отработает, включая вставку в базу. И еще бы хорошо иметь данные по машине, на которой тестировалось.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 25 мар 2011, 18:59 
Аватара пользователя

Сообщения: 3
Поблагодарили: 0 раз.
А с большими он загибается ест-но, по Allowed memory size.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 25 мар 2011, 21:29 
Аватара пользователя

Сообщения: 59
Поблагодарили: 5 раз.
Я сразу не заметил. Конечно тяжко ему, ведь буфер в ОЗУ. Если прайс, скажем, метров 100 - то 100 метров в ОЗУ засунуть - надо еще умудриться.
Такие разборщики надо юзать при небольших по размеру прайсах и при небольшом числе таких небольших прайсов.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 01 апр 2011, 21:20 
Аватара пользователя

Сообщения: 3
Поблагодарили: 0 раз.
Я "домучил" свой вариант sax парсера, на пхп. 22 мега обрабатывает за 60-65 сек, с засылкой в бд + многочислеными проверками, на стареньком атлоне 3600+. Это так, для справки.
---
Обработка:advertizers
Обработка:regions_delivery
Обработка:regions
Обработка:regions_geotarget
Обработка:adv_region_geotarget
Обработка:currencies
Обработка:brands
Обработка:categories
конец, время выполнения= 62
--
теперь осталось магазин добить.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 13 июн 2011, 19:51 
Аватара пользователя

Сообщения: 59
Поблагодарили: 5 раз.
repair, не, нужно замерить, скажем, 250 прайсов и посомтреть на ресурсы машины во время работы (предполагается, что разборщик работает на том же хосте, на котором располагается сайт (сайты). И разбирать прайс-листы не минимальные по объему, а такие, как у викимарта, к примеру.
Я не пиписькой мерююсь, я просто хочу подсказать ориентир, на который нужно стремиться. Иначе можно загнать себя в такой тупик, выходом из которого будет лишь один способ: полная смена алгоритма парсера прайс-листа.

Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему
 [ Сообщений: 7 ] 

   Похожие темы   Ответы   Автор   Просмотры   Последнее сообщение 
В этой теме нет новых непрочитанных сообщений. "Поддержка" - новый дизайн, добавление файлов

в форуме Миксмаркет в развитии

0

mager

6568

27 дек 2010, 14:31

mager Перейти к последнему сообщению

В этой теме нет новых непрочитанных сообщений. Формируем народную базу знаний по интернет-маркетингу

в форуме Миксмаркет в развитии

0

mgarkunov

8819

05 июл 2012, 15:14

mgarkunov Перейти к последнему сообщению

В этой теме нет новых непрочитанных сообщений. Пример кода

в форуме Микс-Юни

3

lin178

3882

07 авг 2012, 15:33

lin178 Перейти к последнему сообщению



Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения


О проекте Новости Пресса о нас Сотрудничество Вакансии Контакты
2005–2011 Партнерская сеть Миксмаркет
Разработка сайта — iji-design / AdLabs
Powered by phpBB Group