Задать вопрос
@ademar26

Из за чего может не работать скрипт парсинга?

Существует код скрипта. Он парсит картинки так как надо и записывает в файл sql. Но необходимо чтобы еще записывал в файл описание и артикул товара. Но вот проблема, Он почему то записывает в файл не артикул а наименование товара, хотя в коде прописано условие через switch искать в теге - tr через массив по ключу слова. В чем может быть проблема????? Заранее спасибо.
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
</head>
</html>
<?php

include_once('curl/curl_query.php');
define('_DS_', DIRECTORY_SEPARATOR);
class tdm_parse
{

    private $link = "http://tdme.ru";
    //public $path = __DIR__ . _DS_ . "catalog" . _DS_;
     // private $SHD_path = include('../shd/simple_html_dom.php');
    //private $PHPExcel_path = __DIR__ . 'PHPExcel' . __DIR__ . 'PHPExcel.php' ;
    /**
     * @param $SHD_path - path to library simple html dom
     * @return array|int - array of categories
     */
    private function get_categories(){

        //Получаем список категорий из сайдбара
        $html = new simple_html_dom();
    //$html = file_get_html('http://tdme.ru/product/');
        //$html = str_get_html($html);
       $html = curl_get('http://tdme.ru/product/');
       $html = str_get_html($html);
        if($categories = $html->find('div.sidebar ul.submenu')[1]->children){
           //sleep(2);
           $parsed_category = array();
           foreach ($categories as $category){
                $parsed_category[] = $category->outertext;
            }
            return $parsed_category;
        }
    
        
    }

    /**
     * @param $categories
     * @return array
     */
    private function get_models($categories){
        //Подгружаем каждую из полученных категорий и вытаскиваем впоследствии список моделей из каждой подкатегории
        $array_of_sub = array();

        $html = new simple_html_dom();
        if (isset($categories)){
        foreach ($categories as $category){
            $parent = new simple_html_dom();
            //Создаем два объекта для подгрузки из распарсенного и из сайта

            $parent->load($category);
            //Получаем ссылку подкатегории и загружаем её страницу
            $parent = $parent->find('a')[0]->href;
            $html = curl_get($this->link . $parent);
            $html = str_get_html($html);
            //Загружаем ссылки всех подкатегорий
            
            $subcategories = $html->find('ul.category')[0]->children;
            
         foreach ($subcategories as $sub) {
                $array_of_sub[] = $parent . $sub->find('a')[0]->href;
            }}
            return $array_of_sub;
        }}


