Форум программистов, компьютерный форум, киберфорум
PHP: сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
2 / 2 / 3
Регистрация: 17.12.2014
Сообщений: 43

Парсер на php не совсем корректно работает

07.07.2015, 13:26. Показов 1240. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написал парсер на php. но столкнулся с некоторыми сложностями.
Есть сайт с которого я подтягивая ссылки разделов. По которым потом перехожу и подтягивая ссылки пагинатора, с которых потом уже непосредственно вытаскивая данные.
В чем непосредственно сложность:
сам пагинатор выглядит вот так:
<<В начало <Предыдущая 1 2 3 4 5 6 7 8 9 10 Следующая> В конц>>
Таким образом когда мы токо переходим по ссылке раздела мы попадаем на первую страничку, в этот момент рабочих ссылок 11 но поскольку 2 ссылка имеет такой же адрес как и Следующая> то мы перебираем массив и удаляем одинаковые элементы массива. что бы перейти к следующим 10 ссылкам нам необходимо попасть на 10 ссылку и тогда
Следующая> будет иметь адрес для перехода на следующие странички (как то так объяснить тяжело работает limit=20&limitstart=20 каждая ссылка увеличение на 20 вот). и активных ссылок становиться больше потому что теперь активной становиться и ссылка <Предыдущая, а когда перейдем к слудующим 10 страничкам то активна будет и ссылка В начало. Переходы эти все я сделал, но при каждом "сканировании" подхватываются ссылки <<В начало и В конц>>, таким образом при выводе или добавлении данных в БД. данные дублируются. что не есть хорошо.
В этом и заключается сложность как избежать ненужного дублирования данных?

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
<?
include('simple_html_dom.php'); 
$html = file_get_html('http://сайт');
   
 //Поиск ссылок на разделы
  foreach($html->find('a.mainlevel') as $element){
      //echo $element->href . '<br>';
       $linki[] = $element->href;
   }
   foreach ($linki as $key => $value) {
    $full_link_razdel = "http://сайт";
    $full_link_razdel .= $value;
    $full_links_razdel[] = $full_link_razdel;
    echo $full_link_razdel . '<br>';
   }
   foreach ($full_links_razdel as $numlink => $pagelink) {
      scanlink($pagelink);
   }
 
    function scanlink($scanlink){
      db_connect();
      echo "Сканируемая страничка - " . $scanlink . "<br>";
  
        $html = file_get_html($scanlink);
foreach ($html->find('ul.pagination li a') as $element) {
            $link[] = $element->href;
        }
        foreach ($link as $key => $value) {
    $full_link = "http://сайт";
    $full_link .= $value;
    $full_links[] = $full_link;
    //echo $full_link . '<br>';
   }
 
   $full_links = array_unique($full_links);
   /*$deletelement = array_pop($full_links);*/
   foreach ($full_links as $key => $linka){
        echo "Страницы пагинатора - ".$linka."<br>";
   } 
 
 
   foreach ($full_links as $key => $linkpage) {
      $html = file_get_html($linkpage);
      foreach($html->find('#vmMainPage') as $article) {
    //$title = $article->find('h3', 0)->plaintext;
    $item['title'] = $article->find('h3', 0)->plaintext;
      foreach($html->find('tr') as $article) {
     /*   $size = $article->find('td', 0)->plaintext;
        $artikl = $article->find('td', 1)->plaintext;
        $sklad = $article->find('td', 2)->plaintext;
        $kol = $article->find('td', 3)->plaintext;*/
    $item['size'] = $article->find('td', 0)->plaintext;
    $item['artikl'] = $article->find('td', 1)->plaintext;
    $item['sklad'] = $article->find('td', 2)->plaintext;
    $item['kol'] = $article->find('td', 3)->plaintext;
   // $query = mysql_query("INSERT INTO table(title, size, artikl, sklad, kol) VALUES ('$title','$size', '$artikl', '$sklad', '$kol')");
    $articles[] = $item;
      }
    }
 }
$endlink = count($full_links);
   echo "Количество ссылок - ". $endlink ."<br>";
   switch ($endlink) {
       case '10':
           $endlink-=2;
            echo "Страничка со ссылкой для следующих сканирований - ".$full_links[$endlink]."<br>";
           // print_r($full_links);
            scanlink($full_links[$endlink]);
           break;
       case '11':
            $endlink;
            echo "Страничка со ссылкой для следующих сканирований - ".$full_links[$endlink]."<br>";
           // print_r($full_links);
            scanlink($full_links[$endlink]);
           break;
        case '12':
            if(isset($full_links[10])){
              $endlink-=2;
              echo "Страничка со ссылкой для следующих сканирований - ".$full_links[$endlink]."<br>";
              print_r($full_links);
              scanlink($full_links[$endlink]);
            }elseif (isset($full_links[11])) {
              $endlink-=1;
              echo "Страничка со ссылкой для следующих сканирований - ".$full_links[$endlink]."<br>";
              print_r($full_links);
              scanlink($full_links[$endlink]);
            }
           break;
       default:
           echo "ссылок меньше 10<br>";
           break;
    }
    echo "<table>";
    foreach ($articles as $key3 => $value3) {
      echo "<tr><td>".$key3 ."</td>";
      
      foreach ($value3 as $key4 => $value4) {
      echo "<td>" . $value4 . "</td>";
      
      }
    echo "</tr>";
    }
    echo "</table>";
}
?>
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.07.2015, 13:26
Ответы с готовыми решениями:

Не совсем корректно работает Like
Добрый день! Подскажите пожалуйста в чем загвоздка? Имеем две формы. Выбор и Заказы. Первичная - &quot;Выбор&quot;, в которой...

не совсем корректно работает
скрипт повесил в onload, но после загрузки страницы в браузере firefox остается значок загрузки страницы, событие прописал не в body, а к...

Не совсем корректно работает программа
Нужно написать программу которая считает сумму 2-х предыдущих чисел (кол-во чисел пользователь вводит сам),первое число 1,второе 3 ...

9
F57
 Аватар для F57
68 / 68 / 23
Регистрация: 17.02.2015
Сообщений: 397
07.07.2015, 13:54
Получи значение последней страницы (10) и парси 10 страниц
0
2 / 2 / 3
Регистрация: 17.12.2014
Сообщений: 43
07.07.2015, 16:08  [ТС]
А как мне это прописать что б парсить только 10 страничек?

Добавлено через 1 час 57 минут
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
<?
include('simple_html_dom.php'); 
$html = file_get_html('http://сайт');
  
  //Поиск ссылок на разделы
  foreach($html->find('a.mainlevel') as $element){
      //echo $element->href . '<br>';
       $linki[] = $element->href;
   }
   foreach ($linki as $key => $value) {
    $full_link_razdel = "http://сайт";
    $full_link_razdel .= $value;
    $full_links_razdel[] = $full_link_razdel;
    echo $full_link_razdel . '<br>';
   }
   foreach ($full_links_razdel as $numlink => $pagelink) {
      scanlink($pagelink);
   }
 
    function scanlink($scanlink){
      db_connect();
      echo "<span style='color: green'>Сканируемая страничка - " . $scanlink . "</span><br>";
  
        $html = file_get_html($scanlink);
 
        foreach ($html->find('ul.pagination li a') as $element) {
            $link[] = $element->href;
        }
        foreach ($link as $key => $value) {
    $full_link = "http://сайт";
    $full_link .= $value;
    $full_links[] = $full_link;
    //echo $full_link . '<br>';
   }
 
   $full_links = array_unique($full_links);
   /*$deletelement = array_pop($full_links);*/
   $kollink = count($full_links);
   if ($kollink > 10) {
       $delet = array_shift($full_links);
   }
   if ($kollink >= 10) {
       $delet2s = array_pop($full_links);
   }
   foreach ($full_links as $key => $linka){
        echo "Страницы пагинатора - ".$linka."<br>";
   } 
   
   foreach ($full_links as $key => $linkpage) {
      $html = file_get_html($linkpage);
      foreach($html->find('#vmMainPage') as $article) {
    //$title = $article->find('h3', 0)->plaintext;
      $item['title'] = $article->find('h3', 0)->plaintext;
      foreach($html->find('tr') as $article) {
        /*$size = $article->find('td', 0)->plaintext;
        $artikl = $article->find('td', 1)->plaintext;
        $sklad = $article->find('td', 2)->plaintext;
        $kol = $article->find('td', 3)->plaintext;*/
    $item['size'] = $article->find('td', 0)->plaintext;
    $item['artikl'] = $article->find('td', 1)->plaintext;
    $item['sklad'] = $article->find('td', 2)->plaintext;
    $item['kol'] = $article->find('td', 3)->plaintext;
    //$query = mysql_query("INSERT INTO table(title, size, artikl, sklad, kol) VALUES ('$title','$size', '$artikl', '$sklad', '$kol')");
    $articles[] = $item;
      }
    }
 }
 
   $endlink = count($full_links);
   echo "Количество ссылок - ". $endlink ."<br>";
   switch ($endlink) {
       case '9':
           $endlink-=1;
            echo "<span style='color: red'>Страничка со ссылкой для следующих сканирований - ".$full_links[$endlink]."</span><br>";
           // print_r($full_links);
            scanlink($full_links[$endlink]);
           break;
       case '10':
            $endlink-=1;
            echo "<span style='color: red'>Страничка со ссылкой для следующих сканирований - ".$full_links[$endlink]."</span><br>";
            print_r($full_links);
            scanlink($full_links[$endlink]);
           break;
        case '12':
            if(isset($full_links[10])){
              $endlink-=3;
              echo "<span style='color: red'>Страничка со ссылкой для следующих сканирований - ".$full_links[$endlink]."</span><br>";
             print_r($full_links);
 
              scanlink($full_links[$endlink]);
            }elseif (isset($full_links[11])) {
              $endlink-=1;
              echo "<span style='color: red'>Страничка со ссылкой для следующих сканирований - ".$full_links[$endlink]."</span><br>";
            print_r($full_links);
              scanlink($full_links[$endlink]);
            }
           break;
       default:
           echo "ссылок меньше 10<br>";
           break;
    }
    
    echo "<table>";
    foreach ($articles as $key3 => $value3) {
      echo "<tr><td>".$key3 ."</td>";
      
      foreach ($value3 as $key4 => $value4) {
      echo "<td>" . $value4 . "</td>";
      
      }
    echo "</tr>";
    }
    echo "</table>";
    
}
?>
Вот переделал немножко код теперь сканирует все как следует, но выводит по 2 раза.

Эта часть добавляет в конечный массив которые потом выводит!
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
foreach ($full_links as $key => $linkpage) {
      $html = file_get_html($linkpage);
      foreach($html->find('#vmMainPage') as $article) {
    //$title = $article->find('h3', 0)->plaintext;
      $item['title'] = $article->find('h3', 0)->plaintext;
      foreach($html->find('tr') as $article) {
        /*$size = $article->find('td', 0)->plaintext;
        $artikl = $article->find('td', 1)->plaintext;
        $sklad = $article->find('td', 2)->plaintext;
        $kol = $article->find('td', 3)->plaintext;*/
    $item['size'] = $article->find('td', 0)->plaintext;
    $item['artikl'] = $article->find('td', 1)->plaintext;
    $item['sklad'] = $article->find('td', 2)->plaintext;
    $item['kol'] = $article->find('td', 3)->plaintext;
    //$query = mysql_query("INSERT INTO table(title, size, artikl, sklad, kol) VALUES ('$title','$size', '$artikl', '$sklad', '$kol')");
    $articles[] = $item;
      }
    }
 }
А эта часть определяет последнюю ссылку необходимую для перехода к следующим записям и вызывает функцию scanlink().
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
$endlink = count($full_links);
   echo "Количество ссылок - ". $endlink ."<br>";
   switch ($endlink) {
       case '9':
           $endlink-=1;
            echo "<span style='color: red'>Страничка со ссылкой для следующих сканирований - ".$full_links[$endlink]."</span><br>";
           // print_r($full_links);
            scanlink($full_links[$endlink]);
           break;
       case '10':
            $endlink-=1;
            echo "<span style='color: red'>Страничка со ссылкой для следующих сканирований - ".$full_links[$endlink]."</span><br>";
            print_r($full_links);
            scanlink($full_links[$endlink]);
           break;
        case '12':
            if(isset($full_links[10])){
              $endlink-=3;
              echo "<span style='color: red'>Страничка со ссылкой для следующих сканирований - ".$full_links[$endlink]."</span><br>";
             print_r($full_links);
 
              scanlink($full_links[$endlink]);
            }elseif (isset($full_links[11])) {
              $endlink-=1;
              echo "<span style='color: red'>Страничка со ссылкой для следующих сканирований - ".$full_links[$endlink]."</span><br>";
            print_r($full_links);
              scanlink($full_links[$endlink]);
            }
           break;
       default:
           echo "ссылок меньше 10<br>";
           break;
    }
Но добавлять в БД или в массив для вывода должно после определения последней ссылки (кода что выше)
0
 Аватар для Laroux
172 / 167 / 75
Регистрация: 21.11.2014
Сообщений: 1,490
07.07.2015, 23:47
Лучший ответ Сообщение было отмечено kisenko как решение

Решение

блин, так много буков.. сорри - не стал раскуривать все, но мысль такая: ссылки 1 2 3 4 и т.д. скорее всего имеют какой-нить единый вид типа http://site.ru/blabla/page.php?id=1, http://site.ru/blabla/page.php?id=2, ну и т.д.
Так же?
Чего бы не пойти "В конц>>", понять скриптом, сколько всего страниц и циклом их перебрать?
0
2 / 2 / 3
Регистрация: 17.12.2014
Сообщений: 43
08.07.2015, 11:08  [ТС]
Мысль неплохая, сейчас попытаюсь это реализовать это реализовать!

Добавлено через 1 час 13 минут
Вот когда мы вытащили ссылки пагинатора, ищем последнюю ссылку узнаем сколько их всего и потом при обработке цыкла.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$full_links = array_unique($full_links);
   $endelement = array_pop($full_links);
   echo "<br><span style='color: red'>Последняя страничка пагинатора - ".$endelement."</span><br>";
   $pos = strrpos($endelement, "="); 
   echo $pos."<br>";
   $limitstart = substr($endelement, $pos+1);
   echo "Номер последней ссылки - ".$limitstart."<br>";
   $kolpage = $limitstart/20;
   echo "Колличество страниц пагинатора - ".$kolpage."<br>";
   for($i=0; $i <=$kolpage; $i++){
        $linka[] = str_replace($limitstart, $limitstart-20, $endelement);  
   }
   foreach ($linka as $key => $value) {
       echo $key .' - '.$value.'<br>';
   }
Идея такова берем последнюю ссылку и от нее отнимаем 20
PHP
1
2
index.php/wipers1.html?category_id=89&page=shop.browse&limit=20&limitstart=1140
index.php/wipers1.html?category_id=89&page=shop.browse&limit=20&limitstart=1120
таким образом получаем предыдущую ссылку, но в цикле постоянно отнимается от числа 1140 номера последней ссылки, как написать цикл так что б оно работало нормально сначала отнало от 1140, потом уже от оставшегося тоисть 1120, 1100 и т.д.?
0
 Аватар для Laroux
172 / 167 / 75
Регистрация: 21.11.2014
Сообщений: 1,490
08.07.2015, 11:46
а зачем бить по 20 ссылок? Чего бы все не обработать сразу?
0
2 / 2 / 3
Регистрация: 17.12.2014
Сообщений: 43
08.07.2015, 12:34  [ТС]
PHP
1
2
index.php/wipers1.html?category_id=89&page=shop.browse&limit=20&limitstart=1140
index.php/wipers1.html?category_id=89&page=shop.browse&limit=20&limitstart=1120
это и есть сами ссылки, у них шаг 20, так что если узнать последнюю ссылку и разделив ее номер на 20 мы узнаем количество ссылок по разделу.
0
 Аватар для Laroux
172 / 167 / 75
Регистрация: 21.11.2014
Сообщений: 1,490
08.07.2015, 12:39
Лучший ответ Сообщение было отмечено kisenko как решение

Решение

пройдите циклом в 1140 шагов по ссылкам
index.php/wipers1.html?category_id=89&page=shop.br owse&limit=1&limitstart=1
index.php/wipers1.html?category_id=89&page=shop.br owse&limit=1&limitstart=2
index.php/wipers1.html?category_id=89&page=shop.br owse&limit=1&limitstart=3
и т.д.
что-то типа
PHP
1
2
3
for ($i = 1; $i <= 1140; $i++) {
echo "index.php/wipers1.html?category_id=89&page=shop.browse&limit=1&limitstart=".$i;
}
0
2 / 2 / 3
Регистрация: 17.12.2014
Сообщений: 43
08.07.2015, 13:11  [ТС]
Laroux - ты гений!
я конечно немного переделал под себя потому что мне не под одну ссылку а под все разделы нужно подганять но ты меня подтолкнул в нужную сторону спасибо!!!
Вот код может кому то интересно будет:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$full_links = array_unique($full_links);
   $firstelement = array_shift($full_links);
   echo "<br><span style='color: green'>Первая страничка пагинатора - ".$firstelement."</span><br>";
   $endelement = array_pop($full_links);
   echo "<br><span style='color: red'>Последняя страничка пагинатора - ".$endelement."</span><br>";
   $pos = strrpos($endelement, "="); 
   echo "Позиция символа = ".$pos."<br>";
   $limitstart = substr($endelement, $pos+1);
   echo "Номер последней ссылки - ".$limitstart."<br>";
   $kolpage = $limitstart/20;
   echo "Колличество страниц пагинатора - ".$kolpage."<br>";
   $links = substr($firstelement, 0, $pos+1);
   echo "Часть ссылки для подстановки в цикл - ".$links."<br>";
   for($i=0; $i <=$limitstart; $i=($i+20)){
        $linka[] = $links.$i;  
   }
   foreach ($linka as $key => $value) {
       echo $key .' - '.$value.'<br>';
   }
0
08.07.2015, 13:12

Не по теме:

Цитата Сообщение от kisenko Посмотреть сообщение
Laroux - ты гений!
8-)

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.07.2015, 13:12
Помогаю со студенческими работами здесь

Суммирование по условию работает не совсем корректно
Добрый день! Написал макрос для суммирования по условию: Sub страхование() Dim insur As Long insur =...

Код работает не совсем корректно со строками
почему-то при любом количестве строк,которое я задаю,он позволяет написать только одну,а потом переходит к следующему пункту и вообще...

Программа не завершается и не совсем корректно работает
Итак, есть следующая программа отправляющая запрос и принимающая ответ. .h file #ifndef HTTPREQUEST_H #define HTTPREQUEST_H ...

Реестр, вроде и работает но не совсем корректно
Procedure FirstRun(val:boolean); begin UserData:=tregistry.Create; try if not UserData.KeyExists('Software\DLock\') then ...

Написал програму, но она не совсем корректно работает
Создать класс - дата с полями в закрытой части: день (1-31), месяц (1-12), год (целое число). Определить конструктор, деструктор, функции...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru