Парсинг на PHP с помощью Simple HTML DOM Parser

Парсинг или граббер - это получение данных с других сайтов, путём сопоставления правилам их поиска.

Для большенства задач связанных с вопросом парсинга на PHP - достаточно библиотеки Simple HTML DOM Parser.
Основное преимущество - простота, но главный минус скорость работы.

Давайте попробуем распарсить всем известный Avito

Задача: получить новые обьекты в категории постранично

1. Скачаем, распакуем, подключим


Скачиваем с sourceforge simplehtmldom_1_5.zip (343.8 kB) наисвежайшую версию от 2014 года, хоть на дворе и 2016.
В полученом архиве нам интересен только один файл simple_html_dom.php. Кидаем его в корневую директорию и подключаем

<?php

require_once 'simple_html_dom.php';

//создаём новый объект
$html = new simple_html_dom();

?>

Теперь мы ворооружены и опасны как никогда ;)

2. Сделаем функцию для парсинга определённой страницы.


Будем парсить недвижимость Пензы.

Исходная страница

При переходе на вторую страницу добавляется параметр ?p=2



Смотрим, что при параметре ?p=1 у нас так же открывается главная страница. Значит можно обойтись без проверки на первую страницу.

Нас интересуют ссылки на обьекты:


Находим элементы через исходный код страницы, смотрим, что у всех один и тот же класс item-description-title-link.



Значит целесообразно искать по ссылки на обьекты по нему.

function parse_avito_page($start_url, $num) {

        // Загружаем сайт с учётом выбраной страницы
	$html = file_get_html($start_url.'?p='.$num); 

        // Перебираем элементы с классом item-description-title-link
	foreach($html->find('.item-description-title-link') as $a){
        
        // Записываем результат в массив 
    	$arr[] = array ('text'=> trim($a->plaintext), 'link'=> 'https://www.avito.ru'.$a->href);
  	}

  	return $arr;
}


Simple HTML DOM Parser умеет извлекать:

plaintext Текст
tag Имя тега
class Имя класа
outertext Получить всё, что вне элемента
innertext Получить всё, что внутри элемента
любой атрибут Будь то src, href, title


Умеет искать по:
- Тегу
- Классу
- ID

3. Применяем


Итого у нас получается следущее:

<?php

require_once 'simple_html_dom.php';
$html = new simple_html_dom();

function parse_avito_page($start_url, $num) {
	$html = file_get_html($start_url.'?p='.$num); 
	foreach($html->find('.item-description-title-link') as $a){
    	$arr[] = array ('text'=> trim($a->plaintext), 'link'=> 'https://www.avito.ru'.$a->href);
  	}
  	return $arr;
}

// Стартовая страница
$avito_page = 'https://www.avito.ru/penza/nedvizhimost';

// Выводим массивом первую страницу
print_r(parse_avito_page($avito_page, 1));

?>

После запуска скрипта спарсилось 50 ссылок на обьекты с первой страницы.

Результат:

Array
(
    [0] => Array
        (
            [text] => 1-к квартира, 43 м², 4/10 эт.
            [link] => https://www.avito.ru/penza/kvartiry/1-k_kvartira_43_m_410_et._548929607
        )

    [1] => Array
        (
            [text] => Комната 13 м² в 5-к, 3/4 эт.
            [link] => https://www.avito.ru/penza/komnaty/komnata_13_m_v_5-k_34_et._846776782
        )

    [2] => Array
        (
            [text] => 1-к квартира, 27 м², 9/10 эт.
            [link] => https://www.avito.ru/penza/kvartiry/1-k_kvartira_27_m_910_et._790457909
        )

    // И ещё 48 
)



Случайный урок: Страница авторизации ( Часть 3 )


Дописываем проверку на js. При неправильных данных выводится окно предупреждения, иначе переадресует...
Оставить заявку
Имя
Email
Телефон
Опишите суть
Написать сообщение
Имя
Email
Сообщение