Como usar o R para escolher um lugar para morar (3) - Converter CEP em coordenadas geográficas
Posted on November 18, 2016
No primeiro e segundo post desta série, mostrei como obter dados de apartamentos para alugar a partir do site da OLX e analisá-los, mas ainda não temos a resposta definita para a pergunta que motivou esta série: Como o R pode ajudar a escolher um lugar para morar?
Uma boa ideia seria plotar os imóveis em um mapa, não? No terceiro post da série, mostrarei como fazer isso, além de como extrair os CEPs dos imóveis (novamente por web scraping) e converter os CEPs para endereços, que serão usados para obter as coordenadas geográficas dos apartamentos. É mostrado no final um simples gráfico feito com o pacote ggmap.
Extrair CEP do imóvel com web scraping
Para plotar os imóveis em um mapa, precisamos de suas coordenadas geográficas. Tais dados podem ser obtidos com a função geocode do pacote ggmap. Essa função aceita um endereço (ou parte de um) como input e retorna a latitude e a longitude. Por exemplo, para o CEP do estádio Maracanã, no Rio de Janeiro:
Contudo, você deve se lembrar que não possuímos até o momento nenhum dado sobre o endereço dos imóveis. Vamos dar uma olhada novamente nos dados gerados no primeiro post:
Como eu disse, não temos nenhum dado sobre a localização do imóvel - além do bairro, o que é muito pouco. Isso acontece porque a página que lista os apartamentos não informa esses dados, como se vê na imagem abaixo:
Dentro da página do imóvel, já conseguimos ter pelo menos seu CEP:
Ou seja: para extrair o CEP do imóvel, é necessário entrar em sua página! Isso aumenta a complexidade do código em n vezes porque agora teremos de fazer o scraping não de 245 páginas mas sim de mais de 10000.
Para extrair o CEP, a lógica é a mesma da mostrada no primeiro post desta série. Como vamos extrair apenas este único dado da página, vou mostrar o passo-a-passo do scraping mais detalhadamente.
Primeiramente, nós precisamos saber qual é o elemento HTML (chamado de tag) que identifica o CEP no código fonte da página. Não precisa ser expert em HTML para saber isso (eu mesmo não sei nada), basta utilizar as ferramentas do Firefox ou do Chrome para inspecionar a página e descobrir a tag do elemento desejado.
Abra esta página, clique com o botão direito no CEP e clique em Inspecionar elemento (ou algo semelhante). Será aberto um menu na parte inferior do browser com o código fonte da página. Passe o mouse nas diferentes linhas e veja os elementos que correspondem às tags do código.
Na imagem acima, veja que o CEP está dentro do bloco (não sei se é assim mesmo que isso é chamado) da localização do apartamento, cuja tag é indicada pelo string OLXad-location-map mb20px. Na verdade, após fazer alguns testes, descobri que usamos o string .OLXad-location-map para localizar a tag da localização do imóvel. Como não conheço HTML, não sei explicar o porquê disso acontecer. Web scraping tem muito de tentar diversos inputs até conseguir o resultado desejado.
Vamos usar essa informação em nosso código:
Podemos ver que, conforme o esperado, o CEP está dentro do bloco de localização. Só isso já seria necessário para extrair o CEP, mas nós conseguimos melhorar isso para facilitar o processo de data cleaning posteriormente.
Perceba que dentro da tag OLXad-location-map mb20px, existe uma subtag p que identifica apenas o CEP do imóvel.
O output gerado é da classe xml_nodeset e tem três elementos: o município, o CEP e o bairro. Estamos interessados apenas no CEP, portanto:
Agora precisamos fazer um pouco de data cleaning. É necessário apenas remover o caractere - e extrair os algarismos do string. Fazer isso é muito fácil graças ao pacote stringr.
Finalmente, conseguimos extrair o CEP do imóvel. Vamos então aplicar esse mesmo procedimento para os outros apartamentos do data frame. Para automatizar esse processo, criei a função extrairCEP(), que usa uma outra função chamada limparString(). Os códigos de ambas são mostrados abaixo.
Para algumas páginas, a tag de identificação do bloco da localização do apartamento não é .OLXad-location-map mas sim .OLXad-location, por isso a necessidade da if clause na função extrairCEP().
Outro problema é que, em alguns casos, o CEP do imóvel não é informado, fazendo necessário usar a função tryCatch() para retornar NA em caso de erro:
Obter endereço a partir do CEP
Como eu mostrei no início do post, seria possível conseguir as coordenadas do imóvel (ou pelo menos da rua dele) a partir do CEP. Entretanto, em alguns testes que eu fiz, percebi que em alguns casos a acurácia não era muito grande. Sabemos que quanto mais dados de endereço o Google tiver, mais precisas serão as coordenadas. Por isso, é importante ter não somente o CEP mas também o nome da rua, bairro, cidade e estado.
Para conseguir esses dados a partir do CEP, usei uma função criada e postada no grupo R Brasil - Programadores pelo membro José de Jesus Filho. Segue seu código:
Por exemplo, continuando com o CEP do Maracanã, a função postal() retorna:
Como se vê, a função funciona muito bem, então podemos a aplicar para os outros imóveis:
É necessário juntar todas as colunas do data frame de endereços em uma só. Para juntar diferentes strings com um separador em comum (vírgula, por exemplo), é recomendável usar a função str_c() do pacote stringr.
Obter coordenadas a partir do endereço
Finalmente, podemos extrair do Google as coordenadas do endereço do imóvel com a função geocode(). Antes de usar a função, porém, é importante lembrar que a API do Google tem um limite de consultas por dia. Você pode checar seu limite com a função geocodeQueryCheck().
Assim, já podemos obter as coordenadas geográficas dos imóveis:
Uma opção para plotar os imóveis em um mapa seria com o próprio pacote ggmap:
Mesmo o gráfico acima sendo uma ótima visualização, é possível fazer melhor. No próximo post, mostrarei como plotar os pontos em um mapa interativo usando o pacote leaflet.