Guía para el raspado de datos web (scraping) usando Selenium

Esta es la única guía paso-a-paso que necesitará para comenzar a recopilar datos web de sitios objetivo y guardarlos como archivos CSV en menos de 10 minutos.
7 min read
How to use Selenium for web scraping

En este artículo discutiremos:

Puede consultar aquí el repositorio de GitHub para este artículo.

Selenium: ¿qué es y cómo se usa?

Selenium es un software de fuente abierta que integra una variedad de herramientas y bibliotecas que hacen posible actividades de automatización de navegadores, entre ellas:

  • Acciones/recuperación de elementos con base en páginas web (p.ej. cerrar, atrás, get_cookie, get_screenshot_as_png, get_window_size)
  • Pruebas de sitio
  • Gestión de avisos de alerta y cookies (agregar/eliminar)
  • Envío de elementos de formulario
  • Recopilación de datos/Raspado de datos web (scraping)

Es compatible con la mayoría de los navegadores incluyendo Firefox, Chrome, Safari e Internet Browser. Se puede utilizar para escribir pruebas en una variedad de lenguajes de programación como Python, Node.js, C#, JavaScript y PHP.
Para su conveniencia, he incluido una liga a la biblioteca oficial de documentación Selenium 4.1.5..

Puppeteer vs. Selenium

Para quienes contemplan y debaten acerca de Puppeteer vs. Selenium, diré que Puppeteer podría servirles mejor si planean enfocarse principalmente en JavaScript y Chrome. Por su parte, Selenium podría ser una mejor opción si les interesa trabajar con una diversidad de navegadores y probar aplicaciones para navegador y/o realizar recopilación de datos web.

Una guía paso-a-paso para raspado de datos usando Selenium

Paso uno: instalar Selenium

Para aquellos de ustedes que tienen PIP (Package Installer for Python) en sus computadoras, todo lo que necesitan hacer es abrirlo e ingresar:

pip install -U selenium

De otra manera, pueden descargar PyPI, descomprimirlo y ejecutarlo:

python setup.py install

Por favor, consideren que necesitarán un driver para que Selenium haga interfaz con su navegador seleccionado. Aquí incluimos algunos links a algunos de los drivers más populares, para su conveniencia:

Usemos Firefox como ejemplo de navegador. Puede lograrlo abriendo Firefox y después una página web (por ejemplo, Yahoo), inicie una búsqueda de “seleniumhq” y después cierre el navegador. En código, debería verse así:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

browser = webdriver.Firefox()

browser.get('http://www.yahoo.com')
assert 'Yahoo' in browser.title

elem = browser.find_element(By.NAME, 'p')  # Find the search box
elem.send_keys('seleniumhq' + Keys.RETURN)

browser.quit()

Paso dos: importación de paquetes de soporte

Selenium no se usa de manera aislada, sino en conjunto con otros programas, incluyendo −por ejemplo− Pandas (una herramienta de fuente abierta y uso sencillo para análisis de datos). A continuación, se muestra lo que debería ingresarse para lograrlo:

from selenium import webdriver
import time
import pandas as pd 

Paso tres: determinación de variables

En este paso, estableceremos nuestra carpeta de destino, consulta de búsqueda (search_query) y sitio objetivo. En este ejemplo, nuestro fin será el mapeo de diferentes oportunidades laborales como las muestran compañías competidoras en LinkedIn. Lo que se ingresa debe verse así:

FILE_PATH_FOLDER = 'F:....Competitive_Analysis'
search_query = 'https://www.linkedin.com/q-chief-financial-officer-jobs.html'
driver = webdriver.Chrome(executable_path='C:/.../chromedriver_win32/chromedriver.exe')
job_details = []

Paso cuatro: inspección de etiqueta HTML

Por lo general, los sitios HTML tienen un identificador único para cada etiqueta asociada con la información que se muestra en cualquier sitio objetivo. Aquí, la técnica es aprovechar esta propiedad de sitio HTML para recopilar en el sitio objetivo en cuestión. Puede lograr esto:

  • Haciendo clic derecho sobre cualquier sitio en la página y seleccionando “inspeccionar”.
  • Después, haciendo clic en la flecha que aparece en la parte superior izquierda o presionando las teclas Ctrl+Shift+C para inspeccionar un elemento en específico y obtener la etiqueta HTML deseada.
    Así es como se ve:

Se visualizaría de la manera que se muestra a continuación:

driver.get(search_query)
time.sleep(5)
job_list = driver.find_elements_by_xpath("//div[@data-tn-component='organicJob']")

Paso cinco: extracción de puntos de datos específicos

Haremos una extracción de puntos de datos objetivo utilizando el atributo “find_elements_by_xpath” en el driver web de Selenium y −tras haber recopilado los datos objetivo− desocupando el driver y cerrando el navegador.

Nos dirigiremos a los puntos de datos de la siguiente manera:

  • Título de la vacante
  • Compañía
  • Ubicación del empleo
  • Descripción del empleo
  • Fecha en que se cargó la vacante de empleo

Se visualizaría de la manera que se muestra a continuación:

for each_job in job_list:
    # Getting job info
    job_title = each_job.find_elements_by_xpath(".//h2[@class='title']/a")[0]
    job_company = each_job.find_elements_by_xpath(".//span[@class='company']")[0]
    job_location = each_job.find_elements_by_xpath(".//span[@class='location accessible-contrast-color-location']")[0]
    job_summary = each_job.find_elements_by_xpath(".//div[@class='summary']")[0]
    job_publish_date = each_job.find_elements_by_xpath(".//span[@class='date ']")[0]
    # Saving job info 
    job_info = [job_title.text, job_company.text, job_location.text, job_summary.text, job_publish_date.text]
 # Saving into job_details
    job_details.append(job_info)
driver.quit()

Por favor, considerar que el objetivo puede cambiar estos selectores; por tanto, las personas encargadas de la labor deben confirmar que los selectores en cuestión sean los correctos, no simplemente asumir que lo son.

Paso seis: almacenamiento de datos en preparación de su salida 

En este punto, agregará columnas al marco de datos y usará el atributo “to_csv” para almacenar todos los datos obtenidos en formato CSV, como se muestra a continuación:

job_details_df = pd.DataFrame(job_details)
job_details_df.columns = ['title', 'company', 'location', 'summary', 'publish_date']
job_details_df.to_csv('job_details.csv', index=False)

Su archivo CSV deseado se descargará en la ubicación a continuación: FILE_PATH_FOLDER

Eso es todo, acaba de completar, con éxito, su primer tarea de raspado de datos web (scraping) con Selenium.

Integración de proxies con Selenium

La integración de proxies con Selenium le puede ayudar a:

  • Recopilar datos en una variedad de ubicaciones geográficas.
  • Recopilar datos a escala sin el riesgo de que le bloqueen (es decir, limitaciones de velocidad en IPs que envían “demasiadas” peticiones concurrentes/consecutivas de datos). En este contexto, podría también desear averiguar acerca de servicios web dedicados para desbloqueo.
  • Brindarle empoderamiento para recopilar datos desde la perspectiva de una IP de un usuario verdadero, para que los sitios objetivo potencialmente sospechosos no le entreguen información errónea.

Es posible lograr la integración de proxy con Selenium de la siguiente manera:

  1. Acudiendo a su Tablero de Control de Bright Data y haciendo clic en “Crear una Zona”.
  2. Seleccionando “Tipo de red” y después “Guardar”.
  3. Después, en Selenium, se ingresa el puerto “Proxy IP:Port” en la función “setProxy”, por ejemplo: zproxy.lum-superproxy.io:22225 de ambos (HTTP y HTTPS).
  4. En “sendKeys”, ingresar su ID de cuenta de Bright Data y nombre de zona de proxy:lum-customer-CUSTOMER-zone-YOURZONE y su contraseña de Zona ubicada en la configuración de Zona.