Como pegar parte do conteúdo (dados) de outro site com PHP

Aprenda, como coletar informações de outros sites na internet.

A primeira coisa a se fazer, é pegar o conteúdo da página inteira que se quer “manipular”. Para tal, usa-se, por exemplo, a função file_get_contents(). Jogando o conteúdo do site numa variável, ficaria assim:

$url = file_get_contents('http://www.bcb.gov.br/');

Pronto, agora a variável $url contém, em string, todo o conteúdo da página inicial do BCB.

Expressões regulares
Até aqui foi fácil; o difícil foi pegar somente o trecho da página que eu queria… Para isso, é preciso usar expressões regulares!

Caso você não saiba o que são expressões regulares, aí vai uma sucinta (e incompleta…) explicação de o que são expressões regulares, da Wikipédia:

Uma expressão regular, na Informática, define um padrão a ser usado para procurar ou substituir palavras ou grupos de palavras. É um meio preciso de se fazer buscas de determinadas porções de texto.

Com as expressões regulares é possível identificar trechos de palavras ou grupos de palavras que correspondem (“match“) a um determinado padrão (“pattern“), que é “regular”.

O PHP tem várias funções nativas para trabalhar com expressões regulares. Basta saber para o que cada uma serve e usar da meneira correta.

Bem, o próximo passo para resolução do problema é identificar o padrão que se quer extrair do site. No caso, eu precisei de uma tabela com algumas taxas cambiais (encontra-se à direita, no site do BCB). Observando o código fonte, vi que as informações estão em uma tabela (abordagem semanticamente correta!); além disso, esta tabela está envolta entre os comentários HTML “<!- – INICIO INDICADORES – ->” e “<!- – FIMINDICADORES – ->”. Isso é uma coisa boa, já que facilita bastante a “identificação do padrão”.

Explicando melhor: o padrão procurado, no caso, é tudo o que está entre os comentários HTML “<!- – INICIO INDICADORES – ->” e “<!- – FIMINDICADORES – ->”. Toda a tabela está aí, para a minha felicidade! 🙂

Então, tudo o que é preciso fazer é utilizar uma função PHP (para o caso, escolhi a preg_match_all()) para procurar uma expressão regular dentro da variável $url, que contém toda a primeira página do site em que está a tabela.

Depois de muito tempo testando várias expressões regulares, cheguei à conclusão que faria uma pequena mutreta. Mas, antes, deixe-me mostrar como está o código até agora.

$url = file_get_contents('http://www.bcb.gov.br/');
preg_match_all('/ORES--&gt;(.+)<!--/s', $url, $conteudo);

Explicando: o primeiro argumento da função, é o padrão que quero procurar; o segundo, é onde vou procurar; o terceiro, guarda em um array todas as ocorrências da expressão procurada. Para a maioria dos casos, talvez já estivesse bom, por aqui; entretanto, no problema que tive, ainda é preciso mais algumas linhas de código.

No momento, a variável $conteudo contém um array com as ocorrências encontradas. Usando um print_r(), descobri em qual posição, exatamente, o que eu procurava estava: $conteudo[0][0].

Fazendo uma “mutreta”
Para fazer a tal “mutreta”, jogo o conteúdo desta posição da matriz para uma outra variável (para facilitar a manipulação).

$url = file_get_contents('http://www.bcb.gov.br/');
preg_match_all('/ORES-->(.+)<!--/s', $url, $conteudo);
$exibir = $conteudo[0][0];

Havia trechos do que me foi retornado (ou seja, da tabela com as taxas cambiais) que eu não queria que aparecessem no site (como alguns links). Então, resolvi retirá-los através da função str_replace(), que substitui trechos de strings. É possível, como argumento, passar um array. Então, por enquanto e quase no fim, o código está assim:

$url = file_get_contents('http://www.bcb.gov.br/');
preg_match_all('/ORES-->(.+)<!--/s', $url, $conteudo);
$exibir = $conteudo[0][0];
$retirar = array('mais moedas','atas Copom','mais detalhes','ORES-->','<!--');
$exibir = str_replace($retirar, '', $exibir);

Ou seja: sempre que aparecer alguns dos itens do array $retirar em $exibir, será substituído por “” (nada…). Perceba que os últimos dois elementos do array são “poluições” desnecessárias, que vieram devido à minha preguiça de fazer uma expressão regular mais elaborada. 🙂

Finalizando…
Depois disso, basta mandar exibir na tela o que “sobrou” do conteúdo retira da página inicial do site do BCB.

$url = file_get_contents('http://www.bcb.gov.br/');
preg_match_all('/ORES-->(.+)<!--/s', $url, $conteudo);
$exibir = $conteudo[0][0]</span>;
$retirar = array('mais moedas','atas Copom','mais detalhes','ORES-->','<!--');
$exibir = str_replace($retirar, '', $exibir);
echo $exibir;

E se o servidor não permite a função file_get_contents() ?
Há muitos servidores que, por motivos diversos (principalmente “segurança”), não permitem que se utilize a função file_get_contents(). Para esses casos, é possível colocar numa variável alguma página externa utilizando o seguinte código (depois você procura as explicações no manual oficial do PHP):

$ch = curl_init();
$timeout = 0;
curl_setopt($ch, CURLOPT_URL, 'O_SITE_QUE_VOCE_QUER');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$conteudo = curl_exec ($ch);
curl_close($ch);

Então, o conteúdo da página “O_SITE_QUE_VOCE_QUER” estará na variável $conteudo.

Conclusão
Então, pessoal, para se retirar uma parte do conteúdo de um web site (utilizando PHP), os passos são:

Saber em qual página está o conteúdo que se precisa;
Jogar o conteúdo do site em uma variável;
Extrair o trecho que se quer utilizando expressões regulares;
Se preciso, cortar mais algumas coisas do resultado da ER;
Exibir em tela o resultado final.

O grande pulo do gato, neste caso, é saber mexer com expressões regulares; coisa que, sinto informar, só se aprende fazendo! E fazendo muito! Leia as referências no fim deste artigo e procure na internet mais material a respeito.

Uma outra coisa importante é o seguinte: tenha sempre em mente que, como você está pegando o conteúdo de um site, caso este altere sua estrutura, muito provavelmente será preciso alterar a expressão regular, também.

Fique ciente de uma coisa: se você, desenvolvedor web, ainda não precisou usar expressões regulares, pode ter certeza de que sua hora vai chegar!

Facebook Twitter Linkedin Digg Delicious Reddit Stumbleupon Tumblr Posterous