Web Scraping con Selenium Python

Contenidos

Introducción: –

El aprendizaje automático está impulsando las maravillas tecnológicas actuales, como los automóviles sin conductor, los vuelos espaciales, la imagen y el acreditación de voz. A pesar de esto, un profesional de la ciencia de datos necesitaría un gran volumen de datos para construir un modelo de aprendizaje automático robusto y confiable para tales problemas comerciales.

selenio de raspado web

La minería de datos o la recopilación de datos es un paso muy primitivo en el ciclo de vida de la ciencia de datos. Según los requerimientos comerciales, es factible que tenga que recabar datos de fuentes como servidores, registros, bases de datos, API, repositorios en línea o web de SAP.

Las herramientas para raspado web como Selenium pueden raspar un gran volumen de datos, como texto e imágenes, en un tiempo relativamente corto.

Tabla de contenido: –

  1. ¿Qué es el web scraping?
  2. Por qué Web Scraping
  3. Cómo es útil Web Scraping
  4. ¿Qué es el selenio?
    1. Configuración y herramientas
  5. Implementación del desguace web de imágenes usando Selenium Python
  6. Navegador Chrome sin cabeza
  7. Poniéndolo por completo
  8. Notas finales

¿Qué es Web Scraping? : –

Web Scrapping, además llamado «rastreo» o «spidering» es la técnica para recabar datos automáticamente de una fuente en línea, de forma general de un portal web. Aunque el Web Scrapping es una manera fácil de obtener un gran volumen de datos en un período de tiempo relativamente corto, agrega estrés al servidor donde se aloja la fuente.

Esta es además una de las principales razones por las que muchos sitios web no posibilitan raspar todo en su portal web. A pesar de esto, siempre que no interrumpa la función principal de la fuente en línea, es bastante aceptable.

¿Por qué Web Scraping? –

Existe un gran volumen de datos en la web que las personas pueden usar para satisfacer las necesidades comerciales. Por eso, se necesita alguna herramienta o técnica para recabar esta información de la web. Y ahí es donde entra en juego el concepto de Web-Scrapping.

¿Qué utilidad tiene el Web Scraping? –

El web scraping puede ayudarnos a extraer una enorme cantidad de datos sobre clientes, productos, personas, mercados de valores, etc.

Se pueden usar los datos recopilados de un portal web, como un portal de comercio electrónico, portales de empleo, canales de redes sociales para comprender los patrones de compra de los clientes, el comportamiento de deserción de los trabajadores y los sentimientos de los clientes, y la lista continúa.

Las bibliotecas o marcos más populares que se usan en Python para Web – Scrapping son BeautifulSoup, Scrappy y Selenium.

En este post, hablaremos sobre el desguace web usando Selenium en Python. Y la cereza en la parte de arriba veremos cómo podemos recabar imágenes de la web que puede usar para crear datos de trenes para su proyecto de aprendizaje profundo.

¿Qué es el selenio?

Selenio es una herramienta de automatización open source basada en la web. El selenio se utiliza principalmente para pruebas en la industria, pero además se puede utilizar para raspar la tela. Usaremos el navegador Chrome pero puedes probarlo en cualquier navegador, es casi lo mismo.

Fuente de imagen

Ahora veamos cómo utilizar selenio para Web Scraping.

Configuración y herramientas: –

  1. Instalación:
    • Instalar selenio usando pip
      pip install selenium
  2. Descargar el controlador de Chrome:
    Para descargar controladores web, puede seleccionar cualquiera de los siguientes métodos:
    1. Puede descargar de forma directa el controlador de Chrome desde el siguiente link:
      https://chromedriver.chromium.org/downloads
    2. O puede descargarlo de forma directa usando la próxima línea de código:controlador = webdriver.Chrome (ChromeDriverManager (). install ())

Puede hallar documentación completa sobre el selenio aquí. La documentación se explica por sí misma, por lo tanto asegúrese de leerla para aprovechar el selenio con Python.

Los siguientes métodos nos ayudarán a hallar ítems en una página web (estos métodos devolverán una lista):

  • find_elements_by_name
  • find_elements_by_xpath
  • find_elements_by_link_text
  • find_elements_by_partial_link_text
  • find_elements_by_tag_name
  • find_elements_by_class_name
  • find_elements_by_css_selector

Ahora, escriba un código Python para extraer imágenes de la web.

Implementación del desguace web de imágenes usando Selenium Python: –

Paso 1: – Importar bibliotecas

import os
import selenium
from selenium import webdriver
import time
from PIL import Image
import io
import requests
from webdriver_manager.chrome import ChromeDriverManager
from selenium.common.exceptions import ElementClickInterceptedException

Paso 2: – Instalar controlador

#Install Driver
driver = webdriver.Chrome(ChromeDriverManager().install())

Paso 3: – Especificar la URL de búsqueda

#Specify Search URL 
search_url=“https://www.google.com/search?q={q}&tbm=isch&tbs=sur%3Afc&hl=en&ved=0CAIQpwVqFwoTCKCa1c6s4-oCFQAAAAAdAAAAABAC&biw=1251&bih=568" 

driver.get(search_url.format(q='Car'))

He usado esta URL específica para que no se meta en problemas por utilizar imágenes con derechos de autor o con licencia. Caso contrario, puede utilizar https://google.com además como URL de búsqueda.

Después buscamos Coche en nuestra URL de búsqueda. Pegue el link en la función driver.get («Su link aquí») y ejecute la celda. Esto abrirá una nueva ventana del navegador para ese link.

Paso 4: – Desplácese hasta el final de la página.

#Scroll to the end of the page
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(5)#sleep_between_interactions

Esta línea de código nos ayudaría a llegar al final de la página. Y después le damos un tiempo de reposo de 5 segundos para que no tengamos problemas, donde estamos tratando de leer ítems de la página, que aún no está cargada.

Paso 5: – Localice las imágenes que se van a raspar de la página.

#Locate the images to be scraped from the current page 
imgResults = driver.find_elements_by_xpath("//img[contains(@class,'Q4LuWd')]")
 totalResults=len(imgResults)

Ahora buscaremos todos los links de imágenes presentes en esa página en particular. Crearemos una «lista» para guardar esos links. Entonces, para hacer eso, vaya a la ventana del navegador, haga clic derecho en la página y seleccione ‘inspeccionar elemento’ o habilite las herramientas de desarrollo usando Ctrl + Shift + I.

Ahora identifique cualquier atributo como clase, id, etc. Lo cual es común en todas estas imágenes.

En nuestro caso, class = ”’Q4LuWd” es común en todas estas imágenes.

Paso 6: – Extrae el link respectivo de cada imagen

Como podemos, las imágenes que se muestran en la página siguen siendo las miniaturas, no la imagen original. Entonces, para descargar cada imagen, debemos hacer un clic en cada miniatura y extraer la información relevante respectivo a esa imagen.

#Click on each Image to extract its corresponding link to download

img_urls = set()
for i in  range(0,len(imgResults)):
    img=imgResults[i]
    try:
        img.click()
        time.sleep(2)
        actual_images = driver.find_elements_by_css_selector('img.n3VNCb')
        for actual_image in actual_images:
            if actual_image.get_attribute('src') and 'https' in actual_image.get_attribute('src'):
                img_urls.add(actual_image.get_attribute('src'))
    except ElementClickInterceptedException or ElementNotInteractableException as err:
        print(err)

Entonces, en el fragmento de código anterior, estamos realizando las siguientes tareas:

  • Repita cada miniatura y después haga clic en ella.
  • Haz que nuestro navegador duerma durante 2 segundos (: P).
  • Busque la etiqueta HTML única respectivo a esa imagen para ubicarla en la página
  • Aún obtenemos más de un resultado para una imagen en particular. Pero a todos nos interesa el link para descargar esa imagen.
  • Entonces, iteramos por medio de cada resultado para esa imagen y extraemos el atributo ‘src’ de la misma y después vemos si «https» está presente en el ‘src’ o no. Dado que regularmente el link web comienza con ‘https’.

Paso 7: – Descargue y guarde cada imagen en el directorio de destino

os.chdir('C:/Qurantine/Blog/WebScrapping/Dataset1')
baseDir=os.getcwd()
for i, dirección url in enumerate(img_urls):
    file_name = f"{i:150}.jpg"    
    try:
        image_content = requests.get(dirección url).content

except Exception as e:
        print(f"ERROR - COULD NOT DOWNLOAD {dirección url} - {e}")

try:
        image_file = io.BytesIO(image_content)
        image = Image.open(image_file).convert('RGB')
        
        file_path = os.path.join(baseDir, file_name)
        
        with open(file_path, 'wb') as f:
            image.save(f, "JPEG", quality=85)
        print(f"SAVED - {dirección url} - AT: {file_path}")
    except Exception as e:
        print(f"ERROR - COULD NOT SAVE {dirección url} - {e}")

Ahora en resumen has extraído la imagen para tu proyecto 😀

Nota: – Una vez que haya escrito el código adecuado, el navegador no es esencial, puede recabar datos sin navegador, lo que se denomina ventana del navegador sin cabeza, por eso, reemplace el siguiente código por el anterior.

Navegador Chrome sin cabeza

#Headless chrome browser
from selenium import webdriver 
opts = webdriver.ChromeOptions()
opts.headless =True
driver =webdriver.Chrome(ChromeDriverManager().install())

Para este caso, el navegador no se ejecutará en segundo plano, lo que es muy útil al poner en práctica una solución en producción.

Pongamos todo este código en una función para hacerlo más organizable e implementemos la misma idea para descargar 100 imágenes para cada categoría (a modo de ejemplo, Autos, Caballos).

Y esta vez escribiríamos nuestro código usando la idea del cromo sin cabeza.

Poniendolo todo junto:

Paso 1: importar todas las bibliotecas indispensables

import os
import selenium
from selenium import webdriver
import time
from PIL import Image
import io
import requests
from webdriver_manager.chrome import ChromeDriverManager

os.chdir('C:/Qurantine/Blog/WebScrapping')

Paso 2: instale el controlador de Chrome

#Install driver
opts=webdriver.ChromeOptions()
opts.headless=True

driver = webdriver.Chrome(ChromeDriverManager().install() ,options=opts)

En este paso, instalamos un controlador de Chrome y usamos un navegador sin cabeza para raspar la web.

Paso 3: especifique la URL de búsqueda

search_url = "https://www.google.com/search?q={q}&tbm=isch&tbs=sur%3Afc&hl=en&ved=0CAIQpwVqFwoTCKCa1c6s4-oCFQAAAAAdAAAAABAC&biw=1251&bih=568"
driver.get(search_url.format(q='Car'))

He utilizado esta URL específica para extraer imágenes sin derechos de autor.

Paso 4: escribe una función para llevar el cursor al final de la página

def scroll_to_end(driver):
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(5)#sleep_between_interactions

Este fragmento de código se desplazará hacia abajo en la página.

Paso 5. Escribe una función para obtener la URL de cada imagen.

#no license issues

def getImageUrls(name,totalImgs,driver):
    
    search_url = "https://www.google.com/search?q={q}&tbm=isch&tbs=sur%3Afc&hl=en&ved=0CAIQpwVqFwoTCKCa1c6s4-oCFQAAAAAdAAAAABAC&biw=1251&bih=568"
    driver.get(search_url.format(q=name))
    img_urls = set()
    img_count = 0
    results_start = 0  
    
    while(img_count<totalImgs): #Extract actual images now
        
        scroll_to_end(driver)
        
        thumbnail_results = driver.find_elements_by_xpath("//img[contains(@class,'Q4LuWd')]")
        totalResults=len(thumbnail_results)
        print(f"Found: {totalResults} search results. Extracting links from{results_start}:{totalResults}")
        
        for img in thumbnail_results[results_start:totalResults]:
            
            img.click()
            time.sleep(2)
            actual_images = driver.find_elements_by_css_selector('img.n3VNCb')
            for actual_image in actual_images:
                if actual_image.get_attribute('src') and 'https' in actual_image.get_attribute('src'):
                    img_urls.add(actual_image.get_attribute('src'))
            
            img_count=len(img_urls)
            
            if img_count >= totalImgs:
                print(f"Found: {img_count} image links")
                break
            else:
                print("Found:", img_count, "looking for more image links ...")                
                load_more_button = driver.find_element_by_css_selector(".mye4qd")
                driver.execute_script("document.querySelector('.mye4qd').click();")
                results_start = len(thumbnail_results)
    return img_urls

Esta función devolvería una lista de URL para cada categoría (a modo de ejemplo, coches, caballos, etc.)

Paso 6: escribe una función para descargar cada imagen

def downloadImages(folder_path,file_name,dirección url):
    try:
        image_content = requests.get(dirección url).content
except Exception as e:
        print(f"ERROR - COULD NOT DOWNLOAD {dirección url} - {e}")
try:
        image_file = io.BytesIO(image_content)
        image = Image.open(image_file).convert('RGB')
       
        file_path = os.path.join(folder_path, file_name)
        
        with open(file_path, 'wb') as f:
            image.save(f, "JPEG", quality=85)
        print(f"SAVED - {dirección url} - AT: {file_path}")
    except Exception as e:
        print(f"ERROR - COULD NOT SAVE {dirección url} - {e}")

Este fragmento de código descargará la imagen de cada URL.

Paso 7: – Escriba una función para guardar cada imagen en el directorio de destino

def saveInDestFolder(searchNames,destDir,totalImgs,driver):
    for name in list(searchNames):
        path=os.path.join(destDir,name)
        if not os.path.isdir(path):
            os.mkdir(path)
        print('Current Path',path)
        totalLinks=getImageUrls(name,totalImgs,driver)
        print('totalLinks',totalLinks)

if totalLinks is None:
            print('images not found for :',name)
            continue
        else:
            for i, link in enumerate(totalLinks):
                file_name = f"{i:150}.jpg"
                downloadImages(path,file_name,link)
            
searchNames=['Car','horses'] 
destDir=f'./Dataset2/'
totalImgs=5

saveInDestFolder(searchNames,destDir,totalImgs,driver)

Este fragmento de código guardará cada imagen en el directorio de destino.

Notas finales

He intentado mi parte para explicar Web Scraping usando Selenium con Python de la manera más simple factible. No dude en comentar sus consultas. Estaré más que feliz de responderles.

Puede clonar mi repositorio de Github para descargar todo el código y los datos, haga clic aquí!!

Sobre el Autor

Autor

Praveen Kumar Anwla

He trabajado como científico de datos con firmas de auditoría sustentadas en productos y Big 4 durante casi 5 años. He estado trabajando en varios marcos de PNL, aprendizaje automático y aprendizaje profundo de vanguardia para solucionar problemas comerciales. Por favor siéntete libre de revisar mi blog personal, donde cubro temas desde el aprendizaje automático: inteligencia artificial, chatbots hasta herramientas de visualización (Tableau, QlikView, etc.) y varias plataformas en la nube como Azure, IBM y la nube de AWS.

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.