Я уже писал о том, как правильно грабить сайты. В качестве примера информации, которую нужно грабить с других сайтов, я приводил погоду. Вот, решил написать статью, где расскажу как можно получить погоду с сайта gismeteo.ru.
Я буду грабить RSS с этого сайта. Это просто и быстро.
RSS — это технология, предназначенная не только для того, чтобы пользователь мог следить за большим количеством сайтов, не сходя с места. Эта технология предоставляет удобные возможности для обработки программным способом.
Так как сам я живу недалеко от Москвы, то будем грабить RSS города Москва. Хотя, вы можете подставить адрес фида для другого города, и скрипт будет работать.
Для начала, нам нужно получить данные с сервера gismeteo.ru. Нам понадобится RSS-лента погоды в Москве.
$file = file_get_contents("http://informer.gismeteo.ru/rss/27612.xml");
Теперь вся лента находится в переменной $file.
Теперь у меня непреодолимое желание разбить нашу ленту на item-ы — еденицы информации в потоке. Для этого воспользуемся несложным регулярным выражением:
preg_match_all("#<item.*?>(.*?)</item>#is", $file, $items);
Теперь в массиве $items лежит содержимое каждой единицы информации с гисметео.
Теперь нужно пробежаться по каждому итему и выдрать из него данные, которые нам нужны. Я это делал так:
foreach($items[1] as $item)
{
#получаем заголовок
preg_match("#<title>(.*?)</title>#is", $item, $title);
#отрезаем слово "Москва", итак понятно)
$title = str_replace("Москва: ", "", $title[1]);
#Ищем цифры в заголовке. Это будет дата.
preg_match("#(\d+)#", $title, $date);
$date = $date[1];
#выдергиваем текст описания.
preg_match("#<description>(.*?)</description>#is", $item, $descr);
#Отбрасываем все, что за температурой (давление, ветер и пр.)
#Если эта информация тоже нужна, то можно убить эту строчку.
$descr = preg_replace("#(\d{1,2}\.\.-\d{1,2} С).*#i", "$$1", $descr[1]);
#получаем адрес картинки.
preg_match("#<enclosure url=(['\"])(.*?)\\1#is", $item, $img);
$img = $img[2];
#инициализируем поля будущей структуры
$dat['title'] = $title;
$dat['descr'] = $descr;
$dat['date'] = $date;
$dat['img'] = $img;
#добавляем в структуру наши поля
$data[] = $dat;
}
Теперь у нас есть структурина $data. Как она выглядит и как может выглядеть вывод полученной нами информации, можно посмотреть здесь.
Нет, использовать такой граббер нежелательно. И вот почему: представьте, вы включили код этого граббера в код своего сайта. Погода у вас будет отображаться, но подумайте, что будет происходить.
Каждый раз, при загрузке страницы, ваш движок будет лезьть на гисметео и брать оттуда RSS. Затем, будет производиться разбор (довольно долгий) этого потока. И только потом вы выведете результат.
Я советую использовать кэширование. О кэшировании хорошо писал Анатолий Ларин (часть 1, часть 2). Но мы поступим проще.
Давайте немного доработаем скрипт. Нам нужно, чтобы он лазил на сайт гисметео всего лишь пару раз в день. В остальное время, вывод можно не менять. Так давайте будем получать информацию, формировать html, который будем вставлять на наш сайт, и записывать этот html в файл.
$file = fopen("./gismeteo.cache", "w");
foreach($data as $rec)
{
$temp .= "<strong>$rec[title]</strong><br/>";
$temp .= "<img src='$rec[img]'/>";
$temp .= "<span>$rec[descr]</span><hr/>";
}
fwrite($file, $temp);
fclose($file);
Теперь, когда наш скрипт отработает, мы получим файл gismeteo.cache, в котором будет храниться то, что нам нужно. Теперь, для вставки погодного инфоблока в код сайта, нужно сделать лишь это:
print file_get_contents('gismeteo.cache');
Обновлять наш кэш можно по chron. Обычно, хостинги поддерживают chron, можно задать обновление кэша два — четыре раза в сутки. Больше — не имеет смысла.
А теперь внимание, вопрос на усидчивость.
Почему наше кэширование никуда не годится и как его можно еще улучшить? Ответ можно найти в моей статье "Как правильно грабить сайты".
Если вы не хотите разбираться в тонкостях грабинга - вы можете закзать грабер сайта у меня. Грабер, подобный тому, что описан в статье будет стоить совсем не дорого.