Como acessar sites (URL) com java
Boa tarde, estou aqui num raro momento de ócio e resolvi postar algo simples, que é acessar algum site com o Java e ler seu código HTML.
Para tal utilizaremos as classes URL e HTTPUrlConnection do pacote java.net.
Começamos criando uma instancia de URL, passando ao seu construtor uma String. Como visto no exemplo abaixo essa String é a própria URL que desejamos acessar.
java.net.URL url = new java.net.URL("http://www.vaniomeurer.com.br");
Detalhe que esse construtor pode lançar uma exception chamada MalformedURLException e essa mesma é uma exception verificada, então precisamos tratá-la no código, ficando assim nosso código:
try { java.net.URL url = new java.net.URL("http://www.vaniomeurer.com.br"); }catch (java.net.MalformedURLException e){ System.out.println("Erro ao criar URL. Formato inválido."); }
Existem alguns outros construtores para a classe java.net.URL, porem esse é o mais comum.
Depois que já temos a nossa URL, precisamos acessá-la. O Java já traz uma classe que nos abstrai muitos detalhes de baixo nível do protocolo HTTP. A classe é a java.net.HTTPURLConnection e usamos como a seguir:
java.net.HTTPURLConnection urlConnection = (java.net.HTTPURLConnection) url.openConnection();
Como o método retorna uma URLConnection abstrata, precisamos fazer o cast para nossa HTTPURLConnection, pois estamos tratando de uma transação HTTP.
Novamente precisamos tratar uma exception, nesse caso o método openConnection da URL pode retornar uma IOException, então modificando e juntando os códigos temos:
try { java.net.URL url = new java.net.URL("http://www.vaniomeurer.com.br"); java.net.HTTPURLConnection urlConnection = (java.net.HTTPURLConnection) url.openConnection(); } catch (java.net.MalformedURLException e){ System.out.println("Erro ao criar URL. Formato inválido."); } catch (java.io.IOExcetpion e2) { System.out.println("Erro ao acessar URL."); }
Sabendo que a classe MalformedURLException herda IOException poderíamos ter tratado somente a exception IOExceptin, mas deixei assim para que o erro fique mais especifico.
Tendo aberta a conexão precisamos pegar as informações, para isso abrimos a stream de input assim:
java.io.BufferedReader in = new java.io.BufferedReader(new java.ioInputStream(urlConnection.getInputStream()));
Também temos disponível o stream de Output, que pode ser conseguido através do método getOutputStream.
Com o stream de entrada (input), basta percorrermos o stream para mostrarmos a página HTML.
String line = null; while( (line = in.readLine()) != null ){ System.out.println(line); }
Conforme fizemos, vamos ler linha por linha a página HTML e exibir na tela. Poderíamos ter usado qualquer outro leitor de streams.
Pronto, lemos uma página HTML utilizando Java.
Precisamos agora fechar a conexão e os streams abertos.
in.close(); urlConnection.disconnect();
IMPORTANTE: precisamos sempre fechar os streams antes da conexão, caso contrario lançaríamos uma exception!
O código completo ficaria assim:
package br.com.vaniomeurer.exemplos import java.net.URL; import java.net.HTTPURLConnection; import java.net.MalformedURLException; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; public class AcessarURL { public static void main(String args[]) { if (args.length == 0) { System.out.println("Não foi especificado nenhuma URL."); // Fechando aplicação. System.exit(1); } // Pegando a url passada como parametro. String urlName = args[0]; try { URL url = new URL(urlName); HTTPURLConnection urlConnection = (HTTPURLConnection) url.openConnection(); BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); String line = null; while( (line = in.readLine()) != null ){ System.out.println(line); } in.close(); urlConnection.disconnect(); } catch (MalformedURLException e){ System.out.println("Erro ao criar URL. Formato inválido."); System.exit(1); } catch (IOException e2) { System.out.println("Erro ao acessar URL."); System.exit(1); } } }
Compilando e executando o comando “java br.com.vaniomeurer.exemplos.AcessarURL http://www.vaniomeurer.com.br” teríamos impresso o código HTML desse site.
Espero que esse mini tutorial seja útil a alguém, como estou em uma máquina que não tem o JDK não pude compilar para testar, mas logo o faço e edito caso algo esteja errado.
Até, Vânio Meurer (vaninhO)
Parabéns pelo tutorial…… mas deixa eu te perguntar uma coisa….
caso essa url que eu acesse… tenha uma campo login e senha… tem como eu informar esses dados pela classe java e executar o botão “Logar” por exemplo?… e obter a outra pagina que será acessada???
vlwww
Caso sim como seria esse código???
obrigadooooo
Tem sim, você precisaria acessar a página action, ex: (form action=”http://www.vaniomeurer.com.br/login.php” method=”post”…).
Depois de pegar a conexão você precisaria pegar o OutputStream e enviar os parametros com o seguinte formato:
“login=nome&pwd=123″.
(Não esquecer dos possiveis parametros que estão como hidden).
Você também pode estudar essa ferramenta da Apache:
http://hc.apache.org/
Ainda não olhei, mas me parece bem interessante.
Ola… então cara até tentei fazer…. mas não consegui….
vc não tem um exemplo ai ???
Quero acessar um endereço de url.Como que eu faço??
Abraços…
@Paulo
O post é justamente sobre isso Paulo.
Abs.
Realmente seu arquivo está ótimo… Facil de entender!
Vanio estou tentando implementar o seu exemplo, porem dá um erro no import java.net.HTTPURLConnection
Será que preciso de um JDK Novo?!
Tentei não estou conseguindo!
Como faço pra resolver?!
@Diego
Então Diego, essa classe é da versão do SDK 1.4 ou maior.
O que esta errado ai é o nome da classe, que corretamente seria:
java.net.HttpURLConnection, o seu TTP esta maiusculo, não deve estar.
Obrigado pelo elogio, se possivel visite um dos anuncios
Opaa… encontrei o erro! import java.net.HttpURLConnection;
Http era em minusculo… aff hehee
Vou continuar aqui, vamos ver se consigo aplicar!!
Abraço
Vanio… testei porem aparece somente “Erro ao acessar URL”.
O que pode ser?!
@Diego
Diego, aconteceu algum erro ao abrir a conexão ou algum stream.
De um e.printStackTrace() pra saber exatamente o que esta ocorrendo.
Segue o erro principal:
Exception in thread “main” java.net.ConnectException: Connection refused: connect
Me parece que pode ser um problema na rede da empresa, firewall está bloqueando. Vou tentar em casa!!!!
Obs: “Muito bom seu projeto de EasyFaces, tem que continuar!”
Consegui.. \o/
Como faço pra mudar a porta de acesso?!
Você sabe?!
Desculpa a ignorância, mas por que no código completo nâo há nenhuma citação do url que quero acessar..ou input do url que quero extrair o html??
@Guilherme Castilho
No código completo estou passando a URL a ser acessada por parametro de execução. Os parametros são passados pelo console, executando assim:
java nome.da.classe.completa parametro1
ex:
java br.com.vaniomeurer.exemplos.AcessarURL http://www.vaniomeurer.com.br
Você pode editar o código inserindo a URL na linha:
String urlName = “http://www.vaniomeurer.com.br”;
Espero ter ajudado.
@Vanio Meurer
Ajudou muito Vânio! Deixei um e-mail para você, se te interessar entra em contato comigo!
Abraços, GC.
Olá,
Lí seu tutorial e achei realmente muito interessante , além de muito bem explicado.
Eu gostaria de saber se para acessar uma página da web com proteção e encriptação , como por exemplo páginas https , eu conseguiria usando esse método?
Abraços
@Pedro
Bom dia Pedro,
Primeiramente gostaria de agradecer o elogio e pedir que visite os nossos anuncios, eles podem ser uteis
Sobre sua dúvida, a classe java.net.URL possui um parametro passado no seu construtor para uma conexão segura (https) sim.
Abraço
Ótimo!
Apenas para estudos,
É possível enviar algo por POST ?
Valeu!
@Douglas
Funciona da mesma maneira do GET, você só adiciona um setRequestMethod(“POST”).
cara queria saber como faço para não capturar sites fora do ar, pois da erro na aleitura.