Cómo hacer un rastreador web con selenio
El rastreo web es extremadamente útil para automatizar ciertas tareas que se realizan de forma rutinaria en los sitios web. Puede escribir un rastreador para interactuar con un sitio web como lo haría un humano.
En un artículo anterior Cómo crear un rastreador web básico para extraer información de un sitio web Cómo construir un rastreador web básico para extraer información de un sitio web ¿Alguna vez ha querido capturar información de un sitio web? Puede escribir un rastreador para navegar por el sitio web y extraer solo lo que necesita. Lea más, cubrimos los conceptos básicos de escribir un webcrawler usando el módulo python, scrapy. La limitación de este enfoque es que el rastreador no admite javascript. No funcionará correctamente con aquellos sitios web que hacen un uso intensivo de javascript para administrar la interfaz de usuario. Para tales situaciones, puede escribir un rastreador que use Google Chrome y, por lo tanto, puede manejar javascript como un navegador Chrome normal dirigido por el usuario..
Automatizar Google Chrome implica el uso de una herramienta llamada Selenio. Es un componente de software que se encuentra entre su programa y el navegador, y le ayuda a conducir el navegador a través de su programa. En este artículo, lo llevamos a través del proceso completo de automatización de Google Chrome. Los pasos generalmente incluyen:
- Configuración de selenio
- Uso de Google Chrome Inspector para identificar secciones de la página web
- Escribiendo un programa java para automatizar Google Chrome.
A los efectos del artículo, investiguemos cómo leer Google Mail desde java. Si bien Google proporciona una API (Interfaz de programación de aplicaciones) para leer el correo, en este artículo usamos Selenium para interactuar con Google Mail para demostrar el proceso. Google Mail hace un uso intensivo de javascript y, por lo tanto, es un buen candidato para aprender Selenium..
Configuración de selenio
Controlador web
Como se explicó anteriormente, Selenium consiste en un componente de software que se ejecuta como un proceso separado y realiza acciones en nombre del programa java. Este componente se llama Controlador web y debe ser descargado en su computadora.
Haga clic aquí para ir al sitio de descarga de Selenium, haga clic en la última versión y descargue el archivo apropiado para el sistema operativo de su computadora (Windows, Linux o MacOS). Es un archivo ZIP que contiene chromedriver.exe. Extraerlo en un lugar adecuado, como C: \ WebDrivers \ chromedriver.exe. Usaremos esta ubicación más adelante en el programa java..
Módulos Java
El siguiente paso es configurar los módulos java necesarios para usar Selenium. Suponiendo que está utilizando Maven para compilar el programa java, agregue la siguiente dependencia a su POM.xml.
org.seleniumhq.selenium selenio-java 3.8.1
Cuando ejecute el proceso de compilación, todos los módulos necesarios deben descargarse y configurarse en su computadora.
Los primeros pasos del selenio
Comencemos con el selenio. El primer paso es crear un ChromeDriver ejemplo:
Controlador WebDriver = nuevo ChromeDriver ();
Eso debería abrir una ventana de Google Chrome. Naveguemos a la página de búsqueda de Google..
driver.get ("http://www.google.com");
Obtenga una referencia al elemento de entrada de texto para que podamos realizar una búsqueda. El elemento de entrada de texto tiene el nombre q. Localizamos los elementos HTML en la página utilizando el método. WebDriver.findElement ().
Elemento WebElement = driver.findElement (By.name ("q"));
Puedes enviar texto a cualquier elemento utilizando el método. sendKeys (). Enviemos un término de búsqueda y finalicemos con una nueva línea para que la búsqueda comience de inmediato..
element.sendKeys ("terminador \ n");
Ahora que la búsqueda está en curso, debemos esperar a la página de resultados. Podemos hacer eso de la siguiente manera:
nuevo WebDriverWait (driver, 10) .until (d -> d.getTitle (). toLowerCase (). startsWith ("terminator"));
Básicamente, este código le dice a Selenium que espere 10 segundos y regrese cuando el título de la página comienza con terminador. Usamos una función lambda para especificar la condición a esperar.
Ahora podemos obtener el título de la página..
System.out.println ("Title:" + driver.getTitle ());
Una vez que haya terminado con la sesión, la ventana del navegador se puede cerrar con:
driver.quit ();
Y eso, amigos, es una sesión de navegador simple controlada mediante java a través de selenio. Parece bastante simple, pero le permite programar muchas cosas que normalmente tendría que hacer a mano.
Usando el inspector de Google Chrome
Google Chrome Inspector resuelve los problemas del sitio web con Chrome Developer Tools o Firebug resuelve los problemas del sitio web con Chrome Developer Tools o Firebug Si ha estado siguiendo mis tutoriales de jQuery hasta ahora, es posible que ya haya encontrado algunos problemas de código y no sepa cómo solucionar ellos. Cuando se enfrenta con un bit de código no funcional, es muy ... Leer más es una herramienta invaluable para identificar elementos que se usarán con Selenium. Nos permite apuntar el elemento exacto de java para extraer información, así como una acción interactiva como hacer clic en un botón. Aquí hay una introducción a cómo usar el Inspector..
Abra Google Chrome y navegue a una página, diga la página de IMDb de Justice League (2017).
Encontremos el elemento que queremos apuntar, digamos el resumen de la película. Haga clic derecho en el resumen y seleccione “Inspeccionar” desde el menú emergente.
Desde el “Elementos” pestaña, podemos ver que el texto de resumen es un div con una clase de resumen_texto.
Usando CSS o XPath para la selección
Selenium admite la selección de elementos de la página usando CSS. (CSS dialecto compatible es CSS2). Por ejemplo, para seleccionar el texto de resumen de la página de IMDb anterior, escribiríamos:
WebElement summaryEl = driver.findElement (By.cssSelector ("div.summary_text"));
También puede usar XPath para seleccionar elementos de una manera muy similar (vaya aquí para ver las especificaciones). Nuevamente, para seleccionar el texto de resumen, haríamos:
WebElement summaryEl = driver.findElement (By.xpath ("// div [@ class = 'summary_text']"));
XPath y CSS tienen capacidades similares para que pueda usar lo que le resulte más cómodo..
Leyendo Google Mail desde Java
Veamos ahora un ejemplo más complejo: obtener Google Mail.
Inicia el Chrome Driver, navega a gmail.com y espera hasta que se cargue la página..
Controlador WebDriver = nuevo ChromeDriver (); driver.get ("https://gmail.com"); nuevo WebDriverWait (driver, 10) .until (d -> d.getTitle (). toLowerCase (). startsWith ("gmail"));
A continuación, busque el campo de correo electrónico (se nombra con el ID identifierId) e ingrese la dirección de correo electrónico. Haga clic en el Siguiente botón y espere a que se cargue la página de contraseña.
/ * Escriba username / email * / driver.findElement (By.cssSelector ("# identifierId")). SendKeys (email); driver.findElement (By.cssSelector (". RveJvd")). click (); nuevo WebDriverWait (controlador, 10) .hasta que (d ->! d.findElements (By.xpath ("// div [@ id = 'password']")). isEmpty ());
Ahora, ingresamos la contraseña, hacemos clic en el Siguiente botón de nuevo y esperar a que se cargue la página de Gmail.
/ * Escriba la contraseña * / driver .findElement (By.xpath ("// div [@ id = 'password'] // input [@ type = 'password']")) .sendKeys (password); driver.findElement (By.cssSelector (". RveJvd")). click (); nuevo WebDriverWait (controlador, 10) .hasta que (d ->! d.findElements (By.xpath ("// div [@ class = 'Cp']")). isEmpty ());
Busca la lista de filas de correo electrónico y recorre cada entrada.
Lista rows = driver .findElements (By.xpath ("// div [@ class = 'Cp'] // table / tbody / tr")); para (WebElement tr: rows)
Para cada entrada, busca el Desde campo. Tenga en cuenta que algunas entradas de De podrían tener múltiples elementos dependiendo del número de personas en la conversación.
/ * From Element * / System.out.println ("From:"); para (WebElement e: tr .findElements (By.xpath (".// div [@ class = 'yW'] / *"))) System.out.println ("" + e.getAttribute ("email") + "," + e.getAttribute ("name") + "," + e.getText ());
Ahora, trae el tema.
/ * Subject * / System.out.println ("Sub:" + tr.findElement (By.xpath (".// div [@ class = 'y6']")). GetText ());
Y la fecha y hora del mensaje..
/ * Fecha / Hora * / WebElement dt = tr.findElement (By.xpath ("./ td [8] / *")); System.out.println ("Date:" + dt.getAttribute ("title") + "," + dt.getText ());
Aquí está el número total de filas de correo electrónico en la página.
System.out.println (rows.size () + "mails.");
Y finalmente, hemos terminado, así que abandonamos el navegador..
driver.quit ();
Para resumir, puede usar Selenium con Google Chrome para rastrear aquellos sitios web que usan javascript en gran medida. Y con el inspector de Google Chrome, es bastante fácil elaborar el CSS o XPath requerido para extraer o interactuar con un elemento.
¿Tienes algún proyecto que se beneficie con el uso de Selenium? ¿Y a qué problemas te enfrentas? Por favor describa en los comentarios a continuación.
Explorar más sobre: API, Desarrollo Web.