[{"data":1,"prerenderedAt":18},["ShallowReactive",2],{"article":3},{"id":4,"category":5,"slug":6,"title":7,"image":8,"page_image":9,"published_at":10,"updated_at":11,"meta_title":12,"meta_description":13,"meta_keywords":14,"content":15,"tags":16,"faqs":17},91,"blog","es-using-java-for-data-scraping-and-harvesting-on-the-web","Usando Java para la recolección y extracción de datos en la Web","https://blog.dexodata.com/storage/uploads/previews/14-1-s-trusted-proxy-website-using-java-for-data-scraping-cover-2064x982-c0fd137c-641b-402a-8d44-a31b0fe45d1a.webp","https://blog.dexodata.com/storage/uploads/covers/f41fe3da-d419-4dbb-b49a-5e6e094208a9.webp","2023/06/02","2023/08/07","Java para la recolección de datos con un sitio web proxy de confianza","Uso de Java para la recolección de datos en la Web explicado por Dexodata, un sitio web proxy de confianza que ofrece proxies geográficamente dirigidos para cualquier propósito legítimo y legal.","trusted proxy website, geo targeted proxies, proxy free trial, buy residential IP","\u003C!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n\u003C?xml encoding=\"utf-8\"?>\u003Chtml>\u003Cbody>\u003Cp>\u003Cem>\u003Cstrong>Contenido del art&iacute;culo\u003C/strong>\u003C/em>\u003C/p>\n\u003Col>\n\u003Cli>\u003Ca href=\"#anchor1\">Frameworks disponibles para trabajar con proxies geogr&aacute;ficamente dirigidos\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"#anchor2\">Requisitos previos de la gu&iacute;a para quienes compran IPs residenciales\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"#anchor3\">ABC de selectores CSS de un proveedor de proxies geogr&aacute;ficamente dirigidos\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"#anchor4\">Gu&iacute;a paso a paso de un sitio web proxy de confianza\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"#anchor5\">Consulta\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"#anchor6\">Conclusi&oacute;n\u003C/a>\u003C/li>\n\u003C/ol>\n\u003Cp>Colaborando con usuarios que demandan herramientas para la recolecci&oacute;n y extracci&oacute;n de datos y ejecutando un ecosistema de proxies geogr&aacute;ficamente dirigidos, Dexodata, un sitio web proxy de confianza y rentable, sabe que Java no es la &uacute;nica opci&oacute;n para recolectar informaci&oacute;n. Cuando hacemos disponible una prueba gratuita de proxy o ofrecemos \u003Ca href=\"https://dexodata.com/en/pricing\" target=\"_blank\" rel=\"noopener\">comprar IPs residenciales a un gran precio\u003C/a>, PHP, Node.js, C#, Python, etc. tambi&eacute;n se aplican de manera rutinaria. Sin embargo, Java sigue siendo una forma preferida para muchos. Hoy, exploraremos su potencial.&nbsp;\u003C/p>\n\u003Ch2>\u003Ca name=\"anchor1\">\u003C/a>Frameworks disponibles para trabajar con proxies geogr&aacute;ficamente dirigidos\u003C/h2>\n\u003Cp>Cuando la recolecci&oacute;n de datos web y la extracci&oacute;n de datos con Java est&aacute;n en la agenda, a menudo se aplican estas dos bibliotecas: por un lado, est&aacute; \u003Ca href=\"https://jsoup.org/\" target=\"_blank\" rel=\"noopener\">JSoup\u003C/a> y, por otro lado, existe \u003Ca href=\"https://htmlunit.sourceforge.io/\" target=\"_blank\" rel=\"noopener\">HtmlUnit\u003C/a>.\u003C/p>\n\u003Cp>En cuanto a JSoup, es una biblioteca potente, efectiva y relativamente f&aacute;cil de usar, capaz de abordar con &eacute;xito documentos HTML mal formados. De hecho, esa es exactamente la raz&oacute;n por la que se llama \"JSoup\", ya que \"tag soup\" significa cosas mal formadas. Para todos los efectos, JSoup es probablemente la biblioteca Java m&aacute;s buscada y ampliamente utilizada en t&eacute;rminos de recolecci&oacute;n de informaci&oacute;n.\u003C/p>\n\u003Cp>En cuanto a HtmlUnit, se puede describir como un navegador sin cabeza (es decir, un navegador sin GUI) para herramientas impulsadas por Java. Es capaz de imitar y replicar los aspectos t&iacute;picos de las soluciones de navegaci&oacute;n, incluyendo la captura de ciertos componentes de p&aacute;gina, haciendo clic en varios puntos, etc. Tal como su nombre implica, este &uacute;ltimo se aplica t&iacute;picamente para ejecutar rondas de pruebas unitarias. Literalmente, esta es una forma de emular una soluci&oacute;n de navegaci&oacute;n en un escenario de prueba.\u003C/p>\n\u003Cp>Adem&aacute;s, HtmlUnit es una opci&oacute;n adecuada en el contexto de la recolecci&oacute;n de datos web y la extracci&oacute;n de datos. La principal ventaja es que las personas solo requieren una l&iacute;nea de c&oacute;digo para desactivar tanto JS como CSS. Sin lugar a dudas, esa es una caracter&iacute;stica &uacute;til, ya que JS y CSS son mayormente irrelevantes en situaciones de scraping. A continuaci&oacute;n, evaluamos ambas y dise&ntilde;amos herramientas de scraping.\u003C/p>\n\u003Cp style=\"text-align: center;\">\u003Cimg src=\"https://blog.dexodata.com/storage/uploads/images/91/14-1-2-geo-targeted-proxies-using-java-for-data-scraping-pic-1032x491-2c8bbd08-d2e0-4203-880a-18a52fb8d7ec.png\" alt=\"Uso de Java para la recolecci&oacute;n de datos web con proxies geogr&aacute;ficamente dirigidos\" width=\"1032\" height=\"491\">\u003C/p>\n\u003Cp>Como un sitio web proxy de confianza con un grupo global de proxies geogr&aacute;ficamente dirigidos y otras ventajas significativas, enumeramos regularmente varias t&eacute;cnicas que empoderan a los equipos para leer y alterar una p&aacute;gina cargada. Cuando discutimos la oportunidad de ordenar una prueba gratuita de proxy o comprar IPs residenciales, a menudo acentuamos la ventaja crucial de HtmlUnit: simplifica las interacciones con las p&aacute;ginas. En esta capacidad se asemeja a un navegador (no es una sorpresa, ya que funciona como un navegador sin cabeza). Este hecho implica capacidades como leer, completar formularios, hacer clics, y as&iacute; sucesivamente. En nuestro escenario, Dexodata aplica el potencial de esta biblioteca para leer informaci&oacute;n de URLs. S&iacute;guenos para aprender m&aacute;s.\u003C/p>\n\u003Cp style=\"line-height: 0.5;\">&nbsp;\u003C/p>\n\u003Ch3>\u003Ca name=\"anchor2\">\u003C/a>Requisitos previos de la gu&iacute;a para quienes compran IPs residenciales\u003C/h3>\n\u003Cp style=\"line-height: 0.1;\">&nbsp;\u003C/p>\n\u003Cp>Esta visi&oacute;n general espera que los lectores ya dominen Java hasta cierto punto. Maven se utiliza aqu&iacute; para gestionar paquetes en nuestro escenario. Adem&aacute;s de los conceptos b&aacute;sicos de Java, los lectores deben saber c&oacute;mo funcionan las p&aacute;ginas en la Web. Por lo tanto, la familiaridad con HTML es obligatoria. Tambi&eacute;n, la capacidad de seleccionar elementos, mediante XPath o selectores CSS, tambi&eacute;n puede considerarse vital. Recuerde: no todas las bibliotecas existentes son compatibles cuando se trata de XPath. Triste pero cierto.\u003C/p>\n\u003Cp style=\"line-height: 0.5;\">&nbsp;\u003C/p>\n\u003Ch3>\u003Ca name=\"anchor3\">\u003C/a>ABC de selectores CSS de un proveedor de proxies geogr&aacute;ficamente dirigidos\u003C/h3>\n\u003Cp style=\"line-height: 0.1;\">&nbsp;\u003C/p>\n\u003Cp>Haga una parada para refrescar su memoria sobre la esencia de los selectores CSS. Ellos abarcan:\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>#firstname\u003C/strong> &ndash; selecciona cada elemento cuyo id coincide con \"firstname\".\u003C/li>\n\u003Cli>\u003Cstrong>.blue\u003C/strong> &ndash; selecciona cada componente siempre que su clase incluya \"blue\".\u003C/li>\n\u003Cli>\u003Cstrong>p\u003C/strong> &ndash; elige cada etiqueta &lt;p&gt;.\u003C/li>\n\u003Cli>\u003Cstrong>div#firstname\u003C/strong> &ndash; responsable de seleccionar elementos div cuyo id coincide con \"firstname\".\u003C/li>\n\u003Cli>\u003Cstrong>p.link.new\u003C/strong> &ndash; preste atenci&oacute;n a la ausencia de un espacio vac&iacute;o. Selecciona &lt;p class=\"link new\"&gt;.\u003C/li>\n\u003Cli>\u003Cstrong>p.link .new\u003C/strong> &ndash; selecciona cada componente relacionado con la clase \"new\", que a su vez puede encontrarse dentro de &lt;p class=\"link\"&gt;.\u003C/li>\n\u003C/ul>\n\u003Cp style=\"line-height: 0.5;\">&nbsp;\u003C/p>\n\u003Ch3>\u003Ca name=\"anchor4\">\u003C/a>Gu&iacute;a paso a paso de un sitio web proxy de confianza\u003C/h3>\n\u003Cp style=\"line-height: 0.1;\">&nbsp;\u003C/p>\n\u003Cp>Dexodata, basado en la vasta experiencia t&eacute;cnica acumulada como un sitio web proxy de confianza, est&aacute; a punto de dise&ntilde;ar una soluci&oacute;n de an&aacute;lisis en Java mediante el uso efectivo de la biblioteca Maven en una gran combinaci&oacute;n con JSoup y HtmlUnit. De hecho, estas mismas bibliotecas nos permitir&aacute;n analizar y manipular f&aacute;cilmente el contenido HTML dentro de una aplicaci&oacute;n Java.\u003C/p>\n\u003Cp>Siga las instrucciones paso a paso proporcionadas a continuaci&oacute;n para configurar su proyecto para usar con proxies geogr&aacute;ficamente dirigidos. Por cierto, recordemos que con Dexodata las personas pueden no solo comprar IPs residenciales, sino que tambi&eacute;n los nuevos usuarios tienen derecho a una \u003Ca href=\"https://dashboard.dexodata.com/admin/register?lang=en\" target=\"_blank\" rel=\"noopener\">prueba gratuita de proxy\u003C/a>. Comencemos.\u003C/p>\n\u003Cp>1. La etapa inicial es obtener una biblioteca.\u003C/p>\n\u003Cp>Maven puede ayudar. Simplemente use un entorno Java disponible. All&iacute;, genere un proyecto Maven. En caso de que Maven sea irrelevante por alguna raz&oacute;n, visite \u003Ca href=\"https://jsoup.org/download\" target=\"_blank\" rel=\"noopener\">este espacio web\u003C/a>. All&iacute;, uno puede elegir descargas alternativas.&nbsp;\u003C/p>\n\u003Cp>Ok, complete la instalaci&oacute;n de Maven y genere un nuevo proyecto. Aqu&iacute; est&aacute; la \u003Ca href=\"https://maven.apache.org/install.html\" target=\"_blank\" rel=\"noopener\">gu&iacute;a de instalaci&oacute;n para explorar\u003C/a>.\u003C/p>\n\u003Cp>Una vez instalado, genere un nuevo proyecto Maven ejecutando este comando en la terminal:\u003C/p>\n\u003Cp>\u003Ccode>mvn archetype:generate -DgroupId=com.mycompany.parser -DartifactId=java-parser -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false\u003C/code>\u003C/p>\n\u003Cp>Al hacer esto a trav&eacute;s de este comando, se generar&aacute; una nueva carpeta de proyecto llamada 'java-parser.' Eso nos da todos los archivos necesarios de Maven junto con una estructura b&aacute;sica. Se ha dado el primer y importante paso.\u003C/p>\n\u003Cp>2. Ahora, se deben agregar dependencias al archivo pom.xml.&nbsp;\u003C/p>\n\u003Cp>No es un gran problema en absoluto. En el archivo pom.xml (que significa \"Modelo de Objeto del Proyecto\") se debe agregar un nuevo segmento. Su misi&oacute;n y tarea es trabajar con dependencias. Posteriormente, llega el momento de proporcionar una dependencia para JSoup.\u003C/p>\n\u003Col>\n\u003Cli>Para hacerlo, navegue hacia la carpeta 'java-parser'.\u003C/li>\n\u003Cli>All&iacute;, abra el archivo pom.xml.\u003C/li>\n\u003Cli>Incluya estas dependencias justo dentro de la etiqueta &lt;dependencies&gt;, como se destaca a continuaci&oacute;n:\u003C/li>\n\u003C/ol>\n\u003Cp>\u003Ccode>&lt;dependency&gt;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; &lt;groupId&gt;org.jsoup&lt;/groupId&gt;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; &lt;artifactId&gt;jsoup&lt;/artifactId&gt;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; &lt;version&gt;1.14.3&lt;/version&gt;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&lt;/dependency&gt;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&lt;dependency&gt;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; &lt;groupId&gt;net.sourceforge.htmlunit&lt;/groupId&gt;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; &lt;artifactId&gt;htmlunit&lt;/artifactId&gt;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; &lt;version&gt;2.56.0&lt;/version&gt;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&lt;/dependency&gt;\u003C/code>\u003C/p>\n\u003Cp>Guarde el archivo pom.xml. Dexodata, como proveedor de proxies geogr&aacute;ficamente dirigidos y mentor de codificaci&oacute;n, sigue con usted.&nbsp;\u003C/p>\n\u003Cp>3. Genere una nueva clase Java.\u003C/p>\n\u003Cp>En la carpeta src/main/java/com/mycompany/parser, genere un nuevo archivo Java llamado 'HtmlParser.java'. Este archivo acomodar&aacute; la implementaci&oacute;n de la clase principal y servir&aacute; como el punto de entrada para el futuro analizador.\u003C/p>\n\u003Cp>4. Importe las bibliotecas necesarias en 'HtmlParser.java'. Abra el archivo en un editor de texto de su elecci&oacute;n o IDE. Antes de comenzar a escribir cualquier c&oacute;digo, se deben importar las bibliotecas necesarias relacionadas con HtmlUnit y JSoup. Le permiten obtener y analizar contenido HTML f&aacute;cilmente. Agregue estas declaraciones de importaci&oacute;n al principio del archivo HtmlParser.java:\u003C/p>\n\u003Cp>\u003Ccode>import org.jsoup.Jsoup;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>import org.jsoup.nodes.Document;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>import com.gargoylesoftware.htmlunit.WebClient;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>import com.gargoylesoftware.htmlunit.html.HtmlPage;\u003C/code>\u003C/p>\n\u003Cp>Ya hemos hecho un progreso significativo, siga avanzando con nuestro sitio web proxy de confianza.\u003C/p>\n\u003Cp>5. Inicialice un objeto 'WebClient' y desactive JS junto con CSS.\u003C/p>\n\u003Cp>Dentro de la clase HtmlParser, implementar&aacute; m&eacute;todos para crear un objeto WebClient, obtener una p&aacute;gina HTML mediante HtmlUnit, analizar el contenido HTML a trav&eacute;s de JSoup, extraer datos espec&iacute;ficos (como t&iacute;tulo, descripci&oacute;n e imagen), y un m&eacute;todo principal para ejecutar estas tareas en secuencia.&nbsp;\u003C/p>\n\u003Cp>\u003Ccode>public class HtmlParser {\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; private static WebClient createWebClient() {\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; &nbsp; &nbsp; WebClient webClient = new WebClient();\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; &nbsp; &nbsp; webClient.getOptions().setJavaScriptEnabled(false);\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; &nbsp; &nbsp; webClient.getOptions().setCssEnabled(false);\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; &nbsp; &nbsp; return webClient;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; }\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>}\u003C/code>\u003C/p>\n\u003Cp>6. Genere un m&eacute;todo para obtener una p&aacute;gina HTML mediante HtmlUnit:\u003C/p>\n\u003Cp>\u003Ccode>public static HtmlPage fetchHtmlPage(String url) {\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; try (WebClient webClient = createWebClient()) {\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; &nbsp; &nbsp; return webClient.getPage(url);\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; } catch (Exception e) {\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace();\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; &nbsp; &nbsp; return null;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; }\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>}\u003C/code>\u003C/p>\n\u003Cp>7. Genere un m&eacute;todo para analizar el contenido HTML a trav&eacute;s de JSoup:\u003C/p>\n\u003Cp>\u003Ccode>public static Document parseHtmlContent(String htmlContent) {\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; return Jsoup.parse(htmlContent);\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>}\u003C/code>\u003C/p>\n\u003Cp>8. Siga trabajando en el HTML analizado:&nbsp;\u003C/p>\n\u003Cp>\u003Ccode>public static void extractInformation(Document document) {\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; // Extraer informaci&oacute;n del documento HTML analizado utilizando m&eacute;todos de JSoup\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; // por ejemplo, document.select(\"a[href]\"), document.select(\"img[src$=.png]\")\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; // Para m&aacute;s detalles, consulte la documentaci&oacute;n de JSoup: https://jsoup.org/cookbook/\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>}\u003C/code>\u003C/p>\n\u003Cp>Est&aacute; haciendo un buen trabajo, quedan unos pocos pasos por hacer.&nbsp;\u003C/p>\n\u003Cp>9. Cree un m&eacute;todo para obtener informaci&oacute;n del HTML analizado:\u003C/p>\n\u003Cp>\u003Ccode>public static void main(String[] args) {\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; String url = \"https://www.example.com\";\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; HtmlPage htmlPage = fetchHtmlPage(url);\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; if (htmlPage != null) {\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; &nbsp; &nbsp; String htmlContent = htmlPage.asXml();\u003C/code>\u003C/p>\n\u003Cp>&iexcl;Incre&iacute;ble! Como uno reconoce, no hay ciencia espacial en ello. Al menos, cuando su empresa trabaja con un sitio web proxy de confianza que proporciona proxies geogr&aacute;ficamente dirigidos en todo el mundo. Sabemos lo que hacemos.\u003C/p>\n\u003Cp>Los pasos anteriores se dedicaron a obtener el contenido HTML de una p&aacute;gina web mediante HtmlUnit y trabajar en &eacute;l y analizarlo mediante JSoup.&nbsp;Ahora, es el momento de centrarse en extraer datos espec&iacute;ficos, como el t&iacute;tulo, la descripci&oacute;n y la imagen de una p&aacute;gina de tienda en l&iacute;nea. Para que esto suceda en la realidad, primero debemos identificar las etiquetas HTML y los atributos asociados con tales componentes. Los usuarios pueden aplicar las herramientas de desarrollador de su navegador web para inspeccionar y \"escanear\" el c&oacute;digo fuente HTML y encontrar los componentes relevantes.\u003C/p>\n\u003Cp>10. Una vez que haya identificado los componentes HTML relevantes, puede utilizar las potentes capacidades de selecci&oacute;n de JSoup para obtener los datos.\u003C/p>\n\u003Cp>Por ejemplo, supongamos que el t&iacute;tulo est&aacute; dentro de una etiqueta &lt;h1&gt;, la descripci&oacute;n est&aacute; dentro de una etiqueta &lt;div&gt; con la clase \"product-description\", y la imagen est&aacute; dentro de una etiqueta &lt;img&gt; con la clase \"product-image\". Puede aplicar este fragmento de c&oacute;digo en su m&eacute;todo extractInformation() para obtener estos datos:\u003C/p>\n\u003Cp>\u003Ccode>public static void extractInformation(Document document) {\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; // Extraer el t&iacute;tulo\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; String title = document.select(\"h1\").text();\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; System.out.println(\"T&iacute;tulo: \" + title);\u003C/code>\u003C/p>\n\u003Cp>&nbsp;\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; // Extraer la descripci&oacute;n\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; String description = document.select(\"div.product-description\").text();\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; System.out.println(\"Descripci&oacute;n: \" + description);\u003C/code>\u003C/p>\n\u003Cp>&nbsp;\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; // Extraer la URL de la imagen\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; String imageUrl = document.select(\"img.product-image\").attr(\"src\");\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; System.out.println(\"URL de la imagen: \" + imageUrl);\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>}\u003C/code>\u003C/p>\n\u003Cp>11. Si el sitio se basa en JavaScript para cargar contenido din&aacute;micamente, un equipo podr&iacute;a necesitar habilitar el soporte de JS en HtmlUnit cambiando el m&eacute;todo createWebClient():\u003C/p>\n\u003Cp>\u003Ccode>private static WebClient createWebClient() {\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; WebClient webClient = new WebClient();\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; webClient.getOptions().setJavaScriptEnabled(true);\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; webClient.getOptions().setCssEnabled(false);\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; webClient.getOptions().setThrowExceptionOnScriptError(false);\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; webClient.waitForBackgroundJavaScript(5000); // Esperar a que JavaScript termine de cargar\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; return webClient;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>}\u003C/code>\u003C/p>\n\u003Cp>Tenga en cuenta que habilitar JavaScript puede aumentar el tiempo de carga junto con las posibilidades de encontrar errores o problemas de compatibilidad con los scripts del sitio. Este problema merece su atenci&oacute;n, Dexodata, como un sitio web proxy de confianza, conoce este hecho dif&iacute;cil.\u003C/p>\n\u003Cp>12. Habiendo obtenido con &eacute;xito los t&iacute;tulos, descripciones e im&aacute;genes de la tienda en l&iacute;nea, puede optar por almacenar esta informaci&oacute;n para un an&aacute;lisis o procesamiento posterior. Una t&eacute;cnica com&uacute;n es guardar la informaci&oacute;n recopilada en un archivo. Puede elegir varios formatos de archivo dependiendo de sus necesidades, como CSV, JSON o XML. En este escenario, Dexodata guardar&aacute; los datos en un archivo CSV. As&iacute; es como va.\u003C/p>\n\u003Cp>Genere un m&eacute;todo que escriba la informaci&oacute;n extra&iacute;da en un archivo CSV:\u003C/p>\n\u003Cp>\u003Ccode>import java.io.BufferedWriter;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>import java.io.FileWriter;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>import java.io.IOException;\u003C/code>\u003C/p>\n\u003Cp>&nbsp;\u003C/p>\n\u003Cp>\u003Ccode>public static void writeToCSV(String title, String description, String imageUrl, String outputFilePath) {\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; try (BufferedWriter writer = new BufferedWriter(new FileWriter(outputFilePath, true))) {\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; &nbsp; &nbsp; String csvLine = String.join(\",\", \"\\\"\" + title.replace(\"\\\"\", \"\\\"\\\"\") + \"\\\"\",\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \"\\\"\" + description.replace(\"\\\"\", \"\\\"\\\"\") + \"\\\"\",\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \"\\\"\" + imageUrl.replace(\"\\\"\", \"\\\"\\\"\") + \"\\\"\");\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; &nbsp; &nbsp; writer.write(csvLine);\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; &nbsp; &nbsp; writer.newLine();\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; } catch (IOException e) {\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace();\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; }\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>}\u003C/code>\u003C/p>\n\u003Cp>Esta t&eacute;cnica mantiene el t&iacute;tulo, la descripci&oacute;n, la URL de la imagen, as&iacute; como el outputFilePath como par&aacute;metros de entrada. As&iacute;, escribe la informaci&oacute;n como una l&iacute;nea CSV en el archivo especificado. Tambi&eacute;n maneja las comillas dobles dentro del texto reemplaz&aacute;ndolas con dos comillas dobles, como lo exige CSV.\u003C/p>\n\u003Cp>13. Actualice la t&eacute;cnica 'extractInformation()' para llamar al m&eacute;todo 'writeToCSV()' con la informaci&oacute;n obtenida:\u003C/p>\n\u003Cp>public static void extractInformation(Document document, String outputFilePath) {\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; // Extraer el t&iacute;tulo, la descripci&oacute;n y la URL de la imagen como antes\u003C/code>\u003C/p>\n\u003Cp>&nbsp;\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; // Escribir los datos extra&iacute;dos en el archivo CSV\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; writeToCSV(title, description, imageUrl, outputFilePath);\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>}\u003C/code>\u003C/p>\n\u003Cp>14. Modifique la t&eacute;cnica principal para incluir la ruta del archivo de salida y p&aacute;sela a la t&eacute;cnica 'extractInformation()':\u003C/p>\n\u003Cp>\u003Ccode>public static void main(String[] args) {\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; String url = \"https://www.example.com\";\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; String outputFilePath = \"output.csv\";\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; HtmlPage htmlPage = fetchHtmlPage(url);\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; if (htmlPage != null) {\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; &nbsp; &nbsp; String htmlContent = htmlPage.asXml();\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; &nbsp; &nbsp; Document document = parseHtmlContent(htmlContent);\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; &nbsp; &nbsp; extractInformation(document, outputFilePath);\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; }\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>}\u003C/code>\u003C/p>\n\u003Cp>Ahora, cuando se ejecute el analizador, obtendr&aacute; el t&iacute;tulo, la descripci&oacute;n y la URL de la imagen de la p&aacute;gina de la tienda en l&iacute;nea y escribir&aacute; los datos en el archivo CSV especificado. Est&aacute; en posici&oacute;n de personalizar a&uacute;n m&aacute;s el formato de salida del archivo, agregar encabezados o incluso escribir en otros formatos de archivo como JSON o XML dependiendo de sus requisitos espec&iacute;ficos.\u003C/p>\n\u003Cp>Pruebe su analizador ejecutando el m&eacute;todo principal con la URL de una p&aacute;gina de producto de una tienda en l&iacute;nea. Aseg&uacute;rese de ajustar los selectores JSoup de acuerdo con la estructura real de la p&aacute;gina del mundo real. Siempre puede actualizar este analizador para extraer informaci&oacute;n adicional, como precios de productos, especificaciones o rese&ntilde;as de usuarios seg&uacute;n los requisitos espec&iacute;ficos. Adem&aacute;s, las personas pueden implementar manejo de errores y escenarios de casos l&iacute;mite para hacer su analizador m&aacute;s robusto y vers&aacute;til.&nbsp;\u003C/p>\n\u003Cp>Con \u003Ca href=\"https://dexodata.com/en/retail\" target=\"_blank\" rel=\"noopener\">an&aacute;lisis de negocios de comercio electr&oacute;nico\u003C/a> como uno de los escenarios clave para los proxies geogr&aacute;ficamente dirigidos de Dexodata, sabemos lo genial que ser&iacute;a hacer las cosas con un analizador as&iacute;.\u003C/p>\n\u003Cp style=\"text-align: center;\">\u003Cimg src=\"https://blog.dexodata.com/storage/uploads/images/91/14-1-1-geo-targeted-proxies-using-java-for-data-scraping-pic-1032x491-ce99b683-926c-4331-abca-b1b877e15bf9.png\" alt=\"\" width=\"1032\" height=\"491\">\u003C/p>\n\u003Cp style=\"line-height: 0.5;\">&nbsp;\u003C/p>\n\u003Ch3>\u003Ca name=\"anchor5\">\u003C/a>Consulta\u003C/h3>\n\u003Cp style=\"line-height: 0.1;\">&nbsp;\u003C/p>\n\u003Cp>El objetivo principal de los programas de scraping web en Java es todo sobre consultar un documento HTML. Normalmente, es un proceso que consume tiempo, pero es inevitable.&nbsp;\u003C/p>\n\u003Cp>Con JSoup, existen m&uacute;ltiples formas de obtener los componentes de inter&eacute;s. Estas t&eacute;cnicas incluyen getElementByID o getElementsByTag. El flujo de consulta asociado con el DOM se simplifica a trav&eacute;s de ellos.&nbsp;\u003C/p>\n\u003Cp>Nuestro escenario permite getElementByID junto con getElementsByClass. Sin embargo, tenga en cuenta una distinci&oacute;n importante. Mientras que getElementById (preste atenci&oacute;n, es singular) est&aacute; destinado a devolver un solo objeto Element, en el caso de getElementsByClass (preste atenci&oacute;n, es plural, en contraste) se devolver&aacute; una lista de arreglos que contiene objetos Element.\u003C/p>\n\u003Cp>Convenientemente, JSoup presenta una clase Elements. Lo que hace es ampliar ArrayList&lt;Element&gt;. Como resultado, el c&oacute;digo se vuelve m&aacute;s limpio y se habilitan funcionalidades adicionales.\u003C/p>\n\u003Cp>Las l&iacute;neas de c&oacute;digo presentadas a continuaci&oacute;n aplican la t&eacute;cnica first() para obtener el primer componente de la ArrayList. Una vez que se completa, se aplica la t&eacute;cnica text() para obtener el contenido de texto.\u003C/p>\n\u003Cp>\u003Ccode>Element firstHeading = document.getElementsByClass(\"firstHeading\").first();\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>System.out.println(firstHeading.text());\u003C/code>\u003C/p>\n\u003Cp>Nuestros lectores pueden suponer que esas caracter&iacute;sticas son lo suficientemente eficientes. Al mismo tiempo, todav&iacute;a est&aacute;n limitadas a JSoup. En la mayor&iacute;a de las situaciones, se debe preferir la funci&oacute;n select. La &uacute;nica excepci&oacute;n que la hace totalmente in&uacute;til es cuando las personas realmente tienen la intenci&oacute;n de recorrer un documento hacia arriba. Si ese es su caso, aplique opciones como children(), child() y parent(). Simplemente \u003Ca href=\"https://jsoup.org/cookbook/extracting-data/dom-navigation\" target=\"_blank\" rel=\"noopener\">visite aqu&iacute;\u003C/a> para explorar una gama completa de t&eacute;cnicas factibles.\u003C/p>\n\u003Cp>La l&iacute;nea de c&oacute;digo muestra el uso de la t&eacute;cnica selectFirst() responsable de devolver la primera coincidencia:\u003C/p>\n\u003Cp>\u003Ccode>Element firstHeading= document.selectFirst(\".firstHeading\");&nbsp;\u003C/code>\u003C/p>\n\u003Cp>En nuestro escenario aqu&iacute;, se aplica la t&eacute;cnica selectFirst(). Si se deben elegir varios componentes, los usuarios tambi&eacute;n son libres de revelar el potencial de la t&eacute;cnica select(). De esta manera, el selector CSS se mantiene como un par&aacute;metro. Tan simple como ABC. Adem&aacute;s, una instancia de Elements est&aacute; sujeta a ser devuelta como una extensi&oacute;n del tipo ArrayList&lt;Element&gt;.\u003C/p>\n\u003Cp style=\"line-height: 0.5;\">&nbsp;\u003C/p>\n\u003Ch3>\u003Ca name=\"anchor6\">\u003C/a>Conclusi&oacute;n\u003C/h3>\n\u003Cp style=\"line-height: 0.1;\">&nbsp;\u003C/p>\n\u003Cp>Para sobrevivir y expandirse, pr&aacute;cticamente cada equipo recurre a \u003Ca href=\"https://dexodata.com/en/data-scraping\" target=\"_blank\" rel=\"noopener\">la recolecci&oacute;n de datos web y la extracci&oacute;n de datos\u003C/a> (preferiblemente, en contacto con un sitio web proxy avanzado y de confianza) para evaluar la informaci&oacute;n necesaria y superar a sus rivales. Estar en buenos t&eacute;rminos con los conceptos b&aacute;sicos de la recolecci&oacute;n de datos web y estar completamente preparado para construir scrapers basados en Java es valioso, ya que ayuda a la toma de decisiones m&aacute;s r&aacute;pidas y oportunas basadas en datos. Lo que ayuda tanto como eso, es un sitio web proxy de confianza que ejecuta un ecosistema de proxies geogr&aacute;ficamente dirigidos. Por ejemplo, en Dexodata los equipos pueden comprar IPs residenciales para analizadores o, si son nuevos en la plataforma, solicitar una prueba gratuita de proxy.\u003C/p>\u003C/body>\u003C/html>\n",[],[],1783936360840]