Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Парсинг сайта

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
romanov
Отправлено: 24 Апреля, 2012 - 09:27:17
Post Id


Гость


Покинул форум
Сообщений всего: 112
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




Все доброго времени суток.

Опять поднимаю эту тему, потомучто не могу справиться с этой задачей.

Суть проблемы: Занимаюсь парсингом сайта, сначала достаю все ссылки главной страницы каталога на сайте( их около 560 ), для каждой ссылки рекурсивно вызывается функция (parsing_page) , которая выбирает способ парсинга для ссылок второго уровня каталога, но до этого дело не доходит т.к. браузер грузится пока его не остановишь.

Вот код:

CODE (php):
скопировать код в буфер обмена
  1.  
  2.  
  3. require_once ("simple_html_dom.php");
  4. $arr=array('/goods/catalog/cat/');
  5.  
  6. parsing_page('http://www.merlion.ru/goods/catalog/cat/');
  7.  
  8. function parsing_page($url)
  9.  
  10. {
  11.         $arr=array();
  12.        
  13.         $mas = Array();
  14.         $path_url = parse_url($url);
  15.  
  16.        
  17.         preg_match('#(/goods/catalog/cat/)#i',$path_url['path'], $pathmain);
  18.        
  19.         preg_match('#(/goods/catalog/cat/\w+/\w+/)#i', $path_url['path'], $pathcat);
  20.         preg_match('#(/goods/catalog/product/\d+/)#i', $path_url['path'], $pathdetail);
  21.  
  22.         $merl = file_get_html($url);
  23.  
  24.         switch( $path_url['path'] ):
  25.         case $pathmain[0] :
  26.  
  27.         foreach ($merl->find('div[class="catalog_link"]') as $main_container):
  28.  
  29.                 $h3 = $main_container->find("h3");
  30.                 #echo $h3[0];
  31.                 foreach ($main_container->find('ul[class="catalog_list"] li ul') as $ul):
  32.                         foreach($ul->find('a') as $li):
  33.                         #echo $li->href."<br>";
  34.                                 if (in_array($li->href,$GLOBALS['arr'])) continue;
  35.                      $GLOBALS['arr'][]=$li->href;
  36.                        
  37.                                         #$mas2[]="http://merlion.ru".$li->href;
  38.  
  39.                                          parsing_page("http://www.merlion.ru".$li->href);      
  40.                         endforeach;    
  41.                        
  42.                 endforeach;
  43.        
  44.         endforeach;
  45.        
  46.         break;
  47.        
  48.         case $pathcat[0]:
  49.                
  50.                
  51.                 echo "KO<br>";
  52.                
  53.                
  54.         break; 
  55.        
  56.        
  57. endswitch;
  58.  
  59. }
  60.  
  61.  


Отредактировано модератором: Мелкий, 24 Апреля, 2012 - 10:20:00
 
 Top
Мелкий Супермодератор
Отправлено: 24 Апреля, 2012 - 10:23:19
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




нет нужды дублировать темы.

Скорей всего вы уходите в бесконечную рекурсию. Или просто не дожидаетесь окончания работы. phpfaq.ru/debug , в общем.


-----
PostgreSQL DBA
 
 Top
snikers987
Отправлено: 24 Апреля, 2012 - 10:35:43
Post Id



Участник


Покинул форум
Сообщений всего: 1239
Дата рег-ции: Сент. 2011  
Откуда: Крым


Помог: 25 раз(а)




Может я чего не понимаю.. но на кой тут рекурсия? циклы отработают быстрее и ими удобнее управлять. имхо конечно.


-----
Когда всматриваешься в тёмную бездну, учти, что кто-то может смотреть на тебя из неё...
 
My status
 Top
romanov
Отправлено: 24 Апреля, 2012 - 13:15:53
Post Id


Гость


Покинул форум
Сообщений всего: 112
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




Дайте кто-нибудь пожалуйста конкретный совет, как решить эту проблему.

