На днях потребовалось создать парсер, который собирал бы информацию с сайта Кинопоиск. Изначально, я стал писать парсер для rmdb.ru, но потом наткнулся на то, что на rmdb есть далеко не все фильмы. По этому, частенько парсер ошибался и выдавал не те результаты, которые хотелось бы видеть. И было принято решение поменять источник с rmdb на Кинопоиск. Хочу сразу предостеречь, что в кинопоиске есть защита от таких вот парсеров. При привышении определенного числа запросов, ваш ip-адрес на определенное время блокируется. Что не есть удобно для обработки! Есть два выхода — использовать прокси или авторизацию. Т.к. судя по тестам, зарегистрированные пользователи не ограничены в количестве запросов.
Ок, передем от слов к делу. Чтобы осуществить авторизацию или работать через прокси, я воспользовался уже готовым классом Snoopy (ссылку на него можно найти в конце статьи). Хотя, первые попытки, были через CURL.
<?php # всякие переменные # название фильма $movie = "форсаж"; # url поиска $search_url = "http://www.kinopoisk.ru/index.php?kp_query="; # url фильма $movie_url = "http://www.kinopoisk.ru/level/1/film/"; # первые символы перед url и последние после $url_start = "<a class="all" href="/level/1/film/"; $url_end = "/sr/1/">"; # Snoopy include "Snoopy.class.php"; $snoopy = new Snoopy; # авторизация $snoopy->user = "логин"; $snoopy->pass = "пароль"; $snoopy->agent = "(compatible; MSIE 4.01; MSN 2.5; AOL 4.0; Windows 98)"; # ищем фильм $movie = urlencode($movie); $snoopy->fetch($search_url.$movie); $f = $snoopy->results; # и вырезаем его id $begin = strpos(strtolower($f), $url_start, 0); $end = strpos(strtolower($f), $url_end, $begin); $movie_id = substr($f, $begin+35, $end-$begin-35); // получаем данные о фильме $snoopy->fetch($movie_url.$movie_id."/"); $f = $snoopy->results; # и вырезаем его описание $begin = strpos(strtolower($f), "<tr><td colspan=3 style="padding:10px;padding-left:20px;" class="news">", 0); $end = strpos(strtolower($f), "</td></tr>", $begin); $desc = substr($f, $begin+75, $end-$begin-75); # вот оно echo $desc; ?>
При первых ошибках на Кинопоиске, когда меня первый раз заблокировало. Я думал, что блокировка идет из-за того, что у меня в заголовке не указан user-agent. Пробовал его установить — не помогало. Устанавливается user-agent следующим образом:
ini_set('user_agent', 'Opera/9.10 (Windows NT 5.1; U; ru)');
В принципе, данный скрипт лишь показывает примерный путь, по которому можно писать парсер. Существует еще множество вариантов. Например, используя тот же Snoopy. В нем реализован достаточно большой функционал. Чтобы не перепечатывать примеры, приведенные в этом классе, я привожу ссылку на него. В нем все подробно описано.
Ссылки по теме
1. Класс Snoopy