Web scraping – Criando um crawler mínimo para imagens da NASA

Pra quem não sabe o que é web-scraping: É a atividade de extrair dados de um site via script programado para interagir com a interface destinada a usuários humanos.

Quando um site quer expor um conteúdo para robôs, ele não precisa considerar aspectos estéticos ou comportamentais de pessoas na construção dessa interface e por isso ela é chamada de Interface de Programação de Aplicativos (API em inglês).

Um scraper ou spider é um robô que caminha na internet pelas ruas que foram feitas para os *humanos* caminharem, ele anda pelas interfaces de usuários dos websites com o objetivo de obter dados expostos e estruturados para usuários humanos.

Um scraper clica em links, preenche e envia formulários, espera, etc; tudo como uma pessoa usando o site faria.

Se existe um caminho para robôs por que ir pela via dos usuários?

O site pode não fornecer uma API ou fornecê-la de maneira limitada. Por exemplo: usando a API do twitter você pode obter os últimos 3200 tweets de uma conta. Esse é o limite da rua que o Twitter construíu para os robôs passarem, se você quiser qualquer tweet a mais, terá de obtê-lo manualmente… OU usando um robô que se comporte como um humano e busque os tweets por você.

O MÍNIMO que um spider faz é enviar um request para uma URL e filtrar a response em busca de algo.

Imagine que você gosta muito de astronomia e diariamente visita o site da NASA Astronomic Picture of the Day e salva em seu disco a foto do dia.

Vamos automatizar esse processo.

Algo como:

#!/bin/bash
#captura o html da página
wget -qO- apod.nasa.gov |
#filtra pra ficar só <IMG SRC="image/xxxx/nnnnnnn...jpg"
grep IMG |
#remove o que não está entre aspas
cut -d '"' -f2 |
#captura a string resultante, e insere antes a raiz do link relativo
awk '{print "http://apod.nasa.gov/apod/" $0}' |
#baixa pro ~/Pictures
xargs wget --directory-prefix=/home/$USER/Pictures

Já cumpre essa tarefa, ele acessa o side da NASA, filtra o HTML em busca da imagem que deseja, e monta uma URL própria para obtê-la e salvar  na pasta /home/$USER/Pictures

Basta adicionar um job no cron para repetir esse script diariamente e pronto, você nunca mais* precisará buscar essa imagem, ela irá aparecer na sua pasta de imagens automaticamente.

Esse é um exemplo de spider rudimentar que pode ser feito. Ele não abre um navegador, não interpreta o HTML, só filtra o código fonte e não interage além do acessar e fazer download da imagem do dia. Ele funciona pois o site é simples e o acesso a ele é livre. Não pede login, não se preocupa com sessão, não usa javascript para posicionar os elementos ou renderizar o conteúdo. Cumpre uma sequência trivial: acessar o site e obter a única imagem da página.

Um roteiro mais exigente tornaria o desenvolvimento de um spider mais trabalhoso usando somente ferramentas do GNU/Linux.

Imagine fazer login enviando os dados via POST mantendo a sessão entre os requests, parsear a resposta usando regex para então obter o que se busca… Isso seria uma tarefa árdua e de difícil manutenção, por isso foram criadas bibliotecas em diversas linguagens de programação para interagir com sites de forma mais organizada e específica para esse contexto. Vamos explorar essas bibliotecas na próxima parte dessa série sobre scraping.

* Enquanto o site mantiver essa estrutura, ou similar (que não quebre o filtro)

Anúncios

Git e auto-crítica

Hoje vou finalmente aprender a usar um sistema de controle de versões. Nos últimos dias me vi enviando atualizações de código por email e tendo que sincronizar o desenvolvimento usando isso. É ridículo né? Eu já planejava aprender o Git a um tempão, mas a falta de um computador próprio tem me obrigado a preparar o ambiente de programação sobre o ambiente de uso doméstico alheio, isso é bem ruim, mas tem sido pior gastar um tempão checando se está tudo sincronizado entre os vários computadores que eu tenho usado para programar (Os de casa e os dos laboratórios do IC).

