Погода с географической привязкой на вашем сайте
Здравствуйте, сегодня я расскажу о способе сделать погоду на вашем сайте. Да не просто так сделать, а чтобы регион посетителя определялся автоматически, и он видел погоду «за окном».
Когда я сам столкнулся с такой задачей, я откладывал ее решение, надеясь, что все просто, однако, когда дошли руки до реализации, я схватился за голову — столько было подводных камней в этой теме.
Варианты решения данной проблемы виделись мне крайне прозрачными на первый взгляд:
- XML-импорт погоды с сервиса, который ее предоставляет.
- Настраиваем импорт всех данных по погоде во всех регионах с чужого XML-представления
- Определяем по IP регион пользователя
- Берем уже из базы погоду к этому региону
- Постепенный парсинг HTML-страниц, которые выводят данные в любом формате нужного нам города
- Определяем по IP регион пользователя
- При первом запросе обращаемся к сайту, парсим данные, помещаем в базу, и отдаем пользователю
- При повторном запросе, отдаем данные, уже из базы.
И в том и в другом случае нам изначально нужно определить регион пользователя. Здесь также есть множество путей: либо мы пользуемся онлайн сервисами, либо качаем покупаем готовый дамп базы IP-адресов с привязкой к региону. Я остановился на первом варианте, чтобы не пиратить не тратить деньги (есть, конечно, и бесплатные базы данных, но их качество оставляет желать много лучшего). Итак, для начала, при запросе пользователем данных с моего сайта, я проверяю наличие его адреса в базе данных, если он есть, то выдаю город уже из базы. Если же этого IP в базе нет, то я обращаюсь к сервису, который определяет регион.
Такая у меня получилась функция определения города пользователя. Конечно, после этого данные желательно записать в базу, или хотя бы запомнить в memcached, чтобы не терроризировать сервер-донора запросами. Конечно, это не совсем то, что нужно, потому как при любом структурном изменении содержания страницы представленного сервиса, ее придется переписывать, но денег действительно было жалко.
Затем я задумался, каким путем идти, брать полный прогноз на все города, писать в базу, либо также пользоваться онлайн сервисами. Вопрос конечно больше качественный, и то, насколько вам нужна погода на сайте, частично ответ на этот вопрос. Если вы, к примеру, хотите сделать полноценный сервис прогноза погоды, с рейтингами и графиками, то первый вариант сто процентов ваш, если же вам, как и мне нужно просто написать виджет, то идем вторым путем.
И я начал копать, кто у нас дает данные о погоде, по запросу города. И угадайте, кого я нашел? Нет, не Гисметео, Я натолкнулся на готовый модуль Weather::Google от корпорации зла добра (Google).
Использование модуля — задача, с которой справится даже новичок в мире Perl.
Получается примерно следующее:
Конечно, и здесь желательно результат поместить в базу, либо в memcached(сюда даже предпочтительнее — срок хранения можно выставить), для более быстрого доступа к ним в дальнейшем.
И вот, задача решена. Можно отдыхать.
О том, как написать свой полноценный сервис погоды с блэкджеком и шлюхами, поговорим позже.