Настроить PHP парсер DiDOM

124
25 июля 2019, 07:20

Изучаю написание парсера контента, остановился на библиотеке DiDOM.

Получается спарсить нужную информацию с одной страницы:

require_once('vendor/autoload.php');
use DiDom\Document;
$document = new Document('https://site.ru/catalog/tovar/', true);
//Находим заголовок 
$main_heading = $document->find('.product-title h1')[0];
echo $main_heading->html();
//Находим цену
$price = $document->find('.item_current_price')[0];
$price->text();
//Находим фото
$foto = $document->find('.bx_bigimages_imgcontainer img')[0];

С одной страницой в целом все понятно. Но, никак не могу понять логику обхода и получения контента с большого количества страниц. Как это в принципе делается?

Парсер должен находить дочерние страницы по ссылкам в каталоге товаров (к примеру), или получать ссылки их XML карты сайта, или еще каким то образом выгружать список ссылок и потом идти по ним, находя там заданную информацию?

Просьба натолкнуть на мысль, пожалуйста.

Answer 1

Как то раз мне нужно было парсит IP для мониторинга игровых серверов. Там ссылки выглядели так:

site.ru/page?page=1 - Тут 50 серверов
site.ru/page?page=2 - Тут 50 серверов
site.ru/page?page=3 - Тут 50 серверов

Я сделал просто цикл for:

for ($i = 0; $i < 10; $i++) {
 $url = "site.ru/page?page=$i";
 #Тут идет код парсинга
}

Где 10 это количество страниц.

Answer 2

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

<?php
// Здесь нужно подключить API своей системы, если файл внешний
require_once('vendor/autoload.php');
use DiDom\Document;
//Получаем каталог с товарами
$document = new Document('http://site.ru/catalog/', true);
//Находим ссылку по которой будем переходить на товар
$links = $document->find('a.startshop-name');
//Создаем цикл
foreach ($links as $key => $value) 
  { 
    //Получаем и проходимся в цикле по всем url товаров, что идет после site.ru/catalog
    $dodo = $value->getAttribute('href');
    //Подставляем массив ссылок для перебора
    $massa = "http://site.ru/$dodo";
    $document = new Document($massa, true);
    //Находим H1 на страницах
    $main_heading = $document->find('h1')[0];
    //Находим фото
    $foto = $document->find('#slider_images a::attr(href)')[0];
    // Здесь создаем новый ресурс через API вашей системы с поставлением полученных данных
READ ALSO
Как изменить цвет иконки SVG с помощью CSS?

Как изменить цвет иконки SVG с помощью CSS?

На странице есть иконки в формате SVGСами иконки нарисованы в черном цвете

159
Математический маятник с шаром

Математический маятник с шаром

Итак, у нас есть математический маятникПомогите реализовать, чтобы после запуска программы можно было в ручную (мышкой) поднять шар и отпустить...

122
Frontend. Как реализовать блок? [закрыт]

Frontend. Как реализовать блок? [закрыт]

Нужно чтобы при нажатии на цифры, выделенные красным, менялся контент, выделенный зеленымТолько начинаю свой путь в верстке, подскажите с помощью...

150
c# как отправить текст в Яндекс.Алиса?

c# как отправить текст в Яндекс.Алиса?

Задумал написать расширение для twitch бота - общение с Алисой в текстовом виде

153