Eu sempre soube da importância de se aprender a usar um Sistema de Controle de Versões, mas de fato nunca havia precisado tanto antes. Vou aproveitar que tenho de aprender agora e publicar como foi essa experiência aqui.

Escolhi aprender o Git.

Criei uma conta no GitHub, que é “um Serviço de Web Hosting Compartilhado para projetos que usam o controle de versionamento Git.” segundo a Wikipedia Brasil. Acho que é isso aí que quero mesmo.

Como eu disse, uso ambiente doméstico alheio para programar, por isso nada de Linux..

E daí? E daí que sou tenho que usar Windows (que não é o meu sistema preferido quando quero programar) e não posso sair instalando tudo o que quiser pois isso não se faz. Mas vamos lá, não posso evitar de instalar o Git.

Então, deixa eu seguir as instruções daqui: http://help.github.com/win-set-up-git/

*If you don’t already know what Git is, take a crash course.

Ok eu sei o que é, seguindo..

Git baixado e instalado, próximo passo:  Set Up SSH Keys

Ok, feito, hora de criar um novo repo. Jriarei um repositório privado pra um projeto aí.

O QUE?? SÓ PAGANDO? Sim, 7 dólares por mês. Se quiser. 😦 Então vou criar um repositório free (e conseqüentemente, público), pelo menos até eu poder resolver esse problema.

—-

Aprendendo a usar o git, já fiz um tanto de bagunça, quando tentei remover os “untracked files” da lista de commit do git, acabei removendo eles do diretório em que estava trabalhando, ainda bem que tenho backups… Tem que tomar cuidado com o “git clean –d –f”  hehe.

Pra quaisquer dúvidas existe o http://progit.org/book e as mans pages do – – help

Se não entende nada, veja isso aqui, que já me ajudou muito.

Eu demorei muuito pra começar isso e vejam só, nem é um bixo de sete cabeças e agora basta que eu tenha o Git instalado nos ambientes que uso pra ficar tranquilo quanto ao controle das versões. Próximo passo: Aprender a usar o MVC proposto pelo Sencha, depois falo mais sobre isso. Eu já sei que vai ser algo muito compensatório, basta agora que eu já “mate” esse leão antes que eu o precise fazer para depois “matar” um dragão.

Links interessantes e Aplicações de Grafos

Isso aqui vale ouro, se tem alguém lendo isso aqui que não for eu.

Tutoriais do thenewboston:

http://thenewboston.org/tutorials.php

Um segredo pra derrubar ‘qualquer’ site:

http://www.behind-the-enemy-lines.com/2012/04/google-attack-how-i-self-attacked.html

Eu estava lendo o Hacker News e como é de lei, sempre tem algo muito dez, o que eu aprendi hoje foi…

Grafos aplicados como regras para descobrir divisibilidades.

No caso, a divisibilidade por 7, no link que segue aqui, você pode ler o artigo. Mas se você tem preguiça eu resumo:

É assim: dado um número n (por exemplo, n = 128), quero saber se ele é divisível por 7. Então, começando no nó branco lá embaixo, para cada dígito d de n, devo seguir as setas escuras d vezes e então seguir 1 seta branca para cada próximo dígito e repetir o processo, até não ter próximo dígito (aí não deve-se andar uma seta branca). E se zero, não mova.

Caso, no final esteja no nó branco, o número é múltiplo de 7!

Faça o teste aí com n = 128. Agora calcule com n = 133.  🙂

A publicação ficou bem famosa no site e depois o rapaz publicou uma versão melhorada da imagem, que ainda informa o resto (seja onde for que você pare no final de tudo, nesse nó está informado o resto) e deixa a compreensão de como o grafo funciona bem mais clara. Vejam:

Computacionalmente falando, imagino que seja muito mais barato para o computador, se o programador estruturar um grafo dessa forma, quando precisasse conferir a divisibilidade por 7 de um número bem grandão, ao invés de tentar a divisão. Ou talvez não, não tenho certeza.

Seria bem legal, escrever uma aplicação que mostrasse como se checa a divisibilidade por 7 de um número n usando esse método. De qualquer forma esta aí a idéia pra quem quiser.