Crawler

Web crawler, em português, rastreador web, é um programa de computador que navega pela World Wide Web de uma forma metódica e automatizada. Outros termos para Web crawlers são indexadores automáticos, bots, web spiders, Web robot, ou Web scutter.

O processo que um Web crawler executa é chamado de Web crawling ou spidering. Muitos sites, em particular os motores de busca, usam crawlers para manter uma base de dados atualizada. Os Web crawlers são principalmente utilizados para criar uma cópia de todas as páginas visitadas para um pós-processamento por um motor de busca que irá indexar as páginas baixadas para prover buscas mais rápidas.

Crawlers também podem ser usados para tarefas de manutenção automatizadas em um Web site, como checar os links ou validar o código HTML. Os crawlers também podem ser usados para obter tipos específicos de informações das páginas da Web, como minerar endereços de email (mais comumente para spam). Um Web crawler é um tipo de robô de Internet ou agente de software.

Em geral, ele começa com uma lista de URLs para visitar (também chamado de seeds). À medida que o crawler visita essas URLs, ele identifica todos os links na página e os adiciona na lista de URLs para visitar. Tais URLs são visitadas recursivamente de acordo com um conjunto de regras.

Esta seção contém uma breve introdução as ferramentas de coleta de dados online através da linguagem python. Tais serviços nos envlverão em uma nova forma de programação chamada programação servidor-cliente. Estamos especificamente ineteressados em programas clientes que farão uso de serviços online. De forma mais esprecífica, estamos interessados em construir scripts (robôres) que busquem bases de dados disponíveis online que nos permitam realizar inferência estatística de forma a identificar relações pouco estudadas com as bases de dados tradicionais disponíveis. Para tal proposito, utilizaremos a linguágem de programação python por ser esta de fácil aprendizado e por possuir uma vasta comunidade online.

Python

Python é uma linguagem de programação de alto nível, interpretada, de script, imperativa, orientada a objetos, funcional, de tipagem dinâmica e forte. Foi lançada por Guido van Rossum em 1991. Atualmente possui um modelo de desenvolvimento comunitário, aberto e gerenciado pela organização sem fins lucrativos Python Software Foundation. Apesar de várias partes da linguagem possuírem padrões e especificações formais, a linguagem como um todo não é formalmente especificada. O padrão de facto é a implementação CPython.

Websites são contruídos a partir de linguágem HTML, o que significa que cada página da web é um documento com uma estrutura específica. Seria ótimo se pudessemos obter dados destas páginas preservando a sua estrutura. A linguágem python oferece uma vasta possibilidade de realizar tal tarefa.

Vamos ilustrar a extração de dados de um website através de um exemplo. Suponha que queremos extrair os dados relevantes a um projeto da plataforma de financiamento coletivo kickstarter.com. O projeto Spark Camera Remote é um exemplo:

Projeto

lxml e Requests

Existem uma gama de possibilidades de se extrair dados de páginas online. LXML é uma das bibliotecas que nos permite extrair informações de códigos HTML. Aqui, utilizaremos o módulo Requests ao invés do módulo padrão urllib2 para ler as páginas de interesse por ser mais rápido e eficiente. Utilizaremos também o módulo Beautifulsoup, para transcrever o código da página em texto.

Comecaremos importando os módulos:

		   
           from lxml import html
           import requests
           from bs4 import BeautifulSoup
           
		   

Usaremos, agora, a função requests.get para carregar a página que contém os dados que desejamos salvar e analisaremos o seu código HTML utilizando o módulo BeautifulSoup, salvando o resultado na variável soup:

		   
           page = requests.get('https://www.kickstarter.com/projects/alpinelabs/spark-camera-remote?ref=home_featured')
           data = page.text
           soup = BeautifulSoup(data)
           
		   

Soup agora contém todo o conteúdo da página em que queremos extrair os dados. Precisamos analisar o código HTML contendo as informações que desejamos salvar. Podemos acessa-lá através do Xpath ou do CSS selector. Utilisaremos a segunda opção. Após uma breve análise, podemos observar os dados dentro de cada elemento do código HTML:

		   
            <h2 class="type-24 type-28-sm type-38-md navy-700 medium mb3"> Spark Camera Remote </h2> 
            <span class="block green-700 js-pledged medium type-16 type-24-md">$218,349</span> 
            <div id="backers_count" class="js-backers_count block medium navy-700" data-backers-count="3992"> 3,992 </div> 
           
		   

Podemos criar, então, criar a função CSS para acessar os dados e salvá-los em variáveis da seguinte maneira:

		   
            nome = soup.find_all('h2', "type-24")[0].text.strip() 
            arrecadado = soup.find_all('span', "block")[0].text.strip() 
            doadores = soup.find_all('div', "js-backers_count")[0].text.strip() 
           
		   

Observe que utilizamos as funções text e strip(). A função text extrai o texto de uma tag html. Já a função strip() corta os espaços e outros caracteres além do texto de interesse. Vejamos o que obtivemos em nossas variáveis:

		   
            print('Nome do projeto: ' + nome) 
            print('Valor arrecadado: ' + arrecadado) 
            print('Número de doadores: ' + doadores) 
           
		   
		   
            Nome do projeto: Spark Camera Remote 
            Valor arrecadado: $218,349 
            Número de doadores: 3,992 
           
		   

Conseguimos obter todas as informações que queríamos do website utilizando Requests e BeautifulSoup. Salvamos as informações como variáveis na memória e a imprimimos na tela utilizando o comando print. Poderíamos ter salvo as informações em uma base de dados, como por exemplo, um arquivo CSV ou em uma base MySql.

Neste exemplo extraimos as informações apenas de um projeto contido na página do Kickstarter.com. Em um caso mais complexo, poderíamos ter construído um script para iterar sobre todos os projetos contidos na página e salvar todas as informações de todos os projetos.

O GAPPE possuí diversos projetos em que utilizamos constantemente a técnica de Web Crawling para obter dados online que são utilizados em vários destes projetos.