Понадобилось мне на днях написать парсилку для одного сервиса. На сайте us.lastminute.com можно сделать заказ на покупку авиабилетов между заданными городами. Нужно было поставить у себя такую же форму, и по запросу парсить вышеуказанный сайт, а потом выводить полученные рейсы с увеличенными ценами на билеты=)
Проблема началось с того, что форма была очень наворочена - куча непонятных hidden полей, какие-то хитрые JS-скрипты. Схема работы серверных скриптов была мне понятна: делаем запрос в форме, скрипт выдает страницу с псевдоиндикатором поиска, хотя в самом коде уже стоит js редирект с id запроса на страницу с результатами запроса. Если запрос немного не точен, то выдавалась другая форма, предлагающая повторный ввод некоторых данных, так как “Извините, но мы потеряли ваш запрос.” Проскочить этот момент у меня получилось, куку дернуть тоже получилось. Дальше я регулярным выражением отлавливал URL редиректа и пытался спарсить оттуда страницу. Самое парадоксальное то, что скрипт выдавал форму с предложением ввести опять данные из-за потери запроса, но если ввести этот URL в браузер, то вуаля, я вижу цены)
После двух дней секса с этим сайтом, у меня так и не вышло получение цен на билеты! Если у вас на сайте стоит востребованный и уникальный сервис, возможно, встанет проблема из-за больших нагрузок на сервер, так как какой-нибудь хитрый кодер постоянно парсит результаты выдачи) Проблема решается вот такими извратами с запросами или банальнейшей капчой. Самое обидное, что ребята лучше бы поставили капчу, и я бы не стал убивать два дня на безуспешные попытки их парсить) Еще интересен момент построения подобных сервисов на ajax’e. Я даже представить пока не могу, как их парсить, если это вообще реально)
Новичкам может будет интересно узнать, как вообще пишутся парсеры на пхп. А получение данных идет тремя способами:
- функция file();
- curl библиотека
- сокеты
Я предпочитаю первый вариант, если плясок с бубном никаких не надо, и тогда парсер пишется в одну строчку:
$parsed_text = implode(”, file(’http://www.site.com’));
Если же требуется ловить кукисы или делать запросы через прокси, то curl вам в помощь. Подробные мануалы по нему можно легко найти в инете. Сокеты же - более универсальный и более сложный способ парсинья, тк сокеты - это некий способ обмена данными между процессами, будь то http-запрос или получение почты по протоколу imap.