desenvolvimento para web

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

Pegar parte do conteúdo de outro site foi a tarefa que tive que fazer. Pensei que seria bem fácil, mas as coisas não saíram exatamente como eu planejava… Felizmente, consegui! Aprenda, você, também, como coletar informações de outros sites na internet.

A missão: pegar parte do conteúdo de um site

Hoje, no trabalho, tive a missão de “puxar” alguns dados de um site para “enxertar” num trecho de um web site que estou ajudando a desenvolver. Quando a tarefa me foi passada, logo lembrei de uma ocasião em que um amigo fez a mesma coisa (e, na época, ele me explicou, mais ou menos, com o fez). Pensei que seria muito fácil realizar a tarefa, mas, na hora, “lembrei” que não sou tão bom quanto o Gevã… rsrs

A solução: funções nativas do PHP e expressões regulares

Passei para pesquisas na web, procurando desesperadamente material de referência sobre expressões regulares (que, como verão, é um dos pilares para se conseguir pegar parte do conteúdo de outro site). Procura daqui, procura de lá, até bate-papo com o Gevã rolou para eu tentar entender melhor as tais expressões regulares. Até que, utilizando um pouco de “gambiarra”, consegui realizar meu objetivo.

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 (vou fazer o exemplo com o mesmo site que tive que mexer):

1
$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.

1
2
$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).

1
2
3
$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:

1
2
3
4
5
$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.

1
2
3
4
5
6
$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):

1
2
3
4
5
6
7
$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:

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!

Referências Nacionais

Expressões Regulares - Guia de Consulta Rápida

Este é o guia de Aurélio Marinho Jargas, excelente para se aprender expressões regulares e para se consultar nos momentos de aperto!

Expressões Regulares no PHP

Artigo do Viva o Linux, de Marcelo Santos Araujo, com uma introdução sobre expressões regulares.

Referências Internacionais

Regular-Expressions.info

Site especialmente dedicado às expressões regulares.

Regular Expression Library

Biblioteca virtual de expressões regulares.

RegExr

Para testar expressões regulares em tempo real!

