За последние 24 часа нас посетил 5941 программист и 555 роботов. Сейчас ищут 267 программистов ...

Парсер цен

Тема в разделе "Сделайте за меня", создана пользователем Voprosovich, 2 окт 2018.

  1. Voprosovich

    Voprosovich Новичок

    С нами с:
    26 сен 2018
    Сообщения:
    21
    Симпатии:
    0
    В php файле таблица (разделители столбцов TAB'ы, а переход на др. строку "CRLF"):
    Цены URL Название товара
    Функция site.ru/123 Товар такой-то 214

    ФУНКЦИИ ДОЛЖНЫ ВОЗВРАЩАТЬ ЦЕНЫ из <price>...</price>, если найден одинаковый URL из страницы site.ru/ceny с offer'ами:
    <offer id="123">
    <url>site.ru/123</url>
    <price>4100</price>
    </offer>
    ...
    Для 1го товара URL совпал, =>
    4100 site.ru/123 Товар такой-то 214
     
    #1 Voprosovich, 2 окт 2018
    Последнее редактирование: 2 окт 2018
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    11.983
    Симпатии:
    1.709
    Адрес:
    :сердА
    Парсерщики, говорят, должны страдать. Но коль уж тут проблема с конкретным файлом, то почему бы не искать в нем ничего, а написать функцию, которая его растащит на массивы(2 строки, реально) и не бомбануть в БД это дело?
     
    Voprosovich нравится это.
  3. Voprosovich

    Voprosovich Новичок

    С нами с:
    26 сен 2018
    Сообщения:
    21
    Симпатии:
    0
    Похоже я буду страдать в двойне)) тк я и функцию не могу написать. Хотя что мне нужен именно парсер, я только на 5й день понял. В БД доступ есть, но это еще сложнее будет, чем просто вывести. Да и в нашей БД сайта нет URL - их формирует сайт как-то налету

    Нашел парсер, который по регулярке вытаскивает что нужно, но только 1-ую цену и без сравнения с URL:
    $text = file_get_contents( 'https://site.ru/ceny' );
    preg_match( '/<price>(.*?)<\\/price>/is' , $text , $price );
    echo $price[1];
     
  4. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    11.983
    Симпатии:
    1.709
    Адрес:
    :сердА
    Для начала, как формируется файл? Источник?
     
  5. Valick

    Valick Новичок

    С нами с:
    12 авг 2018
    Сообщения:
    398
    Симпатии:
    81
    сильно сомневаюсь
    @Voprosovich, вам проще всего нанять программиста, который достанет из БД всю информацию в надлежащем виде.
     
  6. Voprosovich

    Voprosovich Новичок

    С нами с:
    26 сен 2018
    Сообщения:
    21
    Симпатии:
    0
    Файл источник - YML файл для яндекс маркет, он по типу XML и генерируется из самописной php с костылями, делающая запросы в БД. YML.php так же как-то генерит URL по тому же принципу что и сайт. В БД сайта 100% нет урлов, уже смотрел, но именно URL - единственный параметр для сбора таблицы. Сайт на древнем open cart - даже версию не показывает

    Вот что я придумал, найдя функцию сравнению без учета регистра strcasecmp();
    Код (Text):
    1. function cenY (){
    2. $text = file_get_contents( 'https://site.ru/ceny' );
    3. preg_match( '/<price>(.*?)<\\/price>/is' , $text , $price );
    4.  
    5. $URL= "$price[1] - но это не правильно, тк только 1-ое найденная цена, а не все";
    6. $URL1= "не знаю как адресовать к соседней ячейке таблицы отделенной только 1 ТАБом";
    7. if (strcasecmp($URL, $URL1) == 0) :
    8. $cena = $price[1]; endif;
    9. echo $cena;
    10. }
    11. cenY();
    cenY(); - как раз подставлять в таблицу
    ПС: только не пинайте больно, тк не программист.
     
    #6 Voprosovich, 2 окт 2018
    Последнее редактирование: 2 окт 2018
  7. Voprosovich

    Voprosovich Новичок

    С нами с:
    26 сен 2018
    Сообщения:
    21
    Симпатии:
    0
    Только не закрывайте пока тему, функция пока не работает тк я не знаю как собрать переменные URL для сравнения:
    $URL= "$price[1] - но это не правильно, тк только 1-ое найденная цена, а не все";
    $URL1= "не знаю как адресовать к соседней ячейке таблицы отделенной только 1 ТАБом";
     
  8. nospiou

    nospiou Активный пользователь

    С нами с:
    4 фев 2018
    Сообщения:
    2.883
    Симпатии:
    398
    Voprosovich нравится это.
  9. Voprosovich

    Voprosovich Новичок

    С нами с:
    26 сен 2018
    Сообщения:
    21
    Симпатии:
    0
    @nospiou Спасибо. Функция simplexml_load_string может работать и с YML разобрав в массив. Вот что я получаю (часть одного из offer's):
    Код (Text):
    1. [id] => 123
    2.                                             [type] => vendor.model
    3.                                             [available] => true
    4.                                         )
    5.  
    6.                                     [url] => site.ru/123
    7.                                     [price] => 4100
    8.                                     [currencyId] => RUB
    По запросу:

    Код (Text):
    1. $string = file_get_contents( 'site.ru/ceny' );
    2. $xml = simplexml_load_string($string);
    3. print_r($xml);
    Но как выводить только цены и урлы, отсеяв лишнее, чтобы потом по ним сравнивать и использовать цены?
     
  10. nospiou

    nospiou Активный пользователь

    С нами с:
    4 фев 2018
    Сообщения:
    2.883
    Симпатии:
    398
    PHP:
    1.    foreach($items as $key => $item) {
    2.       if ( $item['price'] === '......' && $item['url'] === '....')  echo $key;
    3.    }
     
  11. Voprosovich

    Voprosovich Новичок

    С нами с:
    26 сен 2018
    Сообщения:
    21
    Симпатии:
    0
    Ошибка:
    Invalid argument supplied for foreach() :5

    Не понимаю что значит ===, точки в кавычках и почему две переменные одинаковые $item
     
  12. nospiou

    nospiou Активный пользователь

    С нами с:
    4 фев 2018
    Сообщения:
    2.883
    Симпатии:
    398
    Voprosovich нравится это.
  13. Voprosovich

    Voprosovich Новичок

    С нами с:
    26 сен 2018
    Сообщения:
    21
    Симпатии:
    0
    Да, пока туповат. Дома почитаю, скажите, получу отфильтрованный список из массива с ценами и урлами, как дальше выполнять выборку и вывод цены на основе совпадающих URL (2й URL для сравнения лежит от функции справа через символ табуляции. Чтобы сразу читать так читать
     
  14. nospiou

    nospiou Активный пользователь

    С нами с:
    4 фев 2018
    Сообщения:
    2.883
    Симпатии:
    398
    Так вот о чем ты писал...
    PHP:
    1. $item['url'] === str_getcsv($str, "\t")[1]
    2. //или
    3. $item['url'] === explode($str, "\t")[1]
     
  15. ofroke

    ofroke Новичок

    С нами с:
    6 окт 2018
    Сообщения:
    2
    Симпатии:
    0
    $text = file_get_contents( 'https://site.ru/ceny' );
    preg_match_all( "#<price>(.*?)<\/price>#si' , $text , $result);

    вырежит все данные из тэгов price.

    print_r($result);
     
  16. Voprosovich

    Voprosovich Новичок

    С нами с:
    26 сен 2018
    Сообщения:
    21
    Симпатии:
    0
    $string = file_get_contents( 'site.ru/ceny' );
    $items = simplexml_load_string($string);
    print_r($items);
    выводит массив, где последний товар (всего их несколько тысяч):
    Код (Text):
    1.                             [626] => SimpleXMLElement Object
    2.                                 (
    3.                                     [@attributes] => Array
    4.                                         (
    5.                                             [id] => 61709
    6.                                             [type] => vendor.model
    7.                                             [available] => true
    8.                                         )
    9.                                     [url] => https://'site.ru/123123.html
    10.                                     [price] => 5380
    11.                                     [currencyId] => RUB
    12.                                     [categoryId] => 338
    13.                                     [market_category] => не назначена
    14.                                     [picture] => https://site.ru/image/data/products/55e3c19c039c683354ea32a45ebed00c.jpg
    15.                                     [description] => Предназначен для монтажа в тонкую стяжку, плиточный клей или наливной пол.
    16.                                     [store] => true
    17.                                     [pickup] => true
    18.                                     [delivery] => true
    19.                                     [delivery-options] => SimpleXMLElement Object
    20.                                         (
    21.                                             [option] => SimpleXMLElement Object
    22.                                                 (
    23.                                                     [@attributes] => Array
    24.                                                         (
    25.                                                             [cost] => 200
    26.                                                             [days] => 0-2
    27.                                                         )
    28.                                                 )
    29.                                         )
    30.                                     [typePrefix] => Комплект теплого пола
    31.                                     [vendor] => CALEO
    32.                                     [model] => EASYMAT 140-0.5-5,0
    33.                                     [sales_notes] => Выдаем дисконтную карту со скидкой до покупок.
    34.                                     [param] => Array
    35.                                         (
    36.                                             [0] => Россия
    37.                                             [1] => кабель
    38.                                             [2] => 5
    39.                                             [3] => 140
    40.                                             [4] => 220
    41.                                             [5] => 0.5
    42.                                         )
    43.                                 )
    44.                         )
    45.                 )
    46.         )
    47. )
    Почему тогда если продолжать писать:
    $res = array_keys(array_filter(array_count_values($items)));
    var_dump($res);

    выходит ошибка:
    Код (Text):
    1. NULL
    2. array_keys() expects parameter 1 to be array, null given :2
    Вообще мне нужны цены и URL от сюда. Мб подскажете как их отсюда взять