Introducción al raspado web con Python

I

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í:

[['“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”',
  'Albert Einstein'],
 ['“It is our choices, Harry, that show what we truly are, far more than our abilities.”',
  'J.K. Rowling'],
 ['“There 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'],
 ['“The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.”',
  'Jane Austen'],
 ["“Imperfection is beauty, madness is genius and it's better to be absolutely ridiculous than absolutely boring.”",
  'Marilyn Monroe'],
 ['“Try not to become a man of success. Rather become a man of value.”',
  'Albert Einstein'],
 ['“It is better to be hated for what you are than to be loved for what you are not.”',
  'André Gide'],
 ["“I have not failed. I've just found 10,000 ways that won't work.”",
  'Thomas A. Edison'],
 ["“A woman is like a tea bag; you never know how strong it is until it's in hot water.”",
  'Eleanor Roosevelt'],
 ['“A 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.

 

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con tus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad