Web - кодинг: PHP:
Импортирование информации с чужого сайта на свой сайт в свой дизайн
Автор: Тотоев Александр
Источник:
Импортирование
информации с чужого сайта на свой сайт в свой дизайн. (На примере
импортирования прогнозов погоды с Yahoo.)
Добре,
господа!
Пример предназначен
для тех, кто начинает работать с php, и не только для
них.
Результатом работы
программы(скрипта) является прогноз погоды на 5 дней для любого,
интересующего Вас города, выводимый в виде, который нравится именно
Вам, а не дизайнерам сайта-донора.
Информация в таких
случаях берется с известных серверов прогноза погоды (где не пишут
фразу "запрещено использование информации" и т.п.). В данном случае
используется сервер http://weather.yahoo.com , на котором есть
страницы с погодой для довольно большого количества городов, и
практически всегда можно найти если не интересующий Вас город, то
ближайший ему и идентичный по погодным условиям.
Это законченный
проект, работающий на сайте http://sim-sim.ru в разделе туризма
"погода в мире".
Единственным
недостатком является лишь то, что админу приходится вводить в
текстовый файл (возможен вариант с mysql, но в том случае мне было
проще сделать в файле) название населенного пункта на родном языке и
ссылку на страницу с прогнозом погоды на него на сервере Яхо. Но
никто за Вас этого делать не будет.
Посему, скрипт
состоит из 2-х частей:
1. Файл с
администрированием (вводится в первую строку название города, на
следующей строке - ссылка). Разбирать работу данной части, думаю, не
стоит, комментариев более чем достаточно.
2. Файл с самой
программой. Работа программы будет подробно описана
ниже.
1.
Администрирование.
Выводим на экран
форму с паролем pass. В окне вводятся: номера названия ссылки Затем,
после нажатия на кнопку и проверки пароля, записываем новый список в
файл.
<html>
<head>
<title>admin
weather</title>
</head>
<body>
<?php
$adr=$DOCUMENT_ROOT."/weather/weather.ini";
// адрес файла, в котором и будут записываться названия городов со
ссылками
$password='pass'; //
простенькая система авторизации
$eror='Password
eror!';
$old=file($adr); //
читаем то, что сейчас есть в файле
if ($submit) { //
проверяем на нажатость кнопки
if
($pass==$password) {
$fp=fopen($adr,"w");
fwrite ($fp, $ini);
// записываем в файл измененные данные
fclose($fp);
$old=file($adr);
}
else
{
echo
$eror;
}
}
?>
<form method=post
action="<?php echo $PHP_SELF?>"> // информация, введенная в
форму, обрабатывается этим же файлом
password:<input
type=text name=pass><br>
inicialisation:<textarea
name="ini" rows=15 cols=60>
<?
for ($i=0;
$i<sizeof($old); $i++) {
echo $old[$i], "";
// выводим на экран текущий вариант файла
}
?>
</textarea>
<br>
<input
type=submit name="submit" value="Enter">
</form>
</body>
</html>
После ввода
информации в файл в виде, получаем:
50
Ларнака
51
Пафос
"44" - номер
города.
"Ларнака" - название
города.
"http://weather.yahoo.com/forecast/Larnaca_CY_f.html"
- ссылка на погоду в городе Ларнака на Яхе.
Ссылки на города
организовываются по принципу:
<a
href=http://www.sim-sim.ru/catalogue/weather.php?weather=50>Ларнака</a>
А можно
так:
<a
href=http://www.sim-sim.ru/catalogue/weather.php?city=Ларнака>Ларнака</a>
Но если город из
друх слов, то в пробелах пишем "%20"
В таком случае,
номера городов в списке не нужны:
Ларнака
http://weather.yahoo.com/forecast/Larnaca_CY_f.html
Пафос
http://weather.yahoo.com/forecast/Paphos_CY_f.html
Если у нас не
текстовый файл, а mysql, то все проще.
Если кому
понадобится вариант с mysql, пишите мне
totoeval@mtu-net.ru
2. Программа (собственно, адаптер чужого
кода к Вашему сайту).
<table width=100%
border=0 cellspacing=0 cellpadding=2 bgcolor=<? echo $brdcolor;
?>>
<tr>
<td>
<br>
<!-----------------------
FORECAST ------------------------->
<?php
$ini=$DOCUMENT_ROOT.'/weather/weather.ini';
$region=file($ini);
// читаем файл со списком городов-ссылок а массив
$region
// определение
координат искомого города
for ($i=0;
$i<sizeof($region); $i++) {
if
(trim($region[$i])==$weather) { // ищем номер города в
списке
$city=trim($region[$i+1]);
// название города
$adr=trim($region[$i+2]);
// адрес страницы
}
else
{
}
}
// если у нас
передается информация не номером города, а названием,
то:
for ($i=0;
$i<sizeof($region); $i++) {
$city=str_replace($city,"%20","
"); // заменяем "%20" на " "
if
(trim($region[$i])==$city) { // ищем название города в
списке
$adr=trim($region[$i+1]);
// адрес страницы
}
else
{
}
}
// Входная
информация для дальнейшего кода - $adr (адрес страницы прогноза
погоды для города на сайте http://weather.yahoo.com)/ и $city -
название города на родном языке.
//
// фразы для поиска
полезной информации. Оригинал фраз можно обнаружить на странице,
например, этой , проанализировав код.
// здесь заводим в
переменные фразы, по которым будем искать нужную информацию
(градусы, описания погоды, картинки). Используем фразы до и после
необходимой информации.
Этот блок в будущем
придется изменять, когда на оригинале (weather.yahoo.com) изменится
код страниц.
$begin_screen='FORECAST
----'; // начальная фраза таблицы с прогнозом
погоды
$end_screen='</b></td></tr></table></td></tr></table>';
// последняя фраза таблицы
$post_gradus='</font></b><';
// после градусов
$before_gradus='<font
size="3" face="arial">'; // перед градусами
$before_image='http://us.i1.yimg.com/us.yimg.com/i/we/fc/';
// перед картинкой
$post_image='.gif';
// после картинки
$before_forecast='top><font
face="arial" size="2">'; // перед фразой погоды
$post_forecast='</font></td><td>';
// после фразы погоды
// массивы для
переводов даты и описаний погоды с английского языка на родной (в
данном случае использован вариант перевода с буржуйского на язык,
которым разговаривал Ленин.
$endat=array("
","Mon","Tue","Wed","Thu","Fri","Sat","Sun","May","Jul","Jun","Aug",
"Sep","Oct","Nov","Dec","Jan","Feb","Mar","Apr");
// английские даты
$rudat=array("
","понедельник","вторник","среда","четверг","пятница","суббота","воскресенье",
"мая","июля","июня","августа",
"сентября","октября","ноября","декабря","января","февраля","марта","апреля");
// родные даты
$eng=array("
","Thunderstorms","Sunny","Partly Cloudy","Showers","Rain","Mostly
Cloudy","Tstorms","Drizzle","Cloudy","Flurries","Fog","High","Low","Clear","Sleet",
"Rain/snow","Snow
Showers","Mixed Snow", "Rain", "Snow","Mixed"); // английские
описания погоды
$rus=array("
","гроза","ясно","переменная
облачность","ливень","дожди","облачно","гроза","изморось","пасмурно","снегопад",
"туман","день","ночь","ясно","дождь
со снегом","дождь со снегом","мокрый снег","снег с
дождем","снег","переменно"); // российские аналоги
погоды
$brdcolor='white';
// цвет рамки таблицы прогноза (белый)
$bgcolor='#eeeeee';
//цвет фона ячеек таблицы (лучше - цвет фона
страницы)
// А Здесь
начинается код программы, который изменять не
придется.
// занимаемся
созданием даты, выводимой на экран.
Функция time() даст
нам текущее время. Функцией date(d." ".M,$t[$i]) получаем дату
текущего и последующих 4 дней, а date(D,$t[$i]) дает нам дни недели
всех 5 дней. А затем переводим даты с английского языка на
родной.
$t=array(4);
$d=array(4);
$dn=array(4);
for ($i=0; $i<=4;
$i++) {
$t[$i]=time()+$i*86400;
$d[$i]=date(d."
".M,$t[$i]);
$dn[$i]=date(D,$t[$i]);
for ($j=0;
$j<sizeof($endat); $j++) { // переводим слова в дате и получаем
даты на родном языке
$d[$i]=str_replace($endat[$j],$rudat[$j],$d[$i]);
$dn[$i]=str_replace($endat[$j],$rudat[$j],$dn[$i]);
} // и получаем даты
на языке, которым разговаривает наш нонешний Вова
}
// начинаем
обрабатывать страницу.
// Выясняем строки
начала и конца таблицы с прогнозом погоды. Затем, будем работать
именно с этим блоком.
$screen=file($adr);
// читаем страницу с прогнозом погоды в переменную
$screen
for ($i=1;
$i<sizeof($screen); $i++) { // обрабатываем строки с первой по
последнюю
if
(strpos($screen[$i],$begin_screen)==false) { //находим начало
таблицы с прогнозом
if
(strpos($screen[$i],$end_screen)==false) { //находим ее
конец
}
else {$m=$i; // $m -
номер последней строки таблицы
}
}
else {$k=$i; // $k -
номер первой строки таблицы
}
} // Получаем с
$screen[$k] по $screen[$m] - нашу таблицу с погодой. Потом
будемработать именно с ней, чтобы не было лишних совпадений, и
быстро работала программа.
// Можно ее выводить
в "родном дизайне, но нам это не нравится
// Начинаем искать
полезную информацию.
$grad=array(9); //
массив из 10 чисел градусов температуры окружающей
среды
$zed=0; // счетчик
градусов
for ($i=$k;
$i<=$m; $i++) { //работаем с градусами
if
(strpos($screen[$i],$before_gradus,0)==false) { //если нет градусов
в строке (если нет фразы, стоящей перед градусами.
}
else {// если есть
градусы в строке
$string_grad=$screen[$i];
// сохраняем строку с градусами в переменную
$string_grad=explode($before_gradus,$string_grad);
// разбиваем строку на массив строк по разделителю, которым является
фраза перед градусами, таким образом, мы получаем в 1 элементе
массива строку, которая начинается собственно с самого градуса
погоды.
$end_grad=strpos($string_grad[1],$post_gradus,0);
// определяем позицию начала фразы, идущей после
градуса.
$grad[$zed]=substr($string_grad[1],0,$end_grad);
// первый градус получаем, как подстрока, с 0-го символа до начала
фразы после градуса.
$zed++; // инкремент
счетчика градусов
$end_grad=strpos($string_grad[2],$post_gradus,0);
$grad[$zed]=substr($string_grad[2],0,$end_grad);
// второй градус
$zed++; // инкремент
счетчика градусов
}
} // в результате
чего, мы получили все градусы на нашей странице
// переводим
фаренгейты в цельсии
for ($i=0; $i<=9;
$i++) {$grad[$i]=round(5/9*($grad[$i]-32));
}
// в варианте с
забиранием информации со страницы с цельсиями
// эту строку стоит
просто закомментировать. Я оставил так, просто
каприз.
// переводим
фаренгейты в цельсии
// находим слова
погоды абсолютно аналогично поиску градусов
$zed=0; // счетчик
описаний погоды
for ($i=$k;
$i<=$m; $i++) { //работаем с описаниями
if
(strpos($screen[$i],$before_forecast,0)==false) { //если нет
описания погоды в строке
}
else {// если есть
описания в строке
$string_grad=$screen[$i];
// сохраняем строку с описаниями в переменную
$string_grad=explode($before_forecast,$string_grad);
$end_grad=strpos($string_grad[1],$post_forecast,0);
$forec[$zed]=substr($string_grad[1],0,$end_grad);
for ($j=0;
$j<sizeof($eng); $j++) { // перебираем все варианты слов в
описаниях
$forec[$zed]=str_replace($eng[$j],$rus[$j],$forec[$zed]);
// переводим слова
}
$zed++; // инкремент
счетчика описаний
}
} // в результате
чего, мы получили все описания погоды на нашей
странице
$zed=0; // счетчик
слов картинок аналогично
for ($i=$k;
$i<$m; $i++) { //работаем с картинками
if
(strpos($screen[$i],$before_image,0)==false) { //если нет описания
погоды в строке
}
else {// если есть
картинки в строке
$string_grad=$screen[$i];
// сохраняем строку с картинками в переменную
$string_grad=explode($before_image,$string_grad);
$end_grad=strpos($string_grad[1],$post_image,0);
$for_img[$zed]=substr($string_grad[1],0,$end_grad);
$zed++; // инкремент
счетчика картинок
}
} // в результате
чего, мы получили все картинки на нашей странице
?>
// публикуем
результаты:
<table width=100%
cellpadding=0 cellspacing=0 border=0>
<tr><td
width=20% align=center><font size=3><b
><? echo
$city; // выводим название города, для которого отображается прогноз
погоды
?></b><br></font></td></tr></table
><table
width=100% cellpadding=0 cellspacing=0
border=0>
<tr><?
for ($i=0; $i<=4;
$i++) { // выводим на экран ячейки с датами и
днями
echo "<td
width=20% align=center><font
size=2><b>$d[$i]<br>$dn[$i]</b></font></td>";
}
?></tr
></table
><table
width=100% cellpadding=0 cellspacing=0 border=0 bgcolor=<? echo
$brdcolor; ?>
><tr><td
><table
width=100% cellpadding=2 cellspacing=1 border=0
><tr><?
$zed=0; // счетчик
выводимых градусов
for ($i=0; $i<=4;
$i++) { // выводим ячейки с прогнозами - картинки, градусы,
описания
$zed1=$zed+1;
echo "<td
width=20% align=center bgcolor=$bgcolor valign=middle><img
src=../pic/".$for_img[$i].".gif border=0
alt=".$forec[$i]."><br><br><font
size=2>".$forec[$i]."</font><br><br><font
size=3><b>".$grad[$zed]."°C<br>".$grad[$zed1]."°C</b></font></td>";
$zed=$zed+2;
}
?>
</tr></table>
// картинки можно
привязать к картинкам Яхи (названия аналогичных по погоде совпадают,
как в моем случае), а можно сделать массивы соответствия
слов-описаний погоды и Ваших картинок. Это по-желанию. Что
долговечнее, трудно судить. И фразы-описания они могут изменить, и
картинки переименовать. Можно, конечно договориться с админом Яхи,
чтобы они не меняли один из этих элементов и отталкиваться от него,
но у меня не было его телефона:о)
</td>
</tr>
</table>
Теперь программа
работает, и ее можно вставлять в свой дизайн. Вот вариант:
Если кого
заинтересуют "вариации на тему" или возникнут вопросы, прошу писать
мне totoeval@mtu-net.ru . А также, пишите все, кто сможет
посоветовать другие варианты. Всегда рад критике и возможности
повысить свой уровень.
При перепечатке любого материала
с сайта, видимая ссылка на источник www.warayg.narod.ru
и все имена, ссылки авторов обязательны.
© 2005
|