Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Buscando dados da rede

E se eu quisesse coletar dados de uma página especifica, vamos dizer que existe um site que fornece cotações diárias de ações e outras informações que sejam relevantes, trazer essa informação e gerar um relatório em PDF como saída. que curso aqui na alura eu deveria fazer?

Quero deixar um disclaimer, eu sei que muito do que existe sobre web scrapping na internet pode ter conotação maliciosa, garanto que minha intenção é puramente para fins educacionais e com verificação prévia dos termos de serviço. Eu gosto do Darth Vader mas meu lado dark side acaba aí mesmo =D

3 respostas
solução!

Olá João, tudo bem com você?

Então, aqui temos uma questão, você pretende fazer web scrapping, ou obter os dados de um servidor?

Por exemplo, é bastante comum termos API's, que são servidores que fornecem dados para nós, por exemplo:

Aqui na Alura em um dos projetos temos um servidor público para buscar os dados na seguinte url: https://api-pacientes.herokuapp.com/pacientes

Se quisermos obter esses dados com o Java precisaremos de 1 biblioteca chamada Gson que converte os dados que recebemos ( no formato JSON) em classes, um exemplo simples:

public class Main {
    public static void main(String[] args) {
        HttpURLConnection connection = null;
        BufferedReader reader = null;

        try {
            URL url = new URL("https://api-pacientes.herokuapp.com/pacientes");

            connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");

            reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));

            StringBuilder response = new StringBuilder();
            String line;

            while((line = reader.readLine()) != null){
                response.append(line);
            }

    System.out.println(response.toString());

Aqui é bem simples estamos criando uma conexão HTTP, dizendo que queremos fazer uma chamada do tipo GET e passamos a resposta para o nosso BufferedReader

E teremos como resposta isso:

[ { "nome": "Jéssica", "peso": 47, "altura": 1.54, "gordura": 17, "imc": 19.82 }, { "nome": "Flavio", "peso": 70, "altura": 1.7, "gordura": 17, "imc": 24.22 }, { "nome": "Teresa", "peso": 60, "altura": 1.7, "gordura": 13, "imc": 20.76 }, { "nome": "Marina", "peso": 75, "altura": 1.7, "gordura": 26, "imc": 25.95 }, { "nome": "Lucas", "peso": 23, "altura": 1.25, "gordura": 10, "imc": 14.72 }, { "nome": "Stevie", "peso": 73, "altura": 1.75, "gordura": 10, "imc": 23.84 }, { "nome": "Daniel", "peso": 78, "altura": 1.85, "gordura": 19, "imc": 22.79 }]

Para transformar isso em objetos, podemos fazer o download do Gson aqui, e adicionar no nosso projeto igual foi ensinado na parte 5 de java

Gson gson = new Gson();

Pessoa[] pessoas = gson.fromJson(response.toString(), Pessoa[].class);

E dessa forma teremos com sucesso obtido os dados da API e transformado em objetos da classe Pessoa, vou deixar o link do código completo aqui

2 . WebScrapping

Aqui na Alura não tem cursos de WebScrapping, um curso que pode te ajudar é o de Selenium, que é uma biblioteca para testar sites, mas cursos voltados para extração de dados de html não há

Mas temos uma biblioteca bem simples que é o JSoup que é utilizado para ler páginas html, aqui tem o download dele e para utilizar é bem simples, basta entender de manipular a DOM, um exemplo

import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

import java.io.IOException;

public class WebScrapping {

    public static void main(String[] args) {


        try {
            Connection conn = Jsoup.connect("https://cursos.alura.com.br/forum/topico-buscando-dados-da-rede-129220");
            Document document = conn.get();

            Elements element = document.getElementsByClass("topic-post-content");

            System.out.println(element.select("p").first());

        } catch (IOException e) {
            e.printStackTrace();
        }

Dessa maneira conseguímos fazer web scrapping em diversos sites :)

Ai você pode olhar uns artigos, vídeos no youtube, ou ler a documentação que é bem simples

Abraços e Bons Estudos!

Que show de resposta, Geovani, nem esperava tanto. QUE AULA.

Eu não sei se meu jeito de aprender está errado ou está muito lento, o que eu sei de API é só o significado e pra que serve, não fui formalmente apresentado assim como fui com as exceptions, portanto ainda não sei como consumir(tirando o exemplo que você deu) e como construir. Talvez agora que eu terminei o "básico" do Java, com a minha intenção de aprender Spring Boot até esteja na rota certa e encontrar algo de API por aqui no meio do caminho. Sobre o webscrapping, foi só ideia de coletar uma série de dados específicos de uma pagina que eu sei que estão em um mesmo lugar, algo que talvez eu consiga com varias APIs disponibilizadas por diversos fornecedores, seria só um meio de encurtar o caminho e de aprender como faz também.

Muito obrigado pela sua ajuda, fez uma diferença enorme no meu entendimento e compreensão de como o Java precisa funcionar nesses casos. Obrigado.

Olá João, tudo bem?

Acredito que o estilo de aprendizado está em um ritmo bom, dessa maneira você foge de um problema comum que é de chegar a conteúdo avançado e não entender a base de maneira correta, e ai qualquer "feature" que precisa ser feita é uma dor de cabeça

Agora que você está chegando perto do Springboot vai ver toda facilidade e arcabouço que ele já traz, e acaba sendo relativamente simples criar API's simples, na verdade conhecimento de coleções, e saber utilizar recursos do Java8 e superior ( lambdas, map, filter, reduce, etc.) acabam sendo muito mais proveitosos

Agora dado que o que você pretende é webscrapping eu sinceramente acredito que essa biblioteca (JSoup) já é suficiente, vai depender mais noção de percorrer a árvore de elementos HTML, para encontrar de forma fácil, seja pela classe, id, ou tipo de elemento

Dessa forma você captura os elementos, cria classes baseadas nesses atributos selecionados e pode até salvar em um banco de dados, então eu daria uma estudada nessa biblioteca e em percorrer elementos que tranquilamente você consegue capturar esses dados :)

Abraços!