Pegar resultado da lotofácil do site da Caixa

Prezados (as),

O site da Caixa: http://www.loterias.caixa.gov.br/wps/portal/loterias/landing/lotofacil não mostra o resultado da lotofácil no código-fonte em html.
Alguém podeira dar uma ajuda?
Como pegar o resultado da lotofácil através de um código em java?

Se você abrir o código fonte no browser, você verá as variáveis e não os valores.

Mas se você salvar a página e então abrir com um editor de textos, vai encontrar um <div class="resultado-loteria">, dentro desse div você vai encontrar um <table class="simple-table lotofacil"> com vários <td ng-repeat="dezena in resultadoLinha" class="ng-binding ng-scope">VALOR DA DEZENA</td>.

Então é só você usar o Java para ler o InputStream da URL http://www.loterias.caixa.gov.br/wps/portal/loterias/landing/lotofacil e aí sair lendo o conteúdo dentro das tags corretas.

O resultado na data de hoje (11/01/2019) é:

01 02 03 05 06
09 10 11 13 17
18 19 20 21 25

Abaixo está o conteúdo do <div class="resultado-loteria"> que contém os valores acima:

<div class="resultado-loteria">
	<h3 class="epsilon ng-hide" ng-show="resultado.sorteioAcumulado">Acumulou!</h3>
	<p class="description ng-binding">Sorteio realizado
		no Espaço Loterias Caixa em SÃO PAULO,
		SP</p>
	<div>
		<table class="simple-table lotofacil">
			<tbody>
				<!-- ngRepeat: resultadoLinha in resultado.resultadoLotoFacilOrdenado --><tr ng-repeat="resultadoLinha in resultado.resultadoLotoFacilOrdenado" class="ng-scope">
					<!-- ngRepeat: dezena in resultadoLinha --><td ng-repeat="dezena in resultadoLinha" class="ng-binding ng-scope">01</td><!-- end ngRepeat: dezena in resultadoLinha --><td ng-repeat="dezena in resultadoLinha" class="ng-binding ng-scope">02</td><!-- end ngRepeat: dezena in resultadoLinha --><td ng-repeat="dezena in resultadoLinha" class="ng-binding ng-scope">03</td><!-- end ngRepeat: dezena in resultadoLinha --><td ng-repeat="dezena in resultadoLinha" class="ng-binding ng-scope">05</td><!-- end ngRepeat: dezena in resultadoLinha --><td ng-repeat="dezena in resultadoLinha" class="ng-binding ng-scope">06</td><!-- end ngRepeat: dezena in resultadoLinha -->
				</tr><!-- end ngRepeat: resultadoLinha in resultado.resultadoLotoFacilOrdenado --><tr ng-repeat="resultadoLinha in resultado.resultadoLotoFacilOrdenado" class="ng-scope">
					<!-- ngRepeat: dezena in resultadoLinha --><td ng-repeat="dezena in resultadoLinha" class="ng-binding ng-scope">09</td><!-- end ngRepeat: dezena in resultadoLinha --><td ng-repeat="dezena in resultadoLinha" class="ng-binding ng-scope">10</td><!-- end ngRepeat: dezena in resultadoLinha --><td ng-repeat="dezena in resultadoLinha" class="ng-binding ng-scope">11</td><!-- end ngRepeat: dezena in resultadoLinha --><td ng-repeat="dezena in resultadoLinha" class="ng-binding ng-scope">13</td><!-- end ngRepeat: dezena in resultadoLinha --><td ng-repeat="dezena in resultadoLinha" class="ng-binding ng-scope">17</td><!-- end ngRepeat: dezena in resultadoLinha -->
				</tr><!-- end ngRepeat: resultadoLinha in resultado.resultadoLotoFacilOrdenado --><tr ng-repeat="resultadoLinha in resultado.resultadoLotoFacilOrdenado" class="ng-scope">
					<!-- ngRepeat: dezena in resultadoLinha --><td ng-repeat="dezena in resultadoLinha" class="ng-binding ng-scope">18</td><!-- end ngRepeat: dezena in resultadoLinha --><td ng-repeat="dezena in resultadoLinha" class="ng-binding ng-scope">19</td><!-- end ngRepeat: dezena in resultadoLinha --><td ng-repeat="dezena in resultadoLinha" class="ng-binding ng-scope">20</td><!-- end ngRepeat: dezena in resultadoLinha --><td ng-repeat="dezena in resultadoLinha" class="ng-binding ng-scope">21</td><!-- end ngRepeat: dezena in resultadoLinha --><td ng-repeat="dezena in resultadoLinha" class="ng-binding ng-scope">25</td><!-- end ngRepeat: dezena in resultadoLinha -->
				</tr><!-- end ngRepeat: resultadoLinha in resultado.resultadoLotoFacilOrdenado -->
			</tbody>
		</table>
	</div>
	<div class="next-prize clearfix">
		<p class="ng-binding">Estimativa de prêmio do próximo concurso
			11/01/2019</p>
		<p class="value ng-hide" ng-show="resultado.rateioProcessamento">Em
			processamento</p>
		<p class="value ng-binding" ng-hide="resultado.rateioProcessamento">R$
			2.000.000,00</p>
	</div>
	<div class="totals ng-hide" ng-show="resultado.sorteioAcumulado">
		<p>
			<span>Valor acumulado</span> <span class="value ng-hide" ng-show="resultado.rateioProcessamento">Em processamento</span>
			<span class="value ng-binding" ng-hide="resultado.rateioProcessamento">R$
				0,00</span>
		</p>
	</div>
	<div class="totals">
		<p>
			<span>Acumulado para Sorteio Especial da Independência</span> <span class="value ng-hide" ng-show="resultado.rateioProcessamento">Em
				processamento</span> <span class="value ng-binding" ng-hide="resultado.rateioProcessamento">R$
				24.477.553,28</span>
		</p>
	</div>
</div>
2 curtidas

Bom dia amigo.

Usando selenium-server-standalone-3.12.0.jar.

public final class Lotofacil {

    private final String url;
    private final WebClient wc;

    public static void main(String[] args) {
        Lotofacil lotofacil = new Lotofacil();
        Map<String, List<Long>> resultados = lotofacil.getResultados();
        resultados.keySet().forEach(concurso -> System.out.println(concurso));
        resultados.forEach((k, v) -> System.out.println(v));
    }

    public Lotofacil() {
        this.url = "http://www.loterias.caixa.gov.br/wps/portal/loterias/landing/lotofacil";
        wc = new WebClient(BrowserVersion.CHROME);
    }

    private HtmlPage getIndexPage() {
        try {
            HtmlPage index = wc.getPage(url);
            System.out.println(index.getTitleText());
            System.out.println(index.getUrl().toString());
            return index;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
}

private Map<String, List<Long>> getResultados() {
    try {
        Map<String, List<Long>> map = new HashMap();
        List<Long> resultados = new ArrayList();
        HtmlPage index = getIndexPage();
        List<HtmlElement> lista = index.getBody().getElementsByAttribute("table", "class", "simple-table lotofacil");
        List<HtmlElement> spans = index.getBody().getElementsByAttribute("span", "class", "ng-binding");
        HtmlTable tabela = (HtmlTable) lista.get(0);
        HtmlSpan concurso = (HtmlSpan) spans.get(0);
        wc.waitForBackgroundJavaScript(10000L);
        String ccs = concurso.getTextContent().replaceAll("\\s+", " ").trim();
        List<HtmlTableCell> cells = tabela.getBodies().get(0).getElementsByAttribute("td", "ng-repeat", "dezena in resultadoLinha");
        cells.forEach(cell -> resultados.add(Long.parseLong(cell.getTextContent())));
        map.put(ccs, resultados);
        return map;
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}
}

image

Boa sorte! :metal::sunglasses::metal:

3 curtidas

Prezado,
Obrigado pela ajuda!
Mas não funcionou perfeitamente.
Apareceu vários erros:
ADVERTÊNCIA: CSS error: ‘http://www.loterias.caixa.gov.br/wps/contenthandler/!ut/p/digest!WtkclLoVjfBb5z38kgyFlg/sp/mashup:ra:collection?soffset=6&eoffset=14&themeID=ZJ_61L0H0G0J03540AI77QD5F3OV7&locale=pt-BR&locale=pt&locale=en&mime-type=text%2Fcss&entry=wp_one_ui_30__0.0%3Ahead_css&entry=wp_one_ui_dijit_30__0.0%3Ahead_css&entry=wp_oob_sample_styles__0.0%3Ahead_css&entry=wp_preview__0.0%3Ahead_css&entry=wp_legacy_layouts__0.0%3Ahead_css&entry=wp_theme_portal_80__0.0%3Ahead_css&entry=wp_ic4_wai_resources__0.0%3Ahead_css&entry=wp_status_bar__0.0%3Ahead_css&entry=wp_portlet_css__0.0%3Ahead_css’ [1:4613] Error in style rule. (Invalid token “#overflow”. Was expecting one of: , , , “}”, “;”, “*”.)
jan 11, 2019 10:25:47 PM com.gargoylesoftware.htmlunit.DefaultCssErrorHandler warning
jan 11, 2019 10:26:26 PM com.gargoylesoftware.htmlunit.javascript.StrictErrorReporter runtimeError
GRAVE: runtimeError: message=[An invalid or illegal selector was specified (selector: ‘.section-slider a.pagination-item:eq(0)’ error: Invalid selector: .section-slider a.pagination-item:eq(0)).] sourceName=[http://www.loterias.caixa.gov.br/InstitucionalTema/themes/static/js/jquery-1.9.1.min.js] line=[4] lineSource=[null] lineOffset=[0]
jan 11, 2019 10:26:26 PM com.gargoylesoftware.htmlunit.WebConsole info
INFORMAÇÕES: 1.0
jan 11, 2019 10:26:36 PM com.gargoylesoftware.htmlunit.WebConsole info
INFORMAÇÕES: isIE: false
Lotofácil - Loterias | Caixa
http://www.loterias.caixa.gov.br/wps/portal/loterias/landing/lotofacil
jan 11, 2019 10:26:36 PM com.gargoylesoftware.htmlunit.WebConsole info
INFORMAÇÕES: ({proximoConcurso:“1762”, concursoAnterior:“1761”, forward:null, mensagens:[], nu_concurso:“1762”, dt_apuracao:1.547172E12, de_resultado:“20-22-05-12-17-06-25-07-21-01-23-16-08-02-15”, de_observacao:null, qt_ganhador_faixa1:6, qt_ganhador_faixa2:668, qt_ganhador_faixa3:20786, qt_ganhador_faixa4:212796, qt_ganhador_faixa5:1148057, vr_rateio_faixa1:417617.48, vr_rateio_faixa2:1648.81, vr_rateio_faixa3:20, vr_rateio_faixa4:8, vr_rateio_faixa5:4, no_cidade:“S\uC3O PAULO”, sg_uf:“SP”, vrAcumuladoFaixa1:“0,00”, vrAcumuladoFaixa2:“0,00”, vrEstimativa:“2.000.000,00”, dtProximoConcurso:1.5474312E12, vrArrecadado:“28.183.534,00”, vrAcumuladoEspecial:“25.055.792,86”, de_local_sorteio:“Espa\uE7o Loterias Caixa”, ic_concurso_especial:false, sorteioAcumulado:false, rateioProcessamento:false, localSorteio:“no Espa\uE7o Loterias Caixa”, ganhadoresPorUf:[{proximoConcurso:null, concursoAnterior:null, forward:null, mensagens:[], coLoteria:“T”, nuConcurso:“1762”, sgUf:“BA”, qtGanhadores:1, noCidade:“UNA”, total:null, icCanalEletronico:false}, {proximoConcurso:null, concursoAnterior:null, forward:null, mensagens:[], coLoteria:“T”, nuConcurso:“1762”, sgUf:“MA”, qtGanhadores:1, noCidade:“S\uC3O LUIS”, total:null, icCanalEletronico:false}, {proximoConcurso:null, concursoAnterior:null, forward:null, mensagens:[], coLoteria:“T”, nuConcurso:“1762”, sgUf:“PA”, qtGanhadores:1, noCidade:“SENADOR JOS\uC9 PORF\uCDRIO”, total:null, icCanalEletronico:false}, {proximoConcurso:null, concursoAnterior:null, forward:null, mensagens:[], coLoteria:“T”, nuConcurso:“1762”, sgUf:“PB”, qtGanhadores:1, noCidade:“JO\uC3O PESSOA”, total:null, icCanalEletronico:false}, {proximoConcurso:null, concursoAnterior:null, forward:null, mensagens:[], coLoteria:“T”, nuConcurso:“1762”, sgUf:“SP”, qtGanhadores:1, noCidade:“RIBEIR\uC3O PIRES”, total:null, icCanalEletronico:false}, {proximoConcurso:null, concursoAnterior:null, forward:null, mensagens:[], coLoteria:“T”, nuConcurso:“1762”, sgUf:“SP”, qtGanhadores:1, noCidade:“S\uC3O PAULO”, total:null, icCanalEletronico:false}], error:false, resultadoOrdenado:“01-02-05-06-07-08-12-15-16-17-20-21-22-23-25”, dt_apuracaoStr:“11/01/2019”, dtProximoConcursoStr:“14/01/2019”, legendaGanhadores15:6 apostas ganhadoras, R$ 417.617,48, legendaGanhadores14:668 apostas ganhadoras, R$ 1.648,81, legendaGanhadores13:20786 apostas ganhadoras, R$ 20,00, legendaGanhadores12:212796 apostas ganhadoras, R$ 8,00, legendaGanhadores11:1148057 apostas ganhadoras, R$ 4,00, resultadoLotoFacilOrdenado:[[“01”, “02”, “05”, “06”, “07”], [“08”, “12”, “15”, “16”, “17”], [“20”, “21”, “22”, “23”, “25”]]})
jan 11, 2019 10:26:38 PM com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify
ADVERTÊNCIA: Obsolete content type encountered: ‘text/javascript’.
jan 11, 2019 10:26:45 PM com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify
ADVERTÊNCIA: Obsolete content type encountered: ‘application/x-javascript’.
Concurso 1762 (11/01/2019)
[1, 2, 5, 6, 7, 8, 12, 15, 16, 17, 20, 21, 22, 23, 25]
CONSTRUÍDO COM SUCESSO (tempo total: 1 minuto 6 segundos)

isso é log…se pegar só o array os logs não aparecem. Na minha execução eu desativei os logs, por isso só apareceu o resultado.

Prezado,
Obrigado pela ajuda!
Só uma dúvida:
Primeiro tenho que salvar a pagina em html.
Segundo ler este arquivo salvo. com FileInputStream

Correto o meu entendimento?

Não, crie um objeto do tipo URL depois chama o método openStream() que você já obtém um InputStream para ler.

Seria assim?
Mas desse modo não consigo visualizar o resultado.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.CookieHandler;
import java.net.CookieManager;
import java.net.CookiePolicy;
import java.net.URL;

public class JavaInputStreamURL {
    public static void main(String[] args) throws IOException {
       CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL));
        String webSite = "http://www.loterias.caixa.gov.br/wps/portal/loterias/landing/lotofacil";
        URL url = new URL(webSite);
        try (InputStream is = url.openStream();
                BufferedReader br = new BufferedReader(new InputStreamReader(is))) {
                br.lines().forEach(System.out::println);            
        }
    }
}

Prezado,
Estudando o seu código fiz algumas alterações, segue:

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlSpan;
import com.gargoylesoftware.htmlunit.html.HtmlTable;
import com.gargoylesoftware.htmlunit.html.HtmlTableCell;
import java.io.IOException;
import java.net.CookieHandler;
import java.net.CookieManager;
import java.net.CookiePolicy;
import java.util.ArrayList;
import java.util.List;

public class Baixar5 {
    public static void main(String[] args) throws IOException {
        
      java.util.logging.Logger.getLogger("com.gargoylesoftware.htmlunit").setLevel(java.util.logging.Level.OFF); 
      java.util.logging.Logger.getLogger("org.apache.http").setLevel(java.util.logging.Level.OFF);  
      
      CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL));
      String URL = "http://www.loterias.caixa.gov.br/wps/portal/loterias/landing/lotofacil";
      WebClient webClient = new WebClient(BrowserVersion.CHROME);
      HtmlPage page = webClient.getPage(URL);
      webClient.getOptions().setJavaScriptEnabled(true);
      webClient.waitForBackgroundJavaScript(9000);
      
      System.out.println(page.getTitleText());
      System.out.println(page.getUrl().toString());
            
      List<HtmlElement> spans = page.getBody().getElementsByAttribute("span", "class", "ng-binding");
      HtmlSpan concurso = (HtmlSpan) spans.get(0);
      String ccs = concurso.getTextContent().replaceAll("\\s+", " ").trim();
      System.out.println(ccs);
      
      List<Long> resultados = new ArrayList();  
      List<HtmlElement> lista = page.getBody().getElementsByAttribute("table", "class", "simple-table lotofacil"); 
      HtmlTable tabela = (HtmlTable) lista.get(0);
      List<HtmlTableCell> cells = tabela.getBodies().get(0).getElementsByAttribute("td", "ng-repeat", "dezena in resultadoLinha");
      cells.forEach(cell -> resultados.add(Long.parseLong(cell.getTextContent())));
      System.out.println(resultados); 
    }
}
**Resultado:**
run:
Lotofácil - Loterias | Caixa
http://www.loterias.caixa.gov.br/wps/portal/loterias/landing/lotofacil
Concurso 1762 (11/01/2019)
[1, 2, 5, 6, 7, 8, 12, 15, 16, 17, 20, 21, 22, 23, 25]
CONSTRUÍDO COM SUCESSO (tempo total: 1 minuto 16 segundos)

Assim, tenho algumas dúvidas:

1º - É possível fazer com que o resultado seja mais rápido, pois levou (tempo total: 1 minuto 16 segundos))?

2º- Gostaria também de pegar a data do próximo concurso, tentei mas não consegui.

Mais uma vez, Grato!

Boa noite amigo

A velocidade do código depende do site e da velocidade da internet pois a api selenium é usada para automação de testes em sites e tudo o que eu fiz foi simular um usuário entrando no site e visualizando o resultado, por isso aparece aquele monte de log, é para análise do site. O problema é que o site da caixa é ruim mesmo…kkkkkkkkk.

Este site em específico está usando angular e JavaScript de monte e vários valores no site não vem com o código html logo de cara, são executados scripts que preenchem as lacunas do site por isso coloquei alguns segundos para que os scripts fossem executados antes de pegar o resultado na tabela.

Enfim, fiz um método que pega a data para você, você pode adaptar no meio do código que você fez sem problemas.

public String getDataProximoSorteio(HtmlPage index) {
    try {
        List<HtmlElement> division = index.getBody().getElementsByAttribute("div", "class", "resultado-loteria");
        List<HtmlElement> paragrafos = division.get(0).getElementsByAttribute("p", "class", "ng-binding");
        String data = paragrafos.get(0).getTextContent().trim();
        data = "Data do próximo sorteio: ".concat(data.substring((data.length() - 10), data.length()));
        System.out.println(data);
        return data;
    } catch (Exception e) {
        return "";
    }
}

Boa sorte para ti…:metal::sunglasses::metal:

Prezado,
Obrigado pela ajuda!
Resumindo, só existe este modo com a api selenium para raspar páginas em JavaScript?

Segue o código atualizado para futuras consultas:

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlSpan;
import com.gargoylesoftware.htmlunit.html.HtmlTable;
import com.gargoylesoftware.htmlunit.html.HtmlTableCell;
import java.io.IOException;
import java.net.CookieHandler;
import java.net.CookieManager;
import java.net.CookiePolicy;
import java.util.ArrayList;
import java.util.List;

public class Baixar5 {
    public static void main(String[] args) throws IOException {
      
      System.out.println("Aguarde processo em execusão...");  
        
      java.util.logging.Logger.getLogger("com.gargoylesoftware.htmlunit").setLevel(java.util.logging.Level.OFF); 
      java.util.logging.Logger.getLogger("org.apache.http").setLevel(java.util.logging.Level.OFF);  
      
      CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL));
      String URL = "http://www.loterias.caixa.gov.br/wps/portal/loterias/landing/lotofacil";
      WebClient webClient = new WebClient(BrowserVersion.CHROME);
      HtmlPage page = webClient.getPage(URL);
      webClient.getOptions().setJavaScriptEnabled(true);
      webClient.waitForBackgroundJavaScript(9000);
      
      System.out.println(page.getTitleText());
      System.out.println(page.getUrl().toString());
            
      List<HtmlElement> spans = page.getBody().getElementsByAttribute("span", "class", "ng-binding");
      HtmlSpan concurso = (HtmlSpan) spans.get(0);
      String ccs = concurso.getTextContent().replaceAll("\\s+", " ").trim();
      System.out.println(ccs);
      
      List<Long> resultados = new ArrayList();  
      List<HtmlElement> lista = page.getBody().getElementsByAttribute("table", "class", "simple-table lotofacil"); 
      HtmlTable tabela = (HtmlTable) lista.get(0);
      List<HtmlTableCell> cells = tabela.getBodies().get(0).getElementsByAttribute("td", "ng-repeat", "dezena in resultadoLinha");
      cells.forEach(cell -> resultados.add(Long.parseLong(cell.getTextContent())));
      System.out.println(resultados); 
      
      List<HtmlElement> division = page.getBody().getElementsByAttribute("div", "class", "resultado-loteria");
      List<HtmlElement> paragrafos = division.get(0).getElementsByAttribute("p", "class", "ng-binding");
      String data = paragrafos.get(0).getTextContent().trim();
      data = "Data do próximo sorteio: ".concat(data.substring((data.length() - 10), data.length()));
      System.out.println(data);
      
    }
}

Boa noite amigo.

Na verdade existem vários meios de conseguir navegar nas páginas, o problema é a arquitetura de cada página, eu utilizo o selenium para pegar resultados de exames em páginas de laboratórios que não fornecem serviços de consulta via webservices e o código que utilizado é 50x maior que este.

Ainda bem que funcionou. :metal::sunglasses::metal: