"Pegar" conteúdo de página externa com Javascript
Bom, é sabido a facilidade executar essa ação com linguagens como ASP, PHP, etc.
Mas esse método nem sempre é o que seria ideal, pois se você precisa executar esse comando de pegar conteúdos de outras páginas, corrigi-los e exibir, você provavelmente excederá o limite de banda do servidor, pois a cada requisição de file_get_contents, ou curl, o servidor baixa o conteúdo pra manipula-lo internamente, sem o usuário perceber, e toda vez que você baixa algo utiliza banda, bom se você usa Speedy como eu deve estar desfamiliarizado com esse termo, pois já há algum tempo que o Speedy deixou a banda ilimitada, isso é, pode baixar o quanto quiser, mas em hosts de sites esse limite ainda existe e acredite, fazendo isso que acabei de falar você o atingirá mais rápido do que imagina.
Bom, mas e a solução então?
O certo é você delegar a função de baixar os conteúdos e interpreta-los pelo computador do cliente(usuário), assim o seu servidor não terá trabalho, nem sobrecarregará.
Com essa ideia em mente comecei a usar meus conhecimentos pra tentar conseguir dados de um link, tentei carregar num iframe e depois com javascript pegar o conteúdo do iframe e modificar(isso é possível, mas o link do iframe tem que estar no mesmo domínio), não tive sucesso, aí tentei o famigerado xmlhttprequest que nunca me faltou, mas também falhou, creio que por não estar no mesmo domínio também, ou então o link que eu tentava acessar era protegido pelo crossdomain, enfim, não sei... Só sei que não consegui colocando diretamente o link no xmlhttprequest.
Se você usa banco de dados SQL, estará um pouco mais familiarizado, caso não esteja, não se preocupe pois o que vamos usar aqui é o básico do básico e talvez você poderá usar meu exemplo mudando o link apenas...
O site que você entra pra digitar os comandos, testar e pegar o link testado e aprovado, rs... ^^ http://developer.yahoo.com/yql/console/
O link que gerei pra pegar o conteúdo do Google:
http://query.yahooapis.com/v1/public/yql?q=select%20content%20from%20data.headers%20where%20url%3D%22http%3A%2F%2Fwww.google.com%22&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys
Essa parte que destaquei em vermelho é porque não descobri como faz pra aparecer isso no link de saída pelo link do console que acabei de passar e sem isso a parada não funciona...
Veja se não te serve mudando apenas o link, pra facilitar, ou então estude na internet ou nas documentações da API pra aprender como fazer certo as pesquisas, repetindo, descobri como fazer isso pelo stackoverflow, pois pelo console não tinha conseguido, aí no stack descobri esse tal de content from data.headers e esse final env=store alguma coisa...
Depois de ter esse link basta você utilizar o xmlhttprequest mesmo.
Exemplo:
link='http://query.yahooapis.com/v1/public/yql?q=select%20content%20from%20data.headers%20where%20url%3D%22http%3A%2F%2Fwww.google.com%22&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys';
if (window.XMLHttpRequest){
xmlhttp=new XMLHttpRequest();
}else{
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("GET",link,true);
xmlhttp.onreadystatechange = function(){
if(xmlhttp.readyState==4 && xmlhttp.status==200){
xmlDoc=xmlhttp.responseText;
//aqui vem os comandos depois de ter o arquivo carregado na variável anterior//
}
xmlhttp.send();
O link é aquele que acabei de passar, ou o que vocês geraram, é só alterar a variável link pela sua, depois inserir os comandos onde foi indicado.
Espero ter ajudado!
Mas esse método nem sempre é o que seria ideal, pois se você precisa executar esse comando de pegar conteúdos de outras páginas, corrigi-los e exibir, você provavelmente excederá o limite de banda do servidor, pois a cada requisição de file_get_contents, ou curl, o servidor baixa o conteúdo pra manipula-lo internamente, sem o usuário perceber, e toda vez que você baixa algo utiliza banda, bom se você usa Speedy como eu deve estar desfamiliarizado com esse termo, pois já há algum tempo que o Speedy deixou a banda ilimitada, isso é, pode baixar o quanto quiser, mas em hosts de sites esse limite ainda existe e acredite, fazendo isso que acabei de falar você o atingirá mais rápido do que imagina.
Bom, mas e a solução então?
O certo é você delegar a função de baixar os conteúdos e interpreta-los pelo computador do cliente(usuário), assim o seu servidor não terá trabalho, nem sobrecarregará.
Com essa ideia em mente comecei a usar meus conhecimentos pra tentar conseguir dados de um link, tentei carregar num iframe e depois com javascript pegar o conteúdo do iframe e modificar(isso é possível, mas o link do iframe tem que estar no mesmo domínio), não tive sucesso, aí tentei o famigerado xmlhttprequest que nunca me faltou, mas também falhou, creio que por não estar no mesmo domínio também, ou então o link que eu tentava acessar era protegido pelo crossdomain, enfim, não sei... Só sei que não consegui colocando diretamente o link no xmlhttprequest.
Solução
Foi aí que eu acessando o StackOverflow(que quebra muitos galhos meus), descobri um tal de YQL, que é um API desenvolvido pelo Yahoo(que por mais que esteja esquecido já foi muito bom em fazer as coisas) que salva a lavoura. Não me perguntem como ele faz pra conseguir os dados, se eles sobrecarregam seus servidores ou se eles usam seus motores de busca, enfim, isso não vem ao caso, o fato é que consegui pegar os dados do link que eu desejava com um comando YQL.Se você usa banco de dados SQL, estará um pouco mais familiarizado, caso não esteja, não se preocupe pois o que vamos usar aqui é o básico do básico e talvez você poderá usar meu exemplo mudando o link apenas...
O site que você entra pra digitar os comandos, testar e pegar o link testado e aprovado, rs... ^^ http://developer.yahoo.com/yql/console/
O link que gerei pra pegar o conteúdo do Google:
http://query.yahooapis.com/v1/public/yql?q=select%20content%20from%20data.headers%20where%20url%3D%22http%3A%2F%2Fwww.google.com%22&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys
Essa parte que destaquei em vermelho é porque não descobri como faz pra aparecer isso no link de saída pelo link do console que acabei de passar e sem isso a parada não funciona...
Veja se não te serve mudando apenas o link, pra facilitar, ou então estude na internet ou nas documentações da API pra aprender como fazer certo as pesquisas, repetindo, descobri como fazer isso pelo stackoverflow, pois pelo console não tinha conseguido, aí no stack descobri esse tal de content from data.headers e esse final env=store alguma coisa...
Depois de ter esse link basta você utilizar o xmlhttprequest mesmo.
Exemplo:
link='http://query.yahooapis.com/v1/public/yql?q=select%20content%20from%20data.headers%20where%20url%3D%22http%3A%2F%2Fwww.google.com%22&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys';
if (window.XMLHttpRequest){
xmlhttp=new XMLHttpRequest();
}else{
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("GET",link,true);
xmlhttp.onreadystatechange = function(){
if(xmlhttp.readyState==4 && xmlhttp.status==200){
xmlDoc=xmlhttp.responseText;
//aqui vem os comandos depois de ter o arquivo carregado na variável anterior//
}
xmlhttp.send();
O link é aquele que acabei de passar, ou o que vocês geraram, é só alterar a variável link pela sua, depois inserir os comandos onde foi indicado.
Espero ter ajudado!
Muito bom esse post, porém não entendi como colocar o link e saber o que ele retorna. Eu estou fazendo um site e preciso verificar o número de CRM (Conselho Regional de Medicina), então gostaria de saber como o site http://portal.cfm.org.br/ retorna os dados da pesquisa para eu poder validar.
ResponderExcluiré complicado ser sucinto no seu caso, mas vou tentar. olhando rapidamente o site cheguei a conclusão de que você passa as informações através de um link, pois o form é em GET, isso já facilita algumas coisas... então o link é:
Excluirhttp://portal.cfm.org.br/index.php?medicosNome=&medicosCRM=52873&medicosUF=&medicosSituacao=&medicosTipoInscricao=&medicosEspecialidade=&buscaEfetuada=true&option=com_medicos#buscaMedicos
é só colocar o CRM entre medicosCRM= e o '&'. você provavelmente vai usar uma variável pra isso então o link ficaria +/- assim:
"http://portal.cfm.org.br/index.php?medicosNome=&medicosCRM="+crm+"&medicosUF..."
pronto, agora você terá a página de resultados carregada em sua variável, para interpretá-la melhor você pode usar um responseXML criar um elementFrag, enfim, o método não importa, o importante é que você terá que chegar a tabela com o id tableMedicos , descartar a primeira e a última TR e as demais serão os resultados.
Acho que é só isso, se eu resolver fazer explicando sobre como fazer isso eu te aviso por aqui...