План парсинга одного сайта


И снова заказ на парсинг – на этот раз крупного государственного портала. Требуется написать сервис на php, который будет получать список страниц (ссылок) по некоторым параметрам и потом граббить эти страницы. Давайте распишем общий план парсинга на php.

Получение ссылок

У нас нет списка страниц для граббинга, их необходимо получить, применяя некие параметры фильтрации. Для того, чтобы получить их, надо отправить POST-запрос с помощью php (curl). В этой статье мы уже проделывали что-то подобное, но нелишним будет и повторить:

$url = 'http://куда_идет_запрос ';
$fields = array(
            'Page' => $page,
            'Count' => 25,
            'Courts' => $Courts,
			'DateFrom' => $DateFrom,
			'DateTo' => $DateTo,
			'Sides' => array(
            ),
			'Judges' => array(
            ),
			'CaseNumbers' => array(
            ),
			'CaseType' => $CaseType,
			'WithVKSInstances' => false
        );
$fields_string = http_build_query($fields);
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, 1);
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION, true);
$result = curl_exec($ch);
echo $result;
curl_close($ch);
Откуда мы берем поля, которые отправляются в запросе? Из отладчика любого браузера:



Обратите внимание, что мы отправляем массивы – здесь некоторые пустые. Иногда мы просто не знаем, будут ли элементы в массивах, сколько их, в каком порядке и т.д. К счастью, php дает возможность инициализировать массивы без обозначения размера, а потом добавлять в них элемент по мере необходимости без указания индекса. Получается что-то вроде стека:

$Courts = array();
array_push($Courts, "SPB");
Ну вот получили мы страницу со ссылкам (в коде выше вывели её в браузер), но как достать оттуда эти самые ссылки? Можно воспользоваться любой php-библиотекой для парсинга html, лично я чаще всего использую самую простую – simple html dom. Все, что требуется – это скачать и подключить файл (не забудьте распаковать его), а затем находить элементы согласно правилам. Например, вот так:

include_once('simple_html_dom.php');
$html = str_get_html($result);
foreach($html->find('.instantion-name a') as $element) {
$adres = $element->href;
//что-то делаем с полученной ссылкой
}
Похоже на CsQuery, не правда ли? Ничего удивительного, очень удобно разбирать html-структуру с помощью селекторов. Кстати, если у вас уже есть список страниц, то вам и не нужен будет курл – он требуется только для создания POST-запроса и получения ответа, тогда сразу можно будет получать html из удаленного адреса:

$html = file_get_html('адрес_страницы');
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, php, парсинг




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




Функциональное программирование в PHP
Все комбинации 6 из 36 и общий алгоритм
Почему не работает fadeIn() вместе с html()?