Web Scraping en JAVA con libreria Jsoup y guardado de datos en EXCEL
¡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:
- Libreria Jsoup que podeis descargaros aqui. Se utiliza para obtener y parsear el codigo html de la web de carrefour.
- 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.
Congratulations @josebaeza14! You have received a personal award!
Click on the badge to view your Board of Honor.
Do not miss the last post from @steemitboard:
Congratulations @josebaeza14! You received a personal award!
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!