DataScraping utilizando PHP - Introdução



Algumas vezes é necessário extrair automaticamente dados que provém de outros web sites e apresentá-los em nossa página. Para isso existem algumas técnicas que são denominadas data scraping, no inglês, ou  traduzindo para nossa linguagem "raspagem de dados". Consiste nada mais do que extrair informações de websites, que são normalmente codificados ou transformados em XML, HTML, JSON, etc.
Neste artigo, iremos desenvolver um código que pegará os títulos e links das postagens deste blog e os apresentará em forma de uma lista.

Antes de mais nada, precisaremos analisar a página de onde virão os dados, principalmente seu código fonte. As ferramentas de desenvolvedor presentes no Firefox e no Chrome ajudam nesta tarefa. Vamos utilizar o "Inspecionar Elemento" do firefox para ver o código do titulo, nas postagens da página inicial.

Podemos notar que todos os títulos do post, bem como seus links, estão dentro da tag h2 que por sua vez possui a classe post-title entry-title. Este será nosso ponto de partida, já que é o elemento comum.

Feita a análise do que queremos pegar, vamos a codificação:

Em primeiro lugar devemos pegar a página inteira, já que é nela que iremos realizar a busca pelo nosso h2 post-title entry-title :

$html = file_get_contents("http://zonafantasma.net");  

A função file_get_contents() irá pegar todo html da página e o colocará na variável $html. Agora precisaremos fazer uma busca em todo código atrás do nosso h2. Uma busca simples em string não é o suficiente, pois precisaremos pegar vários elementos. É ai que a classe DOMXPath do php pode nos ajudar. Esta classe pode implementar uma busca usando a função DOMXPath::query, que nos retornará uma nodeList, com o conteúdo que desejamos. Porém o DOMXPath precisa de um argumento do tipo DOMDocument para sua criação.
Simplificando, vamos criar um novo objeto DOMDocument na variável $doc, que por sua vez irá carregar a nossa página que guardamos em $html através da função DOMDocument::loadHTML. Antes de utilizar o loadHTML, devemos desabilitar os erros de xml, que ocorrem por alguma deformação no código, como estilos colocados dentro das tags, para isso utilizamos a função libxml_use_internal_errors(TRUE);

$doc = new DOMDocument();
libxml_use_internal_errors(TRUE);
$doc->loadHTML($html);
$xpath = new DOMXPath($doc); 

Agora poderemos utilizar a função query para realizar uma busca no documento. Buscaremos pelo nosso h2 utilizando Expressões XPath (você pode ler mais sobre aqui!). Buscaremos um h2 não expecífico (//h2) com o atributo (@) class igual a post-title entry-title , depois dentro do h2 selecionaremos a tag a (/a).

$doc_query = $xpath->query("//h2[@class='post-title entry-title']/a");

A variável $doc_query receberá uma lista de nodes referentes as tags a. Você poderá ver o conteúdo dando um print_r no primeiro item: print_r($doc_query->item(0));
O resultado será semelhante a este:


A nós interessa dois elementos. O primeiro será o nodeValue, que exibirá o texto título da postagem. O segundo será o attributes, que contém uma lista de atributos da tag. É de onde iremos retirar o link para as postagens. Iremos acessá-lo através do método getAttribute().
Criaremos um loop para pegar e escrever os dados na tela, montando uma lista com o título redirecionando para a postagem.

echo "<ul>";
for ($i = 0; $i < $doc_query->length; $i++){
    $titulo = $doc_query->item($i)->nodeValue;
    $link   = $doc_query->item($i)->getAttribute('href');
    echo "<li><a href='$link'>$titulo</a></li>";
}
echo "</ul>";

Feito isso, temos o código pronto. Este é só um exemplo de como podemos fazer uma raspagem de dados.

$html = file_get_contents("http://zonafantasma.net");
$doc = new DOMDocument();
libxml_use_internal_errors(TRUE);
$doc->loadHTML($html);
$xpath = new DOMXPath($doc); 
$doc_query = $xpath->query("//h2[@class='post-title entry-title']/a");
echo "<ul>";
for ($i = 0; $i < $doc_query->length; $i++){
    $titulo = $doc_query->item($i)->nodeValue;
    $link   = $doc_query->item($i)->getAttribute('href');
    echo "<li><a href='$link'>$titulo</a></li>";
}
echo "</ul>";

O código acima estará limitado ao número de postagens apresentados na página inicial, acredito que seja melhor trabalhar com os feeds de conteúdo da página, se esta permitir é claro. Mas foi apenas uma forma de mostrar como podemos trabalhar com dados externos.

Comentários

Postagens mais visitadas deste blog

Xubuntu: título e botões de janela no painel

Personalizando o GRUB no Ubuntu, sem programas