На днях потребовалось создать парсер, который собирал бы информацию с сайта Кинопоиск. Изначально, я стал писать парсер для 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