Сейчас мы с вами займемся парсингом сайтов, которые подгружают свой контент через AJAX или генерируют его на JavaScript.

На самом деле парсить сайты на AJAX проще, потому что чаще всего данные приходят в формате JSON - и их не нужно парсить, достаточно преобразовать их из джейсона в PHP массив.

Однако, свои нюансы есть и тут. Давайте с ними разбираться.

Парсинг AJAX

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

Как происходит обновление - страница шлет запрос на определенный URL, по обращению на который можно получить кусочек страницы. Если знать этот URL, то можно курлом отправить на него запрос и получить этот кусочек страницы, так же, как это делает браузер.

Как получить этот урл: его можно отследить специальными средствами, например, в отладчике браузера Хром. Как это сделать, смотрите в следующем видео:

Тут скоро будет видео.

Возможные проблемы

Чаще всего нет разницы, напрямую мы обращаемся к урл для аякса или это делает браузер. Однако, бывает такое, что сервер отслеживает, откуда пришел запрос.

Это отслеживание заключается в проверке сервером заголовка Referer со значением URL страницы, с которой должен был прийти аякс запрос и/или проверки наличия заголовка X-Requested-With со значением XMLHttpRequest.

Итак, если по вашему обращению на URL для аякса не появляется нужно вам содержимое - попробуйте отправить эти заголовки и страница магическим начнет работать:)

Парсинг JSON

Достаточно часто URL для аякса отдает не готовый HTML код, а данные в формате JSON. Это нам на руку - ведь их не нужно парсить, достаточно преобразовать их из джейсона в PHP массив. Это делает функция json_decode(строка в json, true) - первым параметром она принимает строку в формате JSON, а возвращает массив PHP, в который разобран этот JSON.

Нюанс: без второго параметра или когда он установлен в false функция json_decode возвращает объект. Работа с этим объектом похожа на работу с объектами phpQuery. В общем-то, как по мне - удобнее работать с массивом, поэтому проще передать второй параметр в значении true.

Парсинг JavaScript

Иногда бывает так, что данные не откуда не грузятся, а уже есть на странице, просто хранятся в массиве JavaScript. Признак: если страница меняется как будто работает AJAX, однако в отладчике никаких аякс запросов нет.