Погода с географической привязкой на вашем сайте

Алтайские горы

Здравствуйте, сегодня я расскажу о способе сделать погоду на вашем сайте. Да не просто так сделать, а чтобы регион посетителя определялся автоматически, и он видел погоду «за окном».

Когда я сам столкнулся с такой задачей, я откладывал ее решение, надеясь, что все просто, однако, когда дошли руки до реализации, я схватился за голову — столько было подводных камней в этой теме.

Варианты решения данной проблемы виделись мне крайне прозрачными на первый взгляд:

  1. XML-импорт погоды с сервиса, который ее предоставляет.
  2. Настраиваем импорт всех данных по погоде во всех регионах с чужого XML-представления
  3. Определяем по IP регион пользователя
  4. Берем уже из базы погоду к этому региону
  5. Постепенный парсинг HTML-страниц, которые выводят данные в любом формате нужного нам города
  6. Определяем по IP регион пользователя
  7. При первом запросе обращаемся к сайту, парсим данные, помещаем в базу, и отдаем пользователю
  8. При повторном запросе, отдаем данные, уже из базы.

И в том и в другом случае нам изначально нужно определить регион пользователя. Здесь также есть множество путей: либо мы пользуемся онлайн сервисами, либо качаем покупаем готовый дамп базы IP-адресов с привязкой к региону. Я остановился на первом варианте, чтобы не пиратить не тратить деньги (есть, конечно, и бесплатные базы данных, но их качество оставляет желать много лучшего). Итак, для начала, при запросе пользователем данных с моего сайта, я проверяю наличие его адреса в базе данных, если он есть, то выдаю город уже из базы. Если же этого IP в базе нет, то я обращаюсь к сервису, который определяет регион.

Такая у меня получилась функция определения города пользователя. Конечно, после этого данные желательно записать в базу, или хотя бы запомнить в memcached, чтобы не терроризировать сервер-донора запросами. Конечно, это не совсем то, что нужно, потому как при любом структурном изменении содержания страницы представленного сервиса, ее придется переписывать, но денег действительно было жалко.

Затем я задумался, каким путем идти, брать полный прогноз на все города, писать в базу, либо также пользоваться онлайн сервисами. Вопрос конечно больше качественный, и то, насколько вам нужна погода на сайте, частично ответ на этот вопрос. Если вы, к примеру, хотите сделать полноценный сервис прогноза погоды, с рейтингами и графиками, то первый вариант сто процентов ваш, если же вам, как и мне нужно просто написать виджет, то идем вторым путем.

И я начал копать, кто у нас дает данные о погоде, по запросу города. И угадайте, кого я нашел? Нет, не Гисметео, Я натолкнулся на готовый модуль Weather::Google от корпорации зла добра (Google).

Использование модуля — задача, с которой справится даже новичок в мире Perl.

Получается примерно следующее:

Конечно, и здесь желательно результат поместить в базу, либо в memcached(сюда даже предпочтительнее — срок хранения можно выставить), для более быстрого доступа к ним в дальнейшем.

И вот, задача решена. Можно отдыхать.

О том, как написать свой полноценный сервис погоды с блэкджеком и шлюхами, поговорим позже.