За последние 24 часа нас посетили 57832 программиста и 7257 роботов. Сейчас ищут 2020 программистов ...

Помогите перенастроить парсер. Нужно что бы брало с сайта картинку и описание

Тема в разделе "PHP для новичков", создана пользователем artemka170691, 24 янв 2017.

  1. artemka170691

    artemka170691 Новичок

    С нами с:
    24 янв 2017
    Сообщения:
    2
    Симпатии:
    0
    раньше прайс был другой. и все было нормально. теперь прайсы изменились. и парсер перестал работать. нужно чуть поправить

    Код (Text):
    1.  
    2. namespace Supplier;
    3.  
    4. use Model\Supplier;
    5.  
    6. defined('PIMPORT') or die('Error access');
    7.  
    8. /**
    9.  * Class Kompl
    10.  * @package Supplier
    11.  */
    12. class Kompl extends \Infr\Supplier {
    13.  
    14.     /** @var string */
    15.     protected $_host = 'http://www.fcenter.ru';
    16.  
    17.     /** @var string */
    18.     protected $_productMask = 'http://www.fcenter.ru/product/goods/{PRODUCT_ID}';
    19.  
    20.      /**
    21.      * @throws \Exception
    22.      * @return string
    23.      */
    24.     protected function _getPrice() {
    25.         //проверяем подключен ли плагин и к нему поставщик
    26.         $class = 'Plugins\Suppliers\Supplier\Kompl';
    27.         if (class_exists($class)) {
    28.             /** @var \Plugins\Suppliers\Infr\Supplier $supplierItem */
    29.             $supplierItem = new $class;
    30.             $pricePath = $supplierItem->getPricePath();
    31.             if (file_exists($pricePath)) {
    32.                 return file_get_contents($pricePath);
    33.             } else {
    34.                 throw new \Exception('Прайс-лист для поставщика не загружен');
    35.             }
    36.         } else {
    37.             throw new \Exception('К плагину Suppliers не подключен нужный поставщик');
    38.         }
    39.     }
    40.  
    41.     /**
    42.      * @param \Model\Supplier $supplier
    43.      * @param \Model\Supplier\Product $product
    44.      * @param array $params
    45.      * @return mixed|\Model\Supplier\Product
    46.      */
    47.     public function getProduct(Supplier $supplier, Supplier\Product $product, array $params = array()) {
    48.         if ($product->url) {
    49.             $html = \Infr\Request::httpRequest($product->url);
    50.            
    51.             if ($html) {
    52.                 $dom = \Infr\str_get_html($html);
    53.  
    54.                 if ($dom) {
    55.                     $pict = $dom->find('a.preview', 0);
    56.                     if ($pict) {
    57.                         $product->pictures = array((string) $pict->getAttribute('href'));
    58.                         $pict->clear();
    59.                     }
    60.  
    61.                     unset($dom);
    62.                 }
    63.             }
    64.             unset($html);
    65.         }
    66.  
    67.         return $product;
    68.     }
    69.  
    70.  
    71.     /**
    72.      * @param \Model\Supplier $supplier
    73.      * @param array $params
    74.      * @return array|mixed|\Model\Supplier\Product\Collection
    75.      * @throws \Exception
    76.      */
    77.     public function getProducts(Supplier $supplier, array $params = array()) {
    78.         $collection = new Supplier\Product\Collection();
    79.  
    80.         $xmlContent = $this->_getPrice();
    81.         if (empty($xmlContent)) {
    82.             return $collection;
    83.         }
    84.  
    85.         $xml = simplexml_load_string($xmlContent);
    86.         if (!$xml) {
    87.             throw new \Exception('Из сайта ' . $this->_host . ' не загружен прайс');
    88.         }
    89.  
    90.         if (!empty($xml->product)) {
    91.             $categoryCollection = $this->getCategories($supplier);
    92.  
    93.             foreach ($xml->product as $product) {
    94.                 $id = (string) $product->id;
    95.                 $categoryId = (string) $product->categoryID;
    96.  
    97.                 $categoryItem = $categoryCollection->find($categoryId);
    98.                 if (empty($categoryItem)) {
    99.                     continue;
    100.                 }
    101.  
    102.                 if (empty($id) || empty($categoryId)) {
    103.                     continue;
    104.                 }
    105.                
    106.                 $data = array(
    107.                     'id' => $id,
    108.                     'article' => $id,
    109.                     'name' => (string) $product->name,
    110.                     'shortDescription' => '',
    111.                     'description' => (string) $product->desc,
    112.                     'price' => (float) $product->wholesale,
    113.                     'inStock' => 1,
    114.                     'categoryId' => $categoryId,
    115.                     'category' => $categoryItem,
    116.                     'pictures' => array(),
    117.                     'options' => array(),
    118.                     'url' => str_replace('{PRODUCT_ID}', $id, $this->_productMask),
    119.                     'params' => array('article' => $id),
    120.                 );
    121.  
    122.                 $productItem = $collection->createElement($data);
    123.                 $collection->add($productItem);
    124.             }
    125.         }
    126.  
    127.         return $collection;
    128.     }
    129.  
    130.  
    131.     /**
    132.      * @param \Model\Supplier $supplier
    133.      * @return \Model\Supplier\Category\Collection
    134.      * @throws \Exception
    135.      */
    136.     public function getCategories(Supplier $supplier) {
    137.         $categoryCollection = new Supplier\Category\Collection();
    138.  
    139.         $xmlContent = $this->_getPrice();
    140.         $xml = simplexml_load_string($xmlContent);
    141.  
    142.         if (!$xml) {
    143.             throw new \Exception('Из сайта ' . $this->_host . ' не загружен прайс');
    144.         }
    145.  
    146.         if (!empty($xml->product)) {
    147.             $categoriesArray = array();
    148.  
    149.             foreach ($xml->product as $product) {
    150.                 $categoryId = (string) $product->categoryID;
    151.                 $categoryName = (string) $product->category;
    152.  
    153.                 if (empty($categoryId)) {
    154.                     continue;
    155.                 }
    156.  
    157.                 $categoriesArray[$categoryId] = $categoryName;
    158.             }
    159.  
    160.             foreach ($categoriesArray as $categoryId => $categoryName) {
    161.                 if ($categoryCollection->find($categoryId)) {
    162.                     continue;
    163.                 }
    164.  
    165.                 $data = array(
    166.                     'id' => $categoryId,
    167.                     'parentId' => 0,
    168.                     'name' => $categoryName,
    169.                     'supplierId' => $supplier->id,
    170.                     'url' => '#'
    171.                 );
    172.  
    173.                 $categoryItem = $categoryCollection->createElement($data);
    174.                 $categoryCollection->add($categoryItem);
    175.             }
    176.         }
    177.  
    178.         return $categoryCollection;
    179.     }
    180.  
    181. }
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.213
    Симпатии:
    1.711
    Адрес:
    Молдова, г.Кишинёв
    @artemka170691 только примера прайса нового ты не дал, кусок кода твой не запустить
     
  3. artemka170691

    artemka170691 Новичок

    С нами с:
    24 янв 2017
    Сообщения:
    2
    Симпатии:
    0
    прайсы загружаю в xls, автоматом переделывается .xml. артикулы совпадают с сайтом с которого хочу парсить
    protected $_productMask = 'http://www.fcenter.ru/product/goods/{PRODUCT_ID}'; по этому коду выходит на страницу товара {PRODUCT_ID} артикул товара.
    --- Добавлено ---
    Прайс .xml вот такого вида

    Код (Text):
    1.  
    2. -<products>
    3.  
    4.  
    5. -<product>
    6.  
    7. <id>1983251</id>
    8.  
    9.  
    10. -<name>
    11.  
    12. <![CDATA[Сист. блок Flextron 2C (P-G3260-3.30ГГц/H81M-A/2x4ГБ/128ГБ/500ГБ/WiFi) (212643)]]>
    13.  
    14. </name>
    15.  
    16.  
    17. -<desc>
    18.  
    19. <![CDATA[]]>
    20.  
    21. </desc>
    22.  
    23.  
    24. -<category>
    25.  
    26. <![CDATA[Компания Ф-Центр&rarr;Компания Ф-Центр]]>
    27.  
    28. </category>
    29.  
    30. <categoryID>2022814867</categoryID>
    31.  
    32. <wholesale>24369.108014</wholesale>
    33.  
    34. </product>
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.213
    Симпатии:
    1.711
    Адрес:
    Молдова, г.Кишинёв
    Похоже что XML просто не valid, с ошибками или просто с ошибкой был скопирован?
    --- Добавлено ---
    тут правилами запрещено парсинг сайтов обсуждать, только через API или скачивание фалов, xls, xml например.