82 interações em "Como pegar parte do conteúdo (dados) de outro site com PHP"

  1. Gevã Schaefer30/03/2008 

    Excelente, sr.Tárcio! Você pegou um limão e fez uma limonada. O artigo ficou muito bom, parabéns!

  2. Tárcio Zemel31/03/2008 

    Muito obrigado, Seu Gevã!

    50% é crédito seu! =D

    Abraços!

  3. Rafael Eduardo Kassn03/04/2008 

    Vale lembrar que com a utilização de XHTML na estrutura das páginas isso é desnecessário, uma vez que a extração dos dados pode ser feita exatamente da mesma maneira que se extrai os dados de um XML.

  4. Tárcio Zemel04/04/2008 

    @ Rafael Eduardo Kassner

    Oi, Rafael, tudo bem?!

    Muito interessante isso que você falou! Poderia dar um exemplo para podermos aprender?

    Abraços!

  5. Juliano06/05/2008 

    Valeu a mão!

    Quem quiser se aprofundar, vai aí um ótimo link sobre ER: http://guia-er.sourceforge.net/

    Pra mim foi muito útil!

  6. Tárcio Zemel24/06/2008 

    @ Juliano

    Obrigado por relembrar o site do Aurélio. Melhor, mesmo, é comprar o livrinho de referência que ele fez mas, para consultas online, é muito bom!

    Obrigado pela visita!

  7. Felipe Conde30/09/2008 

    Muito bom msm o tuto.

    consegui fazer direitinho!

    agora tem uma coisa, eu n to conseguindo colocar o conteudo salvo na minha página.

    como que eu falo isso?

    eu estou simplesmente colcando o codigo php na minha index.html

    estou errado? qual a maneira certa de fazer isso?!

  8. Tárcio Zemel01/10/2008 

    @ Felipe Conde

    Na verdade, Felipe, não há "conteúdo salvo"; como o script pega o conteúdo de outro site, ele é inserido dinamicamente, então, ele se altera caso o conteúdo do "site alvo" seja alterado.

    Quanto ao local onde será exibido, você mesmo define. Seguindo o exemplo do artigo, caso esteja usando com file_get_contents(), o conteúdo fica na variável $exibir; caso esteja usando curl(), então é em $conteudo.

  9. Gabriel02/10/2008 

    Show de bola o tuto.

    Fui tentar fazer uma adaptação para a cotação agropecuaria (http://www.ruralnetwork.com.br/commodities2_canal_boi.asp), mas da o seguinte erro: failed to open stream: Invalid argument.

    Poderia me da uma ajudinha?

    Segue o codigo:

    $url = file_get_contents ("https://www.ruralnetwork.com.br/commodities2_canal_boi.asp&quot;);

    preg_match_all('/data:(.+)/', $url, $cotacao);

    print_r ($cotacao);

    Vlw´s

  10. Tárcio Zemel02/10/2008 

    @ Gabriel

    Gabriel, provavelmente o fato de ser "https" deve influenciar nisso. Dê uma olhadinha nesta discussão para começar a busca pela informação! ;-)

    Boa sorte e obrigado por comentar!

  11. Rodrigo17/11/2008 

    Olá Tárcio, tudo tranquilo?

    Então, muito bom o exemplo. Agora estou com uma dúvida:

    Tenho um conteúdo que é apresentado da seguinte maneira:

    div

    ContentTemplate>

    class="preformatted"

    pre

    br

    O texto aqui dentro interessa, texto aqui dentro interessa texto aqui dentro interessa texto aqui dentro interessa texto aqui dentro interessa texto aqui dentro interessa texto aqui dentro interessa .

    br

    ESTA LINHA NAO INTERESSA ESTA LINHA NAO INTERESSA

    ESTA LINHA NAO INTERESSA ESTA LINHA NAO INTERESSA

    pre

    div

    É possível pegar apenas o conteúdo entre as tags br ??? Lembrando que tenho outras tags pelo corpo da página.

    Utilizei até o momento o código :

    $url = file_get_contents('http://meusite.com.br&#39;);

    preg_match_all('/ContentTemplate(.+)/s', $url, $conteudo);

    $exibir = $conteudo[0][0];

    $retirar = array('Filtro1, Filtro2, Filtro3');

    $exibir = str_replace($retirar, '', $exibir);

    echo $exibir;

  12. Tárcio Zemel18/11/2008 

    @ Rodrigo

    É possível, sim, Rodrigo. Basta utilizar a mesma "máscara" para pegar tudo que está entre os elementos que você quer. Ficaria algo como:

    preg_match_all('/br(.+)br/s', $url, $conteudo);

    Sendo que este "br" é a tag de quebra de linha – só que não deu pra colocar, se não ele efetivamente quebraria a linha! ;-)

  13. Charles13/01/2009 

    Em vendo seu post primeiro meus parabens..

    Criei seu exemplo e gostei mas fiquei curioso pra saber como o pessoal faz pra pegar vi num site http://blogblogs.com.br o pessoal cadastra nele e colo o link e o site faz uma cópia do conteudo… mas somente do texto ( acho que o pessoal chama de POST ). Como eles conseguem tal façanha..?

  14. Sara21/01/2009 

    Estou a tentar tirar os cinemas do site http://cinema.sapo.pt/em-cartaz/distrito/aveiro/c… e não sei como ei-de ligar a base de dados para fazer a inserção dos conteudos retirados. Será que me poderiam ajudar…urgentemente…………..

    Alguem viu o meu post e sabe qual a solução?

  15. Tárcio Zemel26/01/2009 

    @ Charles

    Seguindo o "foco" deste post, poderia ser, por exemplo, pegar tudo o que está entre as tags de parágrafo ("p") ou eles fazem uma série de IFs para buscar nomes de DIVs que normalmente têm conteúdos.

    @ Gustavo Henrique

    Não sei, Gustavo! Pelo seu comentário parece que havia algo anteriormente, mesmo, mas, sinceramente, também não sei! :-(

    @ Sara

    É seguindo o mesmo princípio que foi mostrado neste artigo: você analise o código-fonte para saber qual trecho quer "retirar" e utiliza as expressões regulares. Abraços!

  16. yuso02/02/2009 

    estou com uma pequena duvida.

    como pegar os outros links da pagina e algumas coisas que voce esta retirando o conteudo ?

    eu tentei usar file_get_contents outra vez so que aparece o primeiro link netão so conseigo pegar o conteudo do primeiro link será que é possivel fazer isso o que eu estou dizendo ? obrigado

  17. Lucas Moreira de Sou03/05/2009 

    Cara, parabéns pelo ÓTIMO conteúdo disponível neste tutorial!

    O primeiro teste que vou fazer para buscar conteúdo é aqui no seu site. Rsrs

    Pode ficar tranquilo que seu nome estará lá.

    Parabéns!!

  18. Tárcio Zemel04/05/2009 

    @ yuso

    Não entendi muito bem… Poderia explicar melhor?

    @ Lucas Moreira de Souza

    Opa! Que bom que gostou, Lucas! Tomara que seus testes deem certo! Entrei no seu site e gostei bastante! Design muito bom!

    Abraços!

  19. viConcursos10/08/2009 

    Cara, parabéns pelo ÓTIMO conteúdo disponível neste tutorial!

    vlw mesmo..

  20. Danilo Oliveira24/09/2009 

    Tentei fazer a mesma coisa que voce fez, mas usando javascript.. A ideia era colocar o tal site nu iframe e pegar as infos de la… Mas por umas questoes de seguranca, o js nao consegue pegar!

    Dai tentei fazer em php, num script bastante semelhante ao seu.. Mas me deparei com um pequeno problema. No meu caso, a informacao que quero extrair eh de um site de jogo… que preciso logar para pegar a tal informacao. No js nao teria problema, pois ao logar 1x, quando abro novamente a pagina ele ja ta logado… mas usando php nao!

    Pergunta:

    Tem como eu passar meu login e senha via php para o site q eu quero extrair os dados?

    Vlws

    Abracos

    E parabens pelo trabalho! pesquisei muito na net para tentar resolver esse problema! e de todas dicas/tutoriais/informacoes que achei, definitivamente, o seu site foi o MAIS completo! organizado e didatico! Parabens mesmo!

  21. Tárcio Zemel25/09/2009 

    @ Danilo Oliveira

    Obrigado pela força, Danilo! Que bom que você achou o artigo útil!

    Para o seu problema realmente fica complicado, já que você tem que logar para pegar a informação. Você logar e depois pegar a informação funciona, mas imagina os visitantes que não teriam como fazer isso… De repente você encontra essas informações em outro site que não seja protegido por senha.

    Abraços!

  22. Eusebio19/10/2009 

    Caro Tarcio

    Meus parabens pelo script… bem bolado e funcionou direitinho.

    So tenho uma duvida que creio ser facil para o senhor me auxiliar

    Capturei alguns dados que precisava de um site, onde usei:

    $url = file_get_contents('http://www.xxx.com.br/Telas.asp?Num=&#39; . $numero . '&acao=e');

    Sendo que fiz um while para gerar varios $numero..

    Deu certo pois a pagina a ser capturada tinha um FORM GET…

    Mas agora me deparei com um site que usa um FORM POST

    Como deverei usar o $url??

    $url = file_get_contents('http://www.yyy.com.br/Telas.asp?&#39;);

    Minha duvida é:Onde insiro o campo , pois nao da certo usar o $url com o numero direto no link.

    Sera que me fiz entender?? Seria possivel me auxiliar??

    Desde ja agradeço

    Eusebio

  23. Tárcio Zemel21/10/2009 

    @ Eusebio

    Dê uma olhadinha na função "file_post_contents".

    Eu nunca a experimentei, mas acho que foi isso que você perguntou, não é? :-)

  24. Deivid13/12/2009 

    E no caso pra pegar links ???

    exemplo: pegar links da pagina B.

    existe alguma funcao especifica ou tem que adaptar esta ai ?

  25. Deivid13/12/2009 

    pra ser mais especifico…

    tem a pagina A e a B.

    quando entrar na pagina A, ela vai ler os links que tem na B, e salvar nos dados da A.

    e possivel ?

  26. Tárcio Zemel15/12/2009 

    @ Deivid

    Seria usando o que está explicado, mesmo, Deivid. Utilize preg_match_all() para pegar os links e faça o que for necessário depois.

  27. Aramis18/01/2010 

    Olá pessoal,

    tenho um problema e acho que vcs podem me ajudar ….

    Bom, gostaria de "imprimir ou passar" o conteúdo dentro de um DIV de uma página para outra página.

    Exemplo:

    Pagina1.html

    Texto em html

    Gostaria de fazer um botão de impressão onde abre uma outra página (Página2.html) com o conteudo da DIV "divNoticiaConteudo", onde irei colocar mais alguns dados de cabeçalho.

  28. Tárcio Zemel22/01/2010 

    @ Aramis

    Se precisar somente server-side, aqui está a base para fazer, mas você precisará aprofundar nas expressões regulares. Se não for estritamente necessário, então você vai conseguir isso usando o método load() do jQuery.

  29. Jorge17/02/2010 

    preciso fazer um esquema praticamente igual a esse porem tem algumas coisas a mais, pode me passar seu msn para nós conversar

  30. Bruno Tacca10/05/2010 

    Muuuuuuuuuito show cara… era o que eu precisava…

    Valew mesmo! Muito dificil achar algo pela net com uma explicação boa assim, show… valew pela linha de código! =D

    Abrs.

  31. adriano sousa24/05/2010 

    Olá! parabéns pelo site. Minha dúvida e necessidade é a seguinte: Eu tenho duas intranet trabalhando no mesmo servidor com bancos distintos. Será que eu conseguiria pegar todas matérias de uma categoria de uma intra para outra? tipo sem usar o WordPressMU, duas instalações do wordpress no mesmo servidor, sendo que as matérias de uma categoria iriam aparecer na outra intra. As duas intras possuem categorias em comum e isso seria para não ter que publicar duas vezes a mesma matéria uma em cada intra.

    Agradeço desde já a atenção de todos

  32. Tárcio Zemel27/05/2010 

    @ Jorge

    Pergunta por aqui, mesmo, Jorge, vai que seu caso também vai ajudar outras pessoas!

    @ Bruno Tacca

    Muito obrigado! Espero que aproveite outros conteúdos do blog e volte sempre!

    @ adriano sousa

    Adriano, já que está tudo no mesmo servidor e é você quem emxe, não vejo motivos para usar file_get_contents() ou curl(). Simplesmente faça conexões ao banco que você quer e faça as queries. ;-)

  33. Marco03/06/2010 

    Pessoal, desculpe minha falta de conhecimento… Sou intermediário em PHP, mas acho que o que eu preciso não é possível via PHP.

    Tem uma homepage onde preciso preencher um campo e dar enter. Ela abrirá outra página com a resposta. Por exemplo, acesso a página onde coloco um IP e dou enter, abre-se uma nova página com a cidade da conexão desse IP.

    Pergunta, por onde começo? Qual a linguagem de programação mais fácil para fazer isso? Preciso instalar algo específico no meu micro ou basta rodar o código no meu servidor?

    Um abraço,
    Marco

  34. Tárcio Zemel08/06/2010 

    @ Marco

    Comece estudando web services.

  35. João11/07/2010 

    Nossa cara que legal esse post, faz um tempo que estava pensando como fazer isso e tal, resolvi procurar hoje, pesquisei e cai aqui!

    Eu tentei fazer e até deu certo, mas eu sou fraco d+ em PHP, me enrrolo com 'barras' '?' e coisas assim rs…

    Por favor me de uma ajuda, eu tentei pegar o endereço do site, dentro do 'href', tentei modificar o seu, ele funcionou +/-… coloquei tipo assim:

    preg_match_all('/a href="http://(.+)">/s', $url, $conteudo);

    Antes da primeira URL ele corta tudo, ai beleza, mas dps vem tudo sujo.

    Só quero pegar o que esta dentro dos 'href' entende

    Obrigado desde já

  36. Tárcio Zemel12/07/2010 

    @ João

    Dê mais uma analisada no artigo e complemente o estudo estudando expressões regulares que, com certeza, consegue! ;-)

  37. João12/07/2010 

    Vlw cara, imaginei que a resposta seria assim, rs… mas não tem problema, manjo muito de ASP, só preciso aprender a traduzir a linguagem, 'barras', 'simbolos', etc

    T+

  38. Hideki25/07/2010 

    Olá amigo,

    eu trabalho com php a algum tempo, porem to precisando pega uma informação de um site, vi seu post e axei bem legal, porem não entendi essa expressão regular muito bem, dei uma procurada na net mais não axei muita coisa q ajude.

    queria saber se vc tem alguma apostila ou um site q vc possa indicar ?

    Parabens pelo post…..

    agradeço desde já

  39. Tárcio Zemel26/07/2010 

    @ Hideki

    Existem muitas fontes para estudo de expressões regulares. Indico, para começar, Expressões Regulares – Guia de Consulta Rápida. Faça muitos testes e depois aprofunde o conhecimento. Bons estudos!

  40. Fernando Fernandes04/08/2010 

    Tárcio muito bom o post.

    Porem estou com algumas dificuldades, nenhuma das formas apresentadas funcionaram :S Sera que tenho que habilitar alguma função no php do meu servidor, e como eu faria isso , Obrigado!

    Fernando Fernandes!

  41. fernando09/09/2010 

    Muito bom

  42. Roberto10/09/2010 

    Olá Tárcio,

    Estou fazendo exatamente o que você fez, pegar a cotação do site do Banco Central, conseguir fazer tudo certinho, más o que eu estou precisando mesmo é pegar apenas o valor de venda do dólar e do euro, tem como pegar só esses valores?

    Grato

  43. Tárcio Zemel17/09/2010 

    @ Fernando Fernandes

    Realmente alguns servers desabilitam o file_get_contents(). Neste caso, é preciso usar o curl (dê uma olhadinha no tópico "E se o servidor não permite a função file_get_contents() ?").

    @ fernando

    Obrigado. Apareça!

    @ Roberto

    Não exatamente como está a estrutura do site do Banco Central, mas, basicamente, você deve "filtrar" corretamente a informação desejada. Uma dica é usar o Firebug para inspecionar o que você quer, aí você descobre em que ponto do DOM se encontra e fica mais fácil.

  44. Paulo27/09/2010 

    Estou capturando varios dados e de sites diferentes.

    Desejo exibir todas as capturas na mesma pagina, porém da maneira que fiz levou um tempão para abrir a pagina com os resultados, pois ele busca os dados em cada pagina de cada site e so exibi depois de encontrados todos.

    Como faz quando se quer capturar dados de mais de um site no mesmo script?

  45. Tárcio Zemel05/10/2010 

    @ Paulo

    Parece que você está fazendo certinho, mesmo. Essa demora é normal, já que o script tem que ler em várias fontes ao mesmo tempo.

  46. Vinicius17/10/2010 

    cara show de bola parabéns!!! eu tava fazendo a maior regex do mundo para pegar um tabela no meio de codigo do site de rastreamento dos correios.. Sei que quanto mais simples melhor as regex mas nao sei pq as minhas sao sempre grandes rsrssrs.. é… nao tem jeito vou ter que tirar 1 semana e só estudar!!!. Parabéns pelo ótimo post.. consegui fazer o que queria com poucas linhas…

  47. Tárcio Zemel24/10/2010 

    Com o tempo as expressões vão ficando melhores e mais curtas (quando é possível). Tirando essa semana de estudos, você vai ver que vai melhorar bastante!

    Parabéns pela iniciativa!

  48. Lucas23/11/2010 

    Essa informação: "E se o servidor não permite a função file_get_contents()"

    Salvou!….. Obrigado e ótimo post!

  49. Tárcio Zemel23/11/2010 

    Pois é, Lucas, muitos servidores desabilitam a função por questões de segurança, mas o CURL salva o dia! :-)

  50. Paulo29/11/2010 

    Você não faz ideia de quanto esse post foi util! Muito Obrigado!

  51. Tárcio Zemel03/12/2010 

    Não por isso, Paulo! Que bom que as informações foram úteis!

  52. Emprrego Justo24/12/2010 

    Brutal esta dica.

  53. junior28/12/2010 

    Como pegar apenas os valores do dolar desta página http://www.debit.com.br/resumogratuito.php?info=n… em um array?

  54. wilson05/02/2011 

    Salvou mais um do inferno total

  55. @reis_alvaro13/02/2011 

    Tárcio, esse post era o que eu estava procurando. muito bom, valeu!

  56. Tárcio Zemel15/02/2011 

    haha, que bom que foi útil pra você! Apareça!

  57. Tárcio Zemel15/02/2011 

    Obrigado! Qualquer sugestão, basta dizer!

  58. bruno06/03/2011 

    Tarcio,

    como faço para pegar somente as imagens( . jpg ) do post (ex: compartilhar links do facebook que vem com imagens) estou querendo partir para um projeto mais nao quero começar sem essa função pois seria basicamente em cima dela que iria trabalhar.

    att,
    Bruno

  59. Tárcio Zemel25/03/2011 

    Depende de como você faz o HTML de suas imagens (com barra, sem barra, etc), mas, basicamente, na expressão regular você só tem que envolver o que você quer pegar (a tag de imagem) com os "curingas".

  60. Rafael Barroso27/03/2011 

    Olá Tárcio, parabéns pelo post!

    Tenho uma dúvida.
    Como faço para puxar uma div e seu conteúdo de um site e inserir em outro?
    Tipo, gostaria de puxar o módulo "VEJA SUA MARCA AQUI" do site: http://www.vocefamoso.com.br para ser usado em outros site, para quando o módulo for alterado, ser alterado também nos outros site.

    Quero pegar apenas a parte VEJA SUA MARCA AQUI e inserir em outros sites, porém quando eu mudar essa parte, automaticamente em todos os sites em que eu adicionei o código, também será mudado.

    Preciso muito disso, já pesquisei em tudo e não acho nada!

  61. Neemias23/04/2011 

    Brother, eu precisaria fazer algo semelhante, porém, tenho que enviar o internauta de um site institucional para uma loja virtual, de forma que ele acesse o site apenas completando a url em um formulário. tipo: o cara esta no http://www.meusite.com.br e quero que ele vá para o meusite.com.br/loja, porem, ele precisa ir para uma área onde esta o id de um distribuidor. Entao, ele nao precisaria digitar o dominio inteiro, apenas digitar o ID do distribuidor em um campo e clicar em "ir". Tem alguma ideia de como faço isso? Sou bem iniciante em PHP.

  62. Fernanado03/05/2011 

    Parabens pelo artigo, vou testar hoje a noite

  63. Tárcio Zemel08/05/2011 

    Não tem erro! ;-)

  64. Sex Shop14/05/2011 

    Eu amo internet, uma hora umproblema outra hora a solução. Obrigado vc quebrou um galhão.

  65. Tárcio Zemel18/05/2011 

    Assim é a vida. ;-)

    []s

  66. Alex16/06/2011 

    olá pessoal sou novo aqui estou com uma duvida como que fasso para colocar as array dentro de uma tabela aqui esta o código está funcionando

    <?php
    /**
    * Nova instância de DOMDocument
    */
    $DOMDocument = new DOMDocument( '1.0', 'utf-8' );
    /**
    * URL Do site que você deseja extrair o conteudo
    */
    $WebSite = 'http://www.futsalparana.com.br/index.php?option=com_joomsport&view=ltable&sid=13&gr_id=0&Itemid=91';
    /**
    * Não preservar espaços em branco redundantes
    */
    $DOMDocument->preserveWhiteSpace = false;
    /**
    * Carrega o conteudo do site
    */
    @$DOMDocument->loadHTML( file_get_contents( $WebSite ) );
    /**
    * Nova instância do DOMXPath
    */
    $DOMXPath = new DOMXPath( $DOMDocument );
    /**
    * Procura no Documento, um elemento 'table' que o id é igual a .. então avança pra seu filho 'tbody'
    * depois avança para o filho de 'tbody', que é o 'tr' que o atributo 'class' contenha uma substring de 'etblraw'
    * então avança para 'td', que recupera todos os valores de cada 'td' que não seje a primeira coluna na tabela
    * porque é a sequencia deles, creio que não seje útil pra você
    */
    foreach( $DOMXPath->query( './/table[@id="s_table_0"]/tbody/tr[@class=contains( @class, "etblraw" )]/td[ preceding-sibling::* ]' ) as $Nodes ){
    /**
    * Procura por todos os filhos de TD, que pode ser hrefs, ou textos .. etc
    */
    foreach( $Nodes->childNodes as $Node ){
    /**
    * Monta um array com os valores encontrados, removendo os espaços em brancos adicionais
    */
    $Data[] = utf8_decode( preg_replace( '/s/', null, $Node->nodeValue ) );
    }
    }
    echo '<pre>';
    /**
    * Filtra todo o array, removendo índices vazios
    */
    print_r( array_filter( $Data ) );
    ?>

    preciso colocar dentro de uma tabela conforme o site http://www.futsalparana.com.br/index.php?option=c…

    desde já agradeço

  67. Tárcio Zemel17/06/2011 

    Você está usando uma técnica ligeiramente diferente da apresentada neste artigo. Provavelmente a abordaremos em breve, também.

    Abraços!

  68. Elvis30/06/2011 

    Tenho quase o mesmo problema que o Danilo Oliveira…

    o site me fornece uma página com um form e um campo único de pesquisa… eu gostaria de fazer uma pesquisa (pelo meu nome) e após a pesquisa pegar algumas das informações que aparecer sobre meu perfil…

    Pude constatar que o form envia os dados para a propria página… e que após a mesma ter um $_Post ele atualiza a página com as informações do personagem…

    Teria como eu injetar esse Post para conseguir pesquisar na página já com o $_Post['name'] == true ?

    …Quanto ao seu tutorial, está ótimo!…
    Pena que só testei com o meu caso rs

  69. Rafael02/07/2011 

    Tenho uma dúvida, o conteúdo fica dentro do head, isso atrapalha? e outra coisa onde eu coloco pra buscar?
    É que eu não manjo muito php

  70. diogo11/07/2011 

    A sua explicação foi fantástica. Só tenho a agradecer.

  71. bruno19/07/2011 

    muito bom, gostei muito mas estou com um problema gostaria de uma ajuda caso alguem saiba o que fazer eu preciso pegar um conteudo de um site seque ele

    <div id="informacao" >
    <h2 class="topicos_anun">Informações</h2>
    <span class="content_informacao">Distribuidor de Cereais ( Granolas, Ração Humana , Linhaça Entre Outros)
    Venda e Distribuição de Produtos Naturais&nbsp;Embalados em Pacotes de 35, 200 e 800g Ou&nbsp;a Granel&nbsp;
    </span>
    </div>
    so que de varias pagina com o mesmo padrao, montei uma expressao regular para pegar a tag <div id="informacao" > e outa para</div> testei elas isoladas deu certo coloquei entre as expressoes .* para pegar tudo que vem entre as expressoes mas parece que ele nao pega a quebra de linha tem alguma como prosseguie para pegar o que esta entre elas

    obrigado e gostei muito do exemplo muito bom mesmo me ajudou muito

  72. Tárcio Zemel02/08/2011 

    Dê uma revisada no tutorial que vai conseguir aplicar ao seu caso específico.

    Abraços!

  73. Robson05/08/2011 

    Brutal esta dica. &sup2;

  74. lindomar17/08/2011 

    olá galera, tudo bom ?
    e o seguinte, estou na missão de construir um site para uma escola
    e neste site a diretora que que eu coloque um link de uma biblioteca virtual do uol
    e ja percebir que estE SITE TEM A DIV central onde tem dodas as funcões da biblioteca
    sem as propaganda qual o procedimento para reproduzir somente esta <DIV

  75. weslei silva20/10/2011 

    Olá amigo. Tem um site que mostra os resultados do campeonato brasileiro em tempo real. O link é este http://www.baixebr.org/softwares/utilitarios/ipho…

    Antes de tudo sou um pouco leigo no assunto, mas prometo que me esforçarei…
    Como eu posso colocar esta script em meu blog?

  76. Tárcio Zemel24/10/2011 

    Fazendo o que consta no tutorial! :-)

  77. Gabriel Veloso(Insectopos)04/11/2011 

    Estou trabalhando em um projeto que a resposta do formulário vai ser o endereço do site, ou seja não tem como colocar o endereço do site direto no código, tenho que usar uma variável(segue abaixo uma parte do código):

    $n1=$_POST["n1"];

    $url = file_get_contents(“$site”);

    echo $url;

    Porem pelo que parece não é permitido o uso de variável no lugar do endereço. Tem algum jeito de permitir o uso de variável? Se não tem, qual o outro método que posso usar para mostrar parte do conteúdo do site do qual o endereço foi digitado no formulário?

  78. Tárcio Zemel07/11/2011 

    Dê uma olhada na página sobre o $_SERVER.

  79. Josimar27/12/2011 

    Tenho um site que precisa de login via POST e assim eu precisaria passar pelo login pra pegar os dados da tela seguinte. É possível isso?

  80. Tárcio Zemel27/12/2011 

    Não entendi muito bem. De qualquer forma, o processo e técnicas para login é um assunto diferente do que estamos tratando. Dê uma lida melhor, no artigo, e você vai ver. :-)

    Abraços!

  81. Rodrigo04/01/2012 

    Possuo um site de filmes e preciso pegar algumas informações do site. interfilmes.com
    Como sinopse, titulos entre outras informações.
    Estou utlizando o wamp e com o primeiro comando que você passou deu o erro “Warning: file_get_contents(http://www.uol.com.br/) [function.file-get-contents]: failed to open stream: Uma tentativa de conexão falhou porque o componente conectado não respondeu corretamente após um período de tempo ou a conexão estabelecida falhou porque o host conectado não respondeu. in C:\wamp\www\box\index.php on line 4″

    o segundo comando da esse erro.
    “Fatal error: Call to undefined function curl_init() in C:\wamp\www\box\index.php on line 4″

    se poder me ajudar

Comente!

Se eu quiser ser contratado para fazer algo, eu já deveria estar fazendo isso.

Trent Walton
Quer ganhar 1 ano grátis da Conta Negócios Basekit, uma das melhores ferramentas de criar sites do mundo? Saiba como!