Página Inicial > Java SE > Como acessar sites (URL) com java

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)

Vanio Meurer Java SE , ,

  1. Edward
    19, abril, 2010 em 12:15 | #1

    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

  2. Edward
    19, abril, 2010 em 12:16 | #2

    Caso sim como seria esse código???

    obrigadooooo

  3. 20, abril, 2010 em 15:25 | #3

    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.

  4. Edward
    1, julho, 2010 em 16:55 | #4

    Ola… então cara até tentei fazer…. mas não consegui….
    vc não tem um exemplo ai ???

  5. Paulo
    2, agosto, 2010 em 15:02 | #5

    Quero acessar um endereço de url.Como que eu faço??
    Abraços…

  6. 2, agosto, 2010 em 15:38 | #6

    @Paulo
    O post é justamente sobre isso Paulo.
    Abs.

  7. Diego
    25, agosto, 2010 em 12:43 | #7

    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?!

  8. 25, agosto, 2010 em 14:57 | #8

    @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 ;)

  9. Diego
    25, agosto, 2010 em 15:33 | #9

    Opaa… encontrei o erro! import java.net.HttpURLConnection;
    Http era em minusculo… aff hehee
    Vou continuar aqui, vamos ver se consigo aplicar!!

    Abraço

  10. Diego
    25, agosto, 2010 em 16:14 | #10

    Vanio… testei porem aparece somente “Erro ao acessar URL”.
    O que pode ser?!

  11. 25, agosto, 2010 em 18:31 | #11

    @Diego
    Diego, aconteceu algum erro ao abrir a conexão ou algum stream.
    De um e.printStackTrace() pra saber exatamente o que esta ocorrendo.

  12. Diego
    25, agosto, 2010 em 20:26 | #12

    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!”

  13. Diego
    26, agosto, 2010 em 11:56 | #13

    Consegui.. \o/
    Como faço pra mudar a porta de acesso?!
    Você sabe?!

  14. Guilherme Castilho
    15, novembro, 2010 em 16:01 | #14

    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??

  15. 15, novembro, 2010 em 21:45 | #15

    @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.

  16. Guilherme Castilho
    20, novembro, 2010 em 08:10 | #16

    @Vanio Meurer
    Ajudou muito Vânio! Deixei um e-mail para você, se te interessar entra em contato comigo!

    Abraços, GC.

  17. Pedro
    26, janeiro, 2011 em 09:36 | #17

    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

  18. 26, janeiro, 2011 em 10:27 | #18

    @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

  19. Douglas
    2, fevereiro, 2011 em 01:41 | #19

    Ótimo!

    Apenas para estudos,

    É possível enviar algo por POST ?

    Valeu!

  20. 2, fevereiro, 2011 em 07:41 | #20

    @Douglas
    Funciona da mesma maneira do GET, você só adiciona um setRequestMethod(“POST”).

  21. edson
    8, junho, 2011 em 15:49 | #21

    cara queria saber como faço para não capturar sites fora do ar, pois da erro na aleitura.

  1. Nenhum trackback ainda.