По поводу циклов вместо рекурсию, пытался делать и так, но результат тот же.

Если здесь бесконечная рекурсия как писал Мелкий , то как это исправить ?
 
 Top
romanov
Отправлено: 26 Апреля, 2012 - 14:37:32
Post Id


Гость


Покинул форум
Сообщений всего: 112
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




help кто-нибудь, за помощь могу заплатить, оплата webmoney
 
 Top
Crate
Отправлено: 26 Апреля, 2012 - 17:52:20
Post Id



Посетитель


Покинул форум
Сообщений всего: 312
Дата рег-ции: Янв. 2012  


Помог: 4 раз(а)




romanov
Для начала в начале файла:
PHP:
скопировать код в буфер обмена
  1. ini_set ("display_errors", "On");
  2. ini_set ("display_startup_errors", "On");
 
 Top
romanov
Отправлено: 26 Апреля, 2012 - 17:57:48
Post Id


Гость


Покинул форум
Сообщений всего: 112
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




в .htaccess стоит display errors On
Да вообще дело до ошибок не доходит, браузер грузится пока его не остановишь
 
 Top
Crate
Отправлено: 26 Апреля, 2012 - 18:00:59
Post Id



Посетитель


Покинул форум
Сообщений всего: 312
Дата рег-ции: Янв. 2012  


Помог: 4 раз(а)




romanov
Значит или бесконечный цикл, или бесконечная рекурсия. Лучше все-таки использовать циклы.
 
 Top
romanov
Отправлено: 26 Апреля, 2012 - 18:05:19
Post Id


Гость


Покинул форум
Сообщений всего: 112
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




уже использовал циклы вместо рекурсии не помогает

ну типа:

PHP:
скопировать код в буфер обмена
  1.  
  2. foreach ($links as $return_values):
  3.  
  4.         parsing_page($return_values);
  5.  
  6. endforeach;
  7.  
 
 Top
MAXUS
Отправлено: 02 Мая, 2012 - 23:26:47
Post Id


Посетитель


Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011  


Помог: 7 раз(а)




romanov пишет:
уже использовал циклы вместо рекурсии не помогает

ну типа:

PHP:
скопировать код в буфер обмена
  1.  
  2. foreach ($links as $return_values):
  3.  
  4.         parsing_page($return_values);
  5.  
  6. endforeach;
  7.  



Блин, я те готов был помочь, о ты слушать не захотел. И проблему тебе объяснял. Щас готов работать конструктивно?
 
 Top
romanov
Отправлено: 03 Мая, 2012 - 09:47:23
Post Id


Гость


Покинул форум
Сообщений всего: 112
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




Всегда готов

Я тут немного функцию изменил