    private function get_price($subcat){
        $sql_file = fopen('base.sql', 'a+');
    
        $path_to_images = __DIR__ . _DS_ ."catalog". _DS_ ;
        $manufacturer_id = 25;
        //Разбираем подкатегории на отдельные группы товаров
        //$table_of_goods - таблица товаров общая
        //$table_header, $table_body - заголовок и тело таблицы соответственно
        $table_of_goods = new simple_html_dom();
        
        $html_sub = file_get_html($this->link . $subcat);
       // $html_sub = str_get_html($html_sub);
        //var_dump(get_class($html_sub));
        $description = new simple_html_dom();
        //Получаем описание, полное для всех товаров (кроме характеристик)
        $description = $html_sub->find('dl.tabs')[0]->find('dd.selected')[0]->find('div.tab-content')[0];
     
        //$description = $html_sub->find('dl.tabs dd.selected div.tab-content')[0];
        $description = htmlspecialchars($description->plaintext);
         
    
     
        //echo "<HR>";
        
        $table_of_goods = $html_sub->find('div#modal_table table.mod_t')[0]->children;

        $table_header = $table_of_goods[0]->find('tr')[0];
        $table_body = $table_of_goods[1]->children;
        $numer = array();
        //Вытягиваем номера ячеек с необходимыми нам столбцами
        foreach (($table_header->children) as $num => $th_row) {
            //  echo "FIRST foreach<br>";
            //var_dump($th_row->plaintext);
            //var_dump($num);
            switch(trim($th_row->plaintext)){
                case 'Наименование':
               // case 'Наименование светильника':
                    $numer["name"] = $num;
                    break;
                case 'Фото':
                case 'Изображение':
                    $numer['image'] = $num;
                    break;
                case 'Артикул':
                    $numer['model'] = $num;
                    break;
            }

        }
        if (!(isset($numer['image']))){
            $numer['image'] = '-1';
            $image_path = $html_sub->find('div.product_info div.image div img')[0]->src;
        }
        //echo "<hr>";
        $rowspan = 1;
        //Вытягиваем изображение и информацию из ячеек данных

        foreach ($table_body as $table_line){
            // echo "second foreach<br>";
            //прогоняемся по всем элементам таблицы, вытаскиваем подкатегории 3 уровня и товары с их свойствами и картинками
            //var_dump($table_line->plaintext);
            $arr_of_tl = $table_line->children;
            if($rowspan == 1){
                $row_bool = 0;
            }
            else {
                $row_bool = 1;
                $rowspan--;
            }
            foreach ($arr_of_tl as $num => $value){
                //Сопоставляем ячейку с заголовком
                switch($num + $row_bool){

                    case $numer['image']: {
                        //Необходимо получить ячейку изображения и проверить его rowspan. записать его rowspan в отдельную переменную и если он не равен 1, то прибавлять +1 переменной num, чтобы
                        // не сбивался порядок ячеек в таблице при считывании данных.
                        if (isset($value->rowspan)) {
                            $rowspan = (int) $value->rowspan;
                            //var_dump($rowspan);
                        }
                        if (isset($value->find('img')[0])){
                            $image_path = $value->find('img')[0]->src;
              
              }//;
                            
                        //var_dump($image_path);
                        // $image = file_get_contents($image_path);
                        // file_put_contents($image["tmp_name"], $path_to_images);
                        //$image_addr = $path_to_images . $image;
                    }
                        break;
                    case $numer['model']: $article = $value->plaintext;
                        break;
                    case $numer['name']: $name = $value->plaintext;
                        break;

                }



            }
      if(isset($article) && $article !== '' && $article !== '  ')
      {
        $arr = explode("/", $image_path); 
                $imagen = end(str_replace(" ","",$arr));
        //file_put_contents(__DIR__ . _DS_ . "catalog" . _DS_ . $imagen, $this->link . $image_path);
        file_put_contents( 'catalog\\' . $imagen, file_get_contents('http://tdme.ru' . $image_path));
        
        //INSERT INTO base (name, image, description, article) VALUES ('6', '1st Street', 'Los Angeles', 'Harry Monroe')
           //$parsed_string = 'UPDATE tdm_upload SET `name` = \'' . $name . '\' `image` = \'catalog/'.   $article .   '\' `description` = \''.   $description .   '\' WHERE `article` = \'' . $article . "'; \n";
      $parsed_string = 'INSERT INTO base (image, description, article) VALUES (\'catalog\\'.$imagen.'\', \''. $description .'\', \''.$article."'); \n";
            fwrite($sql_file, iconv("WINDOWS-1251", "UTF-8", "$parsed_string") ); 
      
        
      }
      
        }
        $html_sub->clear();

        unset($html_sub);
        unset($table_of_goods);
        //$description->clear();
        //unset($description);
        return 1;
    }

    public function insert_into_mysql() {

        $this::Load(__DIR__ . '\shd\simple_html_dom.php');
        $categories = new simple_html_dom();
        $categories = $this->get_categories();
        $subcat = $this->get_models($categories);
        if(count($subcat)){
        foreach ($subcat as $models){
            sleep(1);
            $this->get_price($models);
        }}
        
        var_dump(($subcat));
        return 1;
    }
    public static function Load($pClassName){
        if ((class_exists($pClassName,FALSE))) {
            return FALSE;
        }

        if ((file_exists($pClassName) === FALSE) || (is_readable($pClassName) === FALSE)) {
            //    Can't load
            return FALSE;
        }

        require_once($pClassName);
    }   //    function Load()

}

$tdm_parse = new tdm_parse();
$tdm_parse->insert_into_mysql();
?>
  • Вопрос задан
  • 301 просмотр
Подписаться 1 Оценить 2 комментария
Пригласить эксперта
Ответы на вопрос 3
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Искать он должен правильно, а вот записывать и считывать - проверяйте!
Ответ написан
saboteur_kiev
@saboteur_kiev
software engineer
А вы вручную файл (HTML) проверьте, может у них там просто битая табличка, где-то какой-то colspan или еще что-то в этом роде.

P.S. У них же есть иллюстрированный excel - может его будет проще отпарсить?

update:
добавьте дебаг

switch(trim($th_row->plaintext)){
                case 'Наименование':
               // case 'Наименование светильника':
                    $numer["name"] = $num;
                    break;
                case 'Фото':
                case 'Изображение':
                    $numer['image'] = $num;
                    break;
                case 'Артикул':
                    $numer['model'] = $num;
                    break;
            }

например тут добавьте вывод, что именно за $num попадает в $numer['model']
Кстати, кавычки разные в name и остальных.
Ответ написан
Никто не будет тут разбирать вашу портянку кода что бы найти мелкий баг. Там дебажить на сервере надо конкретно по этапам.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы