Implementando Web Scraping en Python con BeautifulSoup

Existen principalmente dos formas de extraer datos de un sitio web:

  • Utilice la API del sitio web (si existe). Por ejemplo, Facebook tiene la API Graph de Facebook que permite la recuperación de datos publicados en Facebook.
  • Acceda al HTML de la página web y extraiga información/datos útiles de ella. Esta técnica se llama raspado web o recolección web o extracción de datos web.

Este artículo analiza los pasos involucrados en el raspado web mediante la implementación de un marco de raspado web de Python llamado Beautiful Soup. Pasos involucrados en web scraping:

  1. Envía una solicitud HTTP a la URL de la página web a la que deseas acceder. El servidor responde a la solicitud devolviendo el contenido HTML de la página web. Para esta tarea, utilizaremos una biblioteca HTTP de terceros para requests de python.
  2. Una vez que hemos accedido al contenido HTML, nos queda la tarea de analizar los datos. Dado que la mayoría de los datos HTML están anidados, no podemos extraer datos simplemente mediante el procesamiento de strings. Se necesita un analizador que pueda crear una estructura de árbol/anidada de los datos HTML. Hay muchas bibliotecas de analizadores HTML disponibles, pero la más avanzada es html5lib.
  3. Ahora, todo lo que tenemos que hacer es navegar y buscar en el árbol de análisis que creamos, es decir, el recorrido del árbol. Para esta tarea, utilizaremos otra biblioteca de Python de terceros, Beautiful Soup . Es una biblioteca de Python para extraer datos de archivos HTML y XML.

Paso 1: Instalación de las bibliotecas de terceros requeridas

  • La forma más fácil de instalar bibliotecas externas en python es usar pip. pip es un sistema de administración de paquetes que se utiliza para instalar y administrar paquetes de software escritos en Python. Todo lo que necesitas hacer es:
pip install requests
pip install html5lib
pip install bs4

Paso 2: acceder al contenido HTML desde la página web 

Python

import requests
URL = "https://www.geeksforgeeks.org/data-structures/"
r = requests.get(URL)
print(r.content)

Tratemos de entender este fragmento de código.

  • En primer lugar, importe la biblioteca de requests.
  • Luego, especifique la URL de la página web que desea raspar.
  • Envíe una solicitud HTTP a la URL especificada y guarde la respuesta del servidor en un objeto de respuesta llamado r.
  • Ahora, imprima r.content para obtener el contenido HTML sin procesar de la página web. Es de tipo ‘string’.

Nota: A veces puede recibir el error «No aceptado», así que intente agregar un agente de usuario del navegador como se muestra a continuación. Encuentre su agente de usuario según el dispositivo y el navegador desde aquí https://deviceatlas.com/blog/list-of-user-agent-strings

Python3

headers = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246"}
# Here the user agent is for Edge browser on windows 10. You can find your browser user agent from the above given link.
r = requests.get(url=URL, headers=headers)
print(r.content)

Paso 3: analizar el contenido HTML 

Python

#This will not run on online IDE
import requests
from bs4 import BeautifulSoup
  
URL = "http://www.values.com/inspirational-quotes"
r = requests.get(URL)
  
soup = BeautifulSoup(r.content, 'html5lib') # If this line causes an error, run 'pip install html5lib' or install html5lib
print(soup.prettify())

Una cosa realmente buena de la biblioteca BeautifulSoup es que está construida sobre las bibliotecas de análisis de HTML como html5lib, lxml, html.parser, etc. Por lo tanto, el objeto BeautifulSoup y especificar la biblioteca del analizador se pueden crear al mismo tiempo. En el ejemplo anterior,

soup = BeautifulSoup(r.content, 'html5lib')

Creamos un objeto BeautifulSoup pasando dos argumentos:

  • r.content : es el contenido HTML sin procesar.
  • html5lib  : especificando el analizador HTML que queremos usar.

Ahora que Soup.prettify() está impreso,  brinda la representación visual del árbol de análisis creado a partir del contenido HTML sin formato. Paso 4: Buscar y navegar a través del árbol de análisis Ahora, nos gustaría extraer algunos datos útiles del contenido HTML. El objeto de sopa contiene todos los datos en la estructura anidada que podrían extraerse mediante programación. En nuestro ejemplo, estamos raspando una página web que consta de algunas citas. Entonces, nos gustaría crear un programa para guardar esas cotizaciones (y toda la información relevante sobre ellas). 

Python

#Python program to scrape website 
#and save quotes from website
import requests
from bs4 import BeautifulSoup
import csv
   
URL = "http://www.values.com/inspirational-quotes"
r = requests.get(URL)
   
soup = BeautifulSoup(r.content, 'html5lib')
   
quotes=[]  # a list to store quotes
   
table = soup.find('div', attrs = {'id':'all_quotes'}) 
   
for row in table.findAll('div',
                         attrs = {'class':'col-6 col-lg-3 text-center margin-30px-bottom sm-margin-30px-top'}):
    quote = {}
    quote['theme'] = row.h5.text
    quote['url'] = row.a['href']
    quote['img'] = row.img['src']
    quote['lines'] = row.img['alt'].split(" #")[0]
    quote['author'] = row.img['alt'].split(" #")[1]
    quotes.append(quote)
   
filename = 'inspirational_quotes.csv'
with open(filename, 'w', newline='') as f:
    w = csv.DictWriter(f,['theme','url','img','lines','author'])
    w.writeheader()
    for quote in quotes:
        w.writerow(quote)

Antes de continuar, le recomendamos que revise el contenido HTML de la página web que imprimimos usando el método soup.prettify() e intente encontrar un patrón o una forma de navegar a las comillas.

  • Se nota que todas las comillas están dentro de un contenedor div cuyo id es ‘all_quotes’. Entonces, encontramos ese elemento div (denominado tabla en el código anterior) usando el método find() :
table = soup.find('div', attrs = {'id':'all_quotes'}) 
  • El primer argumento es la etiqueta HTML que desea buscar y el segundo argumento es un elemento de tipo diccionario para especificar los atributos adicionales asociados con esa etiqueta. El método find() devuelve el primer elemento coincidente. Puede intentar imprimir table.prettify() para tener una idea de lo que hace este código.
  • Ahora, en el elemento de la tabla, uno puede notar que cada cotización está dentro de un contenedor div cuya clase es cotización. Entonces, iteramos a través de cada contenedor div cuya clase es cotización. Aquí, usamos el método findAll() que es similar al método find en términos de argumentos pero devuelve una lista de todos los elementos coincidentes. Cada cotización ahora se itera usando una variable llamada fila. Aquí hay un contenido HTML de fila de muestra para una mejor comprensión: Implementing Web Scraping in Python with Beautiful SoupAhora considere este fragmento de código:
for row in table.find_all_next('div', attrs = {'class': 'col-6 col-lg-3 text-center margin-30px-bottom sm-margin-30px-top'}):
    quote = {}
    quote['theme'] = row.h5.text
    quote['url'] = row.a['href']
    quote['img'] = row.img['src']
    quote['lines'] = row.img['alt'].split(" #")[0]
    quote['author'] = row.img['alt'].split(" #")[1]
    quotes.append(quote)
  • Creamos un diccionario para guardar toda la información sobre una cotización. Se puede acceder a la estructura anidada usando la notación de puntos. Para acceder al texto dentro de un elemento HTML, usamos .text: 
quote['theme'] = row.h5.text
  • Podemos agregar, eliminar, modificar y acceder a los atributos de una etiqueta. Esto se hace tratando la etiqueta como un diccionario:
quote['url'] = row.a['href']
  • Por último, todas las comillas se añaden a la lista denominada comillas.
  • Finalmente, nos gustaría guardar todos nuestros datos en algún archivo CSV.
filename = 'inspirational_quotes.csv'
with open(filename, 'w', newline='') as f:
    w = csv.DictWriter(f,['theme','url','img','lines','author'])
    w.writeheader()
    for quote in quotes:
        w.writerow(quote)
  • Aquí creamos un archivo CSV llamado inspirational_quotes.csv y guardamos todas las citas en él para cualquier uso posterior.

Entonces, este fue un ejemplo simple de cómo crear un raspador web en Python. Desde aquí, puede intentar eliminar cualquier otro sitio web de su elección. En caso de cualquier consulta, publíquela a continuación en la sección de comentarios.

Nota: Web Scraping se considera ilegal en muchos casos. También puede causar que su IP sea bloqueada permanentemente por un sitio web. Este blog es una contribución de Nikhil Kumar . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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