PHP:
скопировать код в буфер обмена
  1.  
  2. require_once ("simple_html_dom.php");
  3.  
  4.  
  5. // Вызываем функцию для главной страницы каталога сайта
  6. $links = parsing_page('http://www.merlion.ru/goods/catalog/cat/');
  7.  
  8. #parsing_page("http://www.merlion.ru/goods/catalog/cat/j100/j10000/p1/");
  9. function parsing_page($url)
  10.  
  11. {
  12.  
  13.         // выделяем из url страницы относительный путь
  14.         $path_url = parse_url($url);
  15.        
  16.  
  17.         // переходим на case который достает ссылки с главной страницы каталога
  18.         preg_match('#(/goods/catalog/cat/)#i',$path_url['path'], $pathmain);
  19.                
  20.         // переходим на case который достает ссылки со страниц категорий
  21.         preg_match('#(/goods/catalog/cat/\w+/\w+/)#i', $path_url['path'], $pathcat);
  22.        
  23.         // переходим на case который достает ссылки с постраничной навигации
  24.         preg_match('#(/goods/catalog/cat/\w+/\w+/\w+/)#i', $path_url['path'], $pathpages);
  25.        
  26.         preg_match('#(/goods/catalog/product/\w+/)#i', $path_url['path'], $pathdetail);
  27.  
  28.         // получаем html страницы
  29.         $merl = file_get_html($url);
  30.  
  31.         switch( $path_url['path'] ):
  32.         case $pathmain[0] :
  33.  
  34.  
  35.  
  36.                 foreach ($merl->find('div[class="catalog_link"]') as $main_container):
  37.                
  38.                 $h3 = $main_container->find("h3");
  39.  
  40.                 foreach ($main_container->find('ul[class="catalog_list"] li ul') as $ul):
  41.  
  42.                        
  43.                         foreach($ul->find('a') as $li):
  44.                                                                
  45.                     parsing_page("http://www.merlion.ru".$li->href);
  46.                                         #$main_links[] = "http://www.merlion.ru".$li->href;
  47.  
  48.                         endforeach;    
  49.                        
  50.                 endforeach;
  51.        
  52.         endforeach;
  53.        
  54.         #return $main_links;
  55.        
  56.         break;
  57.        
  58.         case $pathcat[0]:
  59.        
  60.                
  61.        
  62.                  if (preg_match_all('#(/goods/catalog/cat/\w+/\w+/\w+/)#s', $merl,$pages)):
  63.                          
  64.                          
  65.                          foreach ($pages as $page=>$pre_page):
  66.                                
  67.                                 foreach ($pre_page as $new_page):
  68.                                
  69.                                         $mas_links[]=$new_page;
  70.                                
  71.                                 endforeach;
  72.                                
  73.                                
  74.                          endforeach;
  75.                          
  76.                          $unique_keys = array_unique($mas_links);
  77.                        
  78.                         foreach ($unique_keys as $keys):
  79.                                
  80.                                 parsing_page("http://www.merlion.ru".$keys);
  81.                                 #$mas2[] = "http://www.merlion.ru".$keys;
  82.                                
  83.                         endforeach;
  84.                          
  85.                  endif;
  86.                
  87.                 #return $mas2;
  88.         break;
  89.  
  90.         case $pathpages[0]:
  91.        
  92.                 echo "1";
  93.        
  94.         /*      if (preg_match_all('#(/goods/catalog/product/\w+/)#',$merl,$detail_links)):
  95.                
  96.                
  97.                
  98.                 $links_detail = array_unique($detail_links[0]);
  99.                
  100.  
  101.                  foreach ($links_detail as $goods=>$goods_value):
  102.                
  103.                         #$mas_detail[] = "http://www.merlion.ru".$goods_value;
  104.                         parsing_page("http://www.merlion.ru".$goods_value);
  105.                
  106.                 endforeach;
  107.                
  108.                 endif;*/
  109.                
  110.                 #return $mas_detail;
  111.        
  112.         break;
  113.        
  114.        
  115.         case $pathdetail[0]:
  116.        
  117.         echo "ds";
  118.        
  119.                 $h1 = $merl->find("h1");
  120.                 echo $h1[0];
  121.        
  122.         break;
  123.        
  124.        
  125. endswitch;
  126.  
  127. }
  128.  
  129.  
  130. #foreach ($links as $return_values):
  131.        
  132.        
  133.  # $links2[] = parsing_page($return_values);
  134.  
  135. #endforeach;
  136.  
  137. #$newarr = array ( array("http://www.merlion.ru/goods/catalog/cat/e110/e11007/p1/"));
  138.  
  139. #foreach ($links2 as $return_keys=>$return_values_n):
  140.        
  141. #       foreach ($return_values_n as $product_links):
  142.        
  143. #               $links3[] = parsing_page($product_links);
  144.        
  145. #       endforeach;
  146.        
  147. #endforeach;
  148.  
  149. #echo "<pre>"; print_r($links2); echo "</pre>";
  150.  
  151.  

(Отредактировано автором: 03 Мая, 2012 - 10:00:41)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Хранение данных, их вывод и обработка »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB