Introducci贸n al raspado web con Python

    Introducci贸n

    El web-scraping es una t茅cnica importante, que se emplea con frecuencia en muchos contextos diferentes, especialmente en ciencia de datos y miner铆a de datos. Python se considera en gran medida el lenguaje de referencia para el raspado web, la raz贸n es la naturaleza de Python que incluye bater铆as. Con Python, puede crear un script de raspado simple en aproximadamente 15 minutos y en menos de 100 l铆neas de c贸digo. Entonces, independientemente del uso, el raspado web es una habilidad que todo programador de Python debe tener en su haber.

    Antes de empezar a ponernos manos a la obra, debemos dar un paso atr谩s y considerar qu茅 es el web-scraping, cu谩ndo debemos usarlo y cu谩ndo evitarlo.

    Como ya sabe, el web-scraping es una t茅cnica empleada para extraer autom谩ticamente datos de sitios web. Lo que es importante entender es que el web-scraping es una t茅cnica algo burda para extraer datos de varias fuentes, generalmente p谩ginas web. Si los desarrolladores de un sitio web son lo suficientemente generosos como para proporcionar una API para extraer datos, esa ser铆a una forma mucho m谩s estable y s贸lida de acceder a los datos. Entonces, como regla general, si un sitio web proporciona una API para recuperar sus datos mediante programaci贸n, 煤sela. Si no hay una API disponible, solo entonces use web-scraping.

    Aseg煤rese de cumplir tambi茅n con las reglas o restricciones relacionadas con el web scraping para cada sitio web que utilice, ya que algunos no lo permiten. Con eso claro, saltemos directamente al tutorial.

    Para este tutorial, vamos a raspar http://quotes.toscrape.com/, un sitio que enumera citas famosas de autores de renombre.

    El canal de raspado web

    Podemos entender el web-scraping como una canalizaci贸n que contiene 3 componentes:

    • Descargando: Descarga de la p谩gina web HTML
    • Analizando: Analizar HTML y recuperar datos que nos interesan
    • Almacenamiento: Almacenar los datos recuperados en nuestra m谩quina local en un formato espec铆fico

    Descargando HTML

    Parece l贸gico que para extraer cualquier dato de una p谩gina web, primero tengamos que descargarlo. Hay dos formas de hacerlo:

    1. Uso de bibliotecas de automatizaci贸n del navegador

    Puede utilizar bibliotecas de automatizaci贸n del navegador como Selenio para descargar el HTML de una p谩gina web. Selenium te permite abrir un navegador, digamos Chrome, y controlarlo como quieras. Puede abrir la p谩gina web en un navegador y luego obtener el c贸digo HTML de esa p谩gina, todo automatizado usando Selenium.

    Sin embargo, este m茅todo tiene un gran inconveniente: es significativamente m谩s lento. La raz贸n es la sobrecarga de ejecutar el navegador y representar el HTML en el navegador. Este m茅todo solo debe usarse en casos excepcionales: casos en los que el contenido que queremos raspar utiliza c贸digo JavaScript en el navegador, o requiere que hagamos clic en botones / enlaces para acceder a los datos, lo que Selenium puede hacer por nosotros.

    2. Uso de bibliotecas HTTP

    Bibliotecas HTTP, como el m贸dulo de solicitudes o Urllib, le permite enviar la solicitud HTTP, sin tener que abrir ning煤n navegador, a diferencia del primer m茅todo. Siempre se debe preferir este m茅todo, ya que es mucho m谩s r谩pido que el selenio.

    Ahora d茅jame mostrarte c贸mo podemos lograr este componente de la canalizaci贸n usando las bibliotecas Selenium y Requests:

    Usar solicitudes

    Instala el requests m贸dulo con lo siguiente:

    $ pip install requests
    

    Y ahora puedes usarlo en tu c贸digo, as铆:

    import requests
    
    result = requests.get('http://quotes.toscrape.com/')
    page = result.text
    

    Aqu铆, se realiza una solicitud HTTP GET a la URL, que es casi sin贸nimo de descargar la p谩gina web. Luego, podemos obtener la fuente HTML de la p谩gina accediendo al objeto de resultado devuelto por el requests.get() m茅todo.

    Usando selenio

    Puede instalar el selenium m贸dulo v铆a pip:

    $ pip install selenium
    
    from selenium import webdriver
    
    driver = webdriver.Chrome()
    driver.get('http://quotes.toscrape.com/')
    page = driver.page_source
    

    Aqu铆, primero comenzamos creando un webdriver objeto, que representa el navegador. Hacer esto abrir谩 el navegador Chrome en la computadora que ejecuta el c贸digo. Entonces, llamando al get m茅todo del webdriver objeto, podemos abrir nuestra URL. Y finalmente, obtenemos el c贸digo fuente accediendo al page_source propiedad de la webdriver objeto.

    En ambos casos, la fuente HTML de la URL se almacena en la variable de p谩gina como una cadena.

    Analizar HTML y extraer datos

    Sin adentrarnos en la inform谩tica te贸rica, podemos definir el an谩lisis sint谩ctico como el proceso de analizar una cadena de modo que podamos comprender su contenido y as铆 acceder f谩cilmente a los datos que contiene.

    En Python, hay dos bibliotecas que pueden ayudarnos con el an谩lisis de HTML: Hermosa Sopa y Lxml. Lxml es un marco de nivel m谩s bajo que BeautifulSoup, y podemos usar Lxml como backend en BeautifulSoup, por lo que para prop贸sitos simples de an谩lisis de HTML, BeautifulSoup ser铆a la biblioteca preferida.

    Pero antes de sumergirnos en el an谩lisis, tenemos que analizar el HTML de la p谩gina web y ver c贸mo se estructuran y ubican los datos que queremos raspar. Solo cuando estamos armados con esa informaci贸n, podemos obtener la informaci贸n que queremos del HTML analizado. Pero afortunadamente, no tendremos que abrir el c贸digo fuente en un editor y entender y correlacionar manualmente cada elemento HTML con los datos correspondientes en la p谩gina renderizada. La mayor铆a de los navegadores ofrecen un inspector, como Herramientas para desarrolladores de Chrome, lo que nos permite ver r谩pidamente el c贸digo HTML de cualquier elemento con solo hacer clic en ellos.

    Para hacer esto en Chrome, abra la p谩gina web en Chrome, luego haga clic derecho en los datos que desea raspar y seleccione Inspeccionar. En Firefox, esta opci贸n se llama Inspeccionar elemento, que es lo mismo, pero con un nombre diferente.

    Notar谩 que se abre un panel en la parte inferior de la ventana de Chrome, que contiene el c贸digo fuente del elemento en el que hizo clic. Examine un poco el c贸digo fuente para tener una idea de c贸mo los datos que queremos raspar est谩n estructurados en el c贸digo HTML.

    Como puede comprender despu茅s de un poco de inspecci贸n, cada cotizaci贸n en http://quotes.toscrape.com/ est谩 contenido en un div con el class="quote" atributo. Dentro de eso div, el texto de la cita est谩 en un span con class="text" y el nombre del autor est谩 en un small etiqueta con class="author". Esta informaci贸n ser谩 necesaria cuando lleguemos a analizar el HTML y extraer nuestros datos.

    Ahora, comencemos a analizar la p谩gina HTML usando BeautifulSoup. Pero primero, debemos instalarlo:

    $ pip install beautifulsoup4
    

    Una vez instalado, puede llamarlo en su c贸digo de esta manera:

    from bs4 import BeautifulSoup
    
    soup = BeautifulSoup(page, 'html.parser')
    

    En primer lugar, creamos una versi贸n analizada de la p谩gina pas谩ndola al BeautifulSoup constructor de clases. Como puede ver, tambi茅n pasamos un segundo argumento al constructor, html.parser. Ese es el nombre del analizador que Beautiful Soup usar谩 para analizar la cadena que le pas贸. Tambi茅n podr铆as haber usado el analizador lxml, del que hablamos anteriormente, dado que tienes instalada la biblioteca Lxml.

    quotes = soup.find_all('div', class_='quote')
    

    Luego, extraemos todos los div etiquetas en la p谩gina que contiene class="quote", como sabemos esos son los divs que contienen comillas. Para ello, Beautiful Soup 4 ofrece una find_all funci贸n. Pasamos el nombre de la etiqueta y el nombre de la clase al find_all funci贸n, y devolvi贸 todas las etiquetas que cumpl铆an las condiciones, es decir, las etiquetas que conten铆an nuestras comillas.

    Una cosa importante a tener en cuenta aqu铆 es que estamos trabajando con estructuras de 谩rbol aqu铆. La variable soup, y tambi茅n cada elemento de quotes, son 谩rboles. En cierto modo, los elementos de quotes son partes de la mayor soup 谩rbol. De todos modos, sin dejarnos llevar por una discusi贸n diferente, continuemos.

    scraped = []
    for quote in quotes:
        text = quote.find('span', class_='text').text
        author = quote.find('small', class_='author').text
        scraped.append([text, author])
    

    Sabemos que el texto de la cita est谩 en un span etiqueta con class="text" y el autor est谩 en un small etiqueta con class="author". Para extraerlos de los elementos de la cita, nuevamente empleamos una funci贸n similar, find. los find La funci贸n toma los mismos argumentos que la find_all funci贸n. La 煤nica diferencia es que devuelve la primera etiqueta que cumple las condiciones, mientras que find_all devolvi贸 una lista de etiquetas. Adem谩s, queremos acceder al text propiedad del objeto devuelto, que contiene el texto incluido dentro de esa etiqueta.

    Entonces, como puede ver en el c贸digo, recorremos todos los elementos de la lista quotesy extraiga el texto de la cita y el nombre del autor, guard谩ndolos como una lista de listas con el nombre scraped. los scraped lista, cuando se imprime en la consola, se ve as铆:

    [['鈥淭he world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.鈥',
      'Albert Einstein'],
     ['鈥淚t is our choices, Harry, that show what we truly are, far more than our abilities.鈥',
      'J.K. Rowling'],
     ['鈥淭here are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.鈥',
      'Albert Einstein'],
     ['鈥淭he person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.鈥',
      'Jane Austen'],
     ["鈥淚mperfection is beauty, madness is genius and it's better to be absolutely ridiculous than absolutely boring.鈥",
      'Marilyn Monroe'],
     ['鈥淭ry not to become a man of success. Rather become a man of value.鈥',
      'Albert Einstein'],
     ['鈥淚t is better to be hated for what you are than to be loved for what you are not.鈥',
      'Andr茅 Gide'],
     ["鈥淚 have not failed. I've just found 10,000 ways that won't work.鈥",
      'Thomas A. Edison'],
     ["鈥淎 woman is like a tea bag; you never know how strong it is until it's in hot water.鈥",
      'Eleanor Roosevelt'],
     ['鈥淎 day without sunshine is like, you know, night.鈥',
      'Steve Martin']]
    

    Almacenamiento de los datos recuperados

    Una vez que hemos adquirido los datos, podemos almacenarlos en el formato que queramos, por ejemplo, un archivo CSV, una base de datos SQL o una base de datos NoSQL. Para ser estricto, este paso no deber铆a contar como parte del proceso de raspado, pero a煤n as铆, lo cubrir茅 brevemente en aras de la exhaustividad.

    Yo dir铆a que la forma m谩s popular de almacenar datos extra铆dos es almacenarlos como hojas de c谩lculo CSV, as铆 que le mostrar茅 c贸mo hacerlo, muy brevemente. No entrar茅 en detalles, para eso deber铆as consultar la documentaci贸n oficial de Python. As铆 que sin m谩s pre谩mbulos, saltemos al c贸digo.

    import csv
    
    with open('quotes.csv', 'w') as csv_file:
        writer = csv.writer(csv_file, delimiter=",")
        for quote in scraped:
            writer.writerow(quote)
    

    Como podemos ver, el c贸digo es bastante autoexplicativo. Estamos creando un CSV writer objeto del archivo quotes.csv abierto, y luego escribir las comillas una por una usando el writerow funci贸n. Como es evidente, la writerow La funci贸n acepta una lista como entrada y luego la escribe en el CSV como una fila.

    Conclusi贸n y pr贸ximos pasos

    Este tutorial deber铆a ayudarlo a comprender de qu茅 se trata b谩sicamente el scraping mientras aprende a implementar un simple scraper usted mismo. Este tipo de raspador deber铆a ser suficiente para una automatizaci贸n simple o un recuperador de datos a peque帽a escala. Pero si desea extraer grandes cantidades de datos de manera eficiente, debe buscar marcos de raspado, especialmente Scrapy. Le ayudar谩 a escribir scrapers muy r谩pidos y eficientes usando unas pocas l铆neas de c贸digo. Cualquiera que sea el marco que use, debajo de esa superficie brillante, ese marco tambi茅n usa estos principios de raspado muy b谩sicos, por lo que comprender este tutorial deber铆a ayudarlo a construir el conocimiento fundamental para sus aventuras de desguace.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *