Пагинация страниц для парсера simple html dom

139
07 сентября 2019, 20:20


Нужно при парсинге страницы с помощью simple html dom, сделать пагинацию. То есть парсер в странице каталога собирает ссылки на товары, но собирает эти ссылки он с 1 страницы, как сделать чтобы он собирал и со второй (третьей,... пятой) тоже?

Нашел здесь же одно решение:

define('PAGE_COUNT', 250);
define('URL_PATTERN', "https://itp.ne.jp/genre_dir/9570/pg/[pnum]/?sr=1&ngr=1&num=20");
$urls = [];
for($pnum = 1; $pnum <= PAGE_COUNT; $pnum++){
    $urls[] = str_replace( '[pnum]', $pnum, URL_PATTERN);
}
print_r($urls);

Попробовал у себя сделать сделать так:

define('PAGE_COUNT', 2);
define('URL_PATTERN', "https://rozetka.com.ua/uslugi/c153670/page=[pnum]/");
$urls = [];
for($pnum = 1; $pnum <= PAGE_COUNT; $pnum++){
    $urls[] = str_replace( '[pnum]', $pnum, URL_PATTERN);

foreach ($urls as $url) {
    $html = curl_get($url);
    $dom = str_get_html($html);
    $services = $dom->find('.g-i-tile-i-box-desc');
foreach($services as $service){ 
    $a = $service->find('.g-i-tile-i-title a', 0);
echo $a->href . '<br>';
}
}
}

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

Как сделать так чтобы выгружались ссылки и с первой и со второй страницы?

Answer 1

Как минимум тут ошибка в коде, должно быть так (сначала заполнить весь массив url):

define('PAGE_COUNT', 2);
define('URL_PATTERN', "https://rozetka.com.ua/uslugi/c153670/page=[pnum]/");
$urls = [];
for($pnum = 1; $pnum <= PAGE_COUNT; $pnum++){
    $urls[] = str_replace( '[pnum]', $pnum, URL_PATTERN);
}
foreach ($urls as $url) {
    $html = curl_get($url);
    $dom = str_get_html($html);
    $services = $dom->find('.g-i-tile-i-box-desc');
    foreach($services as $service){ 
        $a = $service->find('.g-i-tile-i-title a', 0);
        echo $a->href . '<br>';
    }
}

Ну и далее curl может тупо не забирает первую страницу если неподключен CURLOPT_FOLLOWLOCATION

с https://rozetka.com.ua/uslugi/c153670/page=1/ идет 301 редирект на https://rozetka.com.ua/uslugi/c153670/

Ну и если дело действительно в 301 редиректе вариант решения без ковыряния curl

define('PAGE_COUNT', 2);
define('URL_PATTERN', "https://rozetka.com.ua/uslugi/c153670/");
$urls = [];
for($pnum = 1; $pnum <= PAGE_COUNT; $pnum++){
    $urls[] = URL_PATTERN.($pnum==1 ? null : "page=$pnum/" );
}
foreach ($urls as $url) {
    $html = curl_get($url);
    $dom = str_get_html($html);
    $services = $dom->find('.g-i-tile-i-box-desc');
    foreach($services as $service){ 
        $a = $service->find('.g-i-tile-i-title a', 0);
        echo $a->href . '<br>';
    }
}
READ ALSO
Unoconv медленно работает

Unoconv медленно работает

установил unoconv на железо под ОС LinuxЖелезо достаточно мощное

120
Не работает обработчик даты

Не работает обработчик даты

написал скрипт, который выводит из базы данных дату последнего действияНо он не работает, пожалуйста помогите решить проблему :)

125
Wordpress - задать условие

Wordpress - задать условие

Есть вывод дочерних рубрик с постами одной указанной рубрики с id 23Все работает прекрасно, но нужно задать условие, не выводить рубрики, у которых...

123
Запустить файл из консоли как PHP

Запустить файл из консоли как PHP

Есть файлик без расширения, именуемый testfile, с содержимым:

144