Web Scraping en JAVA con libreria Jsoup y guardado de datos en EXCEL

in #scraping7 years ago (edited)

¡Muy buenas! Os voy a presentar un pequeño programa de Web Scraping

Podéis descargaros el proyecto completo desde mi repositorio de GitHub.

El programa trata de buscar en la pagina web de www.carrefour.es productos de la marca 'USISA'. Obtendriamos los nombres de sus productos y el precio de ellos, indagando en el codigo html de la web.



Para realizar el programa he hecho uso de distintas herramientas: 

  1. Libreria Jsoup que podeis descargaros aqui. Se utiliza para obtener y parsear el codigo html de la web de carrefour.
  2. Librería POI para crear ficheros EXCEL con JAVA. Podeis obtenerlas de mi repositorio.


Para comenzar, miraremos el código html de la pagina web donde se visualizan los productos que queremos. Para ello, con cualquier buscador web, buscamos nuestra pagina web y hacemos click derecho en una zona donde no haya imágenes ni links, ni nada, y seleccionamos la opción de "ver código fuente de la página"

Por la línea 5441 podemos ver lo siguiente:

  <div class="texto-producto"> 
          <a class="track-click enlace-producto" href="https://www.carrefour.es/supermercado/detail/Boqueronesen-
          aceite-de-oliva/_/R-526627364" title="Boquerones en aceite de oliva Usisa  84 g."  data-bu="Food"  data-
          type="product" data-creativity="(not set)" data-promo="(not set)" data-position="0" data-
          productId="526627364" data-productName="Boquerones en aceite de oliva Usisa  84 g." data-
          productCategory=""> 
                   <h2 class="titular-producto">Boquerones en aceite de oliva Usisa  84 g.</h2>
          </a>   
          <p class="precio-nuevo">1,74 <span class="simbolo-euro"> €</span></p>  
 </div> 


Como podemos ver, en la etiqueta h2 con la clase 'titular producto' vemos el nombre del articulo que aparece en nuestra web, y más abajo, podemos ver en una etiqueta p de clase "precio-nuevo", el precio de dicho producto.

Sabiendo esto, vamos a empezar a ver un poco del código:

Comenzaremos nuestro programa creando un nuevo fichero EXCEL, donde guardaremos toda la información que obtengamos:


        FileOutputStream archivo = null;
        File home = FileSystemView.getFileSystemView().getHomeDirectory();//El fichero EXCEL se creara en el escritorio
        String ruta = home.getAbsolutePath() + "/PreciosWebs.xls";
        File archivoXLS = new File(ruta);
        if (archivoXLS.exists()) {
            archivoXLS.delete(); //SI EXISTIA LA BORRO
        }
        archivoXLS.createNewFile(); // CREO UN NUEVO ARCHIVO XLS
        Workbook libro = new HSSFWorkbook();
        archivo = new FileOutputStream(archivoXLS);
        org.apache.poi.ss.usermodel.Sheet hoja = libro.createSheet("Precios Webs");//Creamos una hoja en el EXCEL
        HSSFCellStyle estiloCelda = (HSSFCellStyle) libro.createCellStyle();//definimos un estilo de celda
        estiloCelda.setAlignment(HSSFCellStyle.ALIGN_LEFT);
        estiloCelda.setFillForegroundColor((short) 22);
        estiloCelda.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        HSSFCellStyle estiloCelda2 = (HSSFCellStyle) libro.createCellStyle();//definimos otro estilo de celda
        estiloCelda2.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
        Row fila = hoja.createRow(0);//Creamos una fila, que sera la cabecera del EXCEL
        for (int c = 0; c < 3; c++) { //CABECERA DE LA HOJA EXCEL
            org.apache.poi.ss.usermodel.Cell celda = fila.createCell(c);//Vamos creando de uno en uno cada celda de la primera fila (Cabecera)
            celda.setCellStyle(estiloCelda);
            if (c == 0) {
                celda.setCellValue("TIENDA");
            }
            if (c == 1) {
                celda.setCellValue("PRODUCTO");
            }
            if (c == 2) {
                celda.setCellValue("PRECIO");
            }
        }


Ahora iremos obteniendo los datos y metiendolos en el EXCEL:


        Document doc;
        int maxBodySize = 4092000;//Para paginas webs muy grandes, este valor hay que aumentarlo para que cargue toda la pagina completa
        //Carrefour
        doc = Jsoup.connect("https://www.carrefour.es/global/?Dy=1&Nty=1&Ntx=mode+matchallany&Ntt=usisa&search=").maxBodySize(maxBodySize).get();
        String title = "CARREFOUR";
        System.out.println("title : " + title);
        fila = hoja.createRow(x);//Creo una nueva fila para poner el nombre de la pagina web
        org.apache.poi.ss.usermodel.Cell celda = fila.createCell(0);//lo inserto en la primera celda
        celda.setCellValue(title);
        x++;
        Elements linksNombre = doc.select("h2.titular-producto");//Obtengo las etiquetas html: h2 cuya clase sea 'titular-producto'(Hay estan los nombres de los productos)
        Elements linksPrecios = doc.select("p.precio-nuevo");//Obtengo las etiquetas html: p cuya clase sea 'precio-nuevo'
        for (int i = 0; i < linksNombre.size(); i++) {
            System.out.println("Nombre : " + linksNombre.get(i).text());
            System.out.println("Precio : " + linksPrecios.get(i).text());
            fila = hoja.createRow(x);//Voy creando filas a medida que obtengo los datos
            org.apache.poi.ss.usermodel.Cell celda1 = fila.createCell(1);// celda para poner el nombre
            celda1.setCellValue(linksNombre.get(i).text());
            org.apache.poi.ss.usermodel.Cell celda2 = fila.createCell(2);//celda para poner el precio
            celda2.setCellValue(linksPrecios.get(i).text());
            x++;
        }


Por último cerraremos el fichero EXCEL:

libro.write(archivo);


Y final... como resultado, en nuestro escritorio se nos creara un fichero EXCEL con los datos obtenidos:



He comentado linea a linea para que entendáis que hace y como funciona el programa. ¡Cualquier duda o sugerencia estaré encantado de leerla y contestarla! ¡Muchas gracias y hasta la próxima!


Podéis descargaros el proyecto completo desde mi repositorio de GitHub.

Sort:  

Congratulations @josebaeza14! You have received a personal award!

1 Year on Steemit
Click on the badge to view your Board of Honor.

Do not miss the last post from @steemitboard:

SteemitBoard - Witness Update

Support SteemitBoard's project! Vote for its witness and get one more award!

Congratulations @josebaeza14! You received a personal award!

Happy Birthday! - You are on the Steem blockchain for 2 years!

You can view your badges on your Steem Board and compare to others on the Steem Ranking

Vote for @Steemitboard as a witness to get one more award and increased upvotes!

Coin Marketplace

STEEM 0.17
TRX 0.13
JST 0.027
BTC 58733.26
ETH 2663.75
USDT 1.00
SBD 2.44