14/7/2009 | Tags:geocoding, google maps, imobiliaria, londrina, ruby, yql | Escrito por: Dirceu Pauka Jr.
Sábado eu comecei a procurar uma casa para morar. Eu preciso de uma casa grande e sem vizinhos, assim posso fazer umas festinhas e vender minha cervejinha artesanal. A casa também precisa ficar próxima ao “busão da UEL“.
O problema: nenhum site de imobiliária presta, quanto mais em Londrina.
Poucos sites de imobiliárias mostram as opções em um mapa e nenhuma das páginas que “unem os imóveis de várias imobiliárias” funcionam.
A solução: escrever código.
Com Yahoo Query Language (YQL) eu busquei as “casas para alugar” de 7 imobiliárias.
De fato essa é a parte mais complicada e demorada uma vez que cada imobiliária usa um “padrão” diferente para apresentar as informações e o trabalho aumenta ainda mais por causa da má construção de certas páginas.
Das 7 imobiliárias foi possivel extrair cerca de 100 casas para locação.
Para inserir as informações no mapa foi preciso de uma API de Geocoding. Esse tipo de serviço transforma um endereço (rua e número) em coordenadas geográficas (latitude, longitude).
Minha primeira tentativa foi usar a API de Geocoding do Google porém a Geocoding API do Yahoo! se saiu melhor quando o endereço tem “sujeira” (erros de digitação e/ou encoding zuado).
O resultado:
Muito mais fácil agora.
Tech stuff
O código que une os resultados das imobiliárias foi escrito em Ruby.
A gem typhoeus faz as requisições HTTP.
YQL foi usado para filtrar o conteúdo das páginas.
A gem geokit permite fazer Geocoding em apenas uma função: YahooGeocoder.geocode(”rua”).
Memcache faz cache dos resultados (muitas requisições HTTP machucam).
Sinatra para que o código Ruby vire uma aplicação web.
Google Maps API para inserir os resultados no mapa.
Códigos:
nerd_searching_house.rb / index.erb
Exemplo
Veja o resultado da brincadeira.
Colocar em produção e manter esse “toy project” não está nos meus planos. O exemplo ficará desatualizado em breve e se você precisar de algo atualizado fique a vontade para fazer o código funcionar



