Raspe un sitio web con este hermoso tutorial de Python de sopa
Beautiful Soup es una biblioteca de Python de código abierto. Utiliza analizadores de navegación para extraer el contenido de archivos XML y HTML. Necesita datos para varios propósitos analíticos. Sin embargo, si eres nuevo en Python y web scraping, vale la pena probar la biblioteca Beautiful Soup de Python para un proyecto de web scraping.
Con la biblioteca Beautiful Soup de código abierto de Python, puede obtener datos raspando cualquier parte o elemento de una página web con el máximo control sobre el proceso. En este artículo, veremos cómo puede usar Beautiful Soup para raspar un sitio web.
Cómo instalar Beautiful Soup y empezar a usarlo
Antes de continuar, en este artículo tutorial de Beautiful Soup, usaremos Python 3 y beautifulsoup4 , la última versión de Beautiful Soup. Asegúrese de crear un entorno virtual Python para aislar su proyecto y sus paquetes de los de su máquina local.
Para comenzar, debe instalar la biblioteca Beautiful Soup en su entorno virtual. Beautiful Soup está disponible como paquete PyPi para todos los sistemas operativos, por lo que puede instalarlo con el comando pip install beautifulsoup4 a través de la terminal.
Sin embargo, si está en Debian o Linux, el comando anterior aún funciona, pero puede instalarlo con el administrador de paquetes ejecutando apt-get install python3-bs4 .
Beautiful Soup no raspa las URL directamente. Solo funciona con archivos HTML o XML listos para usar. Eso significa que no puede pasar una URL directamente. Para resolver ese problema, debe obtener la URL del sitio web de destino con la biblioteca de solicitudes de Python antes de enviarla a Beautiful Soup.
Para que esa biblioteca esté disponible para su raspador, ejecute el comando de solicitudes de instalación de pip a través de la terminal.
Para usar la biblioteca del analizador XML, ejecute pip install lxml para instalarlo.
Inspeccione la página web que desea raspar
Antes de eliminar cualquier sitio web con el que no esté familiarizado, una buena práctica es inspeccionar sus elementos. Puede hacer esto cambiando su navegador al modo de desarrollador. Es bastante fácil usar Chrome DevTools si usa Google Chrome.
Sin embargo, es necesario inspeccionar una página web para saber más sobre sus etiquetas HTML, atributos, clases e identificadores. Hacer eso expone los elementos centrales de una página web y sus tipos de contenido.
También le ayuda a desarrollar las mejores estrategias que puede utilizar para obtener los datos exactos que desea de un sitio web y cómo puede obtenerlos.
Cómo extraer los datos de un sitio web con Beautiful Soup
Ahora que tiene todo listo y listo, abra un editor de código preferido y cree un nuevo archivo Python, dándole un nombre elegido. Sin embargo, también puede hacer uso de IDE basados en web como Jupyter Notebook si no está familiarizado con la ejecución de Python a través de la línea de comandos.
A continuación, importe las bibliotecas necesarias:
from bs4 import BeautifulSoup
import requests
En primer lugar, veamos cómo funciona la biblioteca de solicitudes:
from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com')
print(website)
Cuando ejecuta el código anterior, devuelve un estado 200, lo que indica que su solicitud se realizó correctamente. De lo contrario, obtiene un estado 400 o algunos otros estados de error que indican una solicitud GET fallida.
Recuerde siempre reemplazar la URL del sitio web entre paréntesis con su URL de destino.
Una vez que obtiene el sitio web con la solicitud de obtención , lo pasa a Beautiful Soup, que ahora puede leer el contenido como archivos HTML o XML utilizando su analizador XML o HTML incorporado, según el formato elegido.
Eche un vistazo a este siguiente fragmento de código para ver cómo hacer esto con el analizador HTML:
from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com')
soup = BeautifulSoup(website.content, 'html.parser')
print(soup)
El código anterior devuelve el DOM completo de una página web con su contenido.
También puede obtener una versión más alineada del DOM utilizando el método prettify . Puedes probar esto para ver su resultado:
from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com/')
soup = BeautifulSoup(website.content, 'html.parser')
print(soup.prettify())
También puede obtener el contenido puro de una página web sin cargar su elemento con el método .text :
from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com/')
soup = BeautifulSoup(website.content, 'html.parser')
print(soup.text)
Cómo extraer el contenido de una página web por el nombre de la etiqueta
También puede raspar el contenido en una etiqueta particular con Beautiful Soup. Para hacer esto, debe incluir el nombre de la etiqueta de destino en su solicitud de raspador Beautiful Soup.
Por ejemplo, veamos cómo puede obtener el contenido en las etiquetas h2 de una página web.
from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com/')
soup = BeautifulSoup(website.content, 'html.parser')
print(soup.h2)
En el fragmento de código anterior, soup.h2 devuelve el primer elemento h2 de la página web e ignora el resto. Para cargar todos los elementos h2 , puede usar la función incorporada find_all y el bucle for de Python:
from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com/')
soup = BeautifulSoup(website.content, 'html.parser')
h2tags = soup.find_all('h2')
for soups in h2tags:
print(soups)
Ese bloque de código devuelve todos los elementos h2 y su contenido. Sin embargo, puede obtener el contenido sin cargar la etiqueta mediante el método .string :
from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com/')
soup = BeautifulSoup(website.content, 'html.parser')
h2tags = soup.find_all('h2')
for soups in h2tags:
print(soups.string)
Puede utilizar este método para cualquier etiqueta HTML. Todo lo que necesitas hacer es reemplazar la etiqueta h2 por la que te guste.
Sin embargo, también puede raspar más etiquetas pasando una lista de etiquetas al método find_all . Por ejemplo, el bloque de código a continuación raspaduras el contenido de un h2, etiquetas, y el título:
from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com/')
soup = BeautifulSoup(website.content, 'html.parser')
tags = soup.find_all(['a', 'h2', 'title'])
for soups in tags:
print(soups.string)
Cómo raspar una página web usando el ID y el nombre de la clase
Después de inspeccionar un sitio web con DevTools, le permite saber más sobre los atributos de id y class que contienen cada elemento en su DOM. Una vez que tenga esa información, puede raspar esa página web usando este método. Es útil cuando el contenido de un componente de destino sale de la base de datos.
Puede utilizar el método de búsqueda para los raspadores de identificación y clase. A diferencia del método find_all que devuelve un objeto iterable, el método find funciona en un solo objetivo no iterable, que es el id en este caso. Por lo tanto, no necesita usar el bucle for con él.
Veamos un ejemplo de cómo puede raspar el contenido de una página a continuación usando la identificación:
from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com/')
soup = BeautifulSoup(website.content, 'html.parser')
id = soup.find(id = 'enter the target id here')
print(id.text)
Para hacer esto para un nombre de clase, reemplace el id con class . Sin embargo, escribir la clase da como resultado directamente una confusión de sintaxis, ya que Python lo ve como una palabra clave. Para evitar ese error, debe escribir un guión bajo delante de la clase como este: class_ .
En esencia, la línea que contiene el id se convierte en:
my_classes = soup.find(class_ = 'enter the target class name here')
print(my_classes.text)
Sin embargo, también puede raspar una página web llamando a un nombre de etiqueta en particular con su identificación o clase correspondiente:
data = soup.find_all('div', class_ = 'enter the target class name here')
print(data)
Cómo hacer un raspador reutilizable con una sopa hermosa
Puede crear una clase y poner todo el código anterior junto en una función en esa clase para hacer un raspador reutilizable que obtiene el contenido de algunas etiquetas y sus identificadores. Podemos hacer esto creando una función que acepte cinco argumentos: una URL, dos nombres de etiquetas y sus correspondientes identificadores o clases.
Suponga que desea sacar el precio de las camisas de un sitio web de comercio electrónico. La clase de raspador de ejemplo a continuación extrae las etiquetas de precio y camisa con sus identificadores o clases correspondientes y luego lo devuelve como un marco de datos de Pandas con 'Precio' y Shirt_name como nombres de columna.
Asegúrese de instalar pandas a través de la terminal si aún no lo ha hecho.
import pandas as pd
class scrapeit:
try:
def scrape(website=None, tag1=None, id1=None, tag2=None, id2=None):
if not (website and tag1 and id1 and tag2 and id2)==None:
try:
page = requests.get(website)
soup = BeautifulSoup(page.content, 'html.parser')
infotag1 = soup.find_all(tag1, id1)
infotag2 = soup.find_all(tag2, id2)
priced = [prices.text for prices in infotag1]
shirt = [shirts.text for shirts in infotag2]
data = {
'Price':priced,
'Shirt_name':shirt}
info = pd.DataFrame(data, columns=['Price', 'Shirt_name'])
print(info)
except:
print('Not successful')
else:
print('Oops! Please enter a website, two tags and thier corresponding ids')
except:
print('Not successful!')
El raspador que acaba de crear es un módulo reutilizable y puede importarlo y usarlo en otro archivo de Python. Para llamar a la función roce de su clase, se utiliza scrapeit.scrape ( 'URL del sitio web', 'price_tag', 'price_id', 'shirt_tag', 'shirt_id'). Si no proporciona la URL y otros parámetros, la instrucción else le pedirá que lo haga.
Para usar ese scaper en otro archivo de Python, puede importarlo así:
from scraper_module import scrapeit
scrapeit.scrape('URL', 'price_tag', 'price_id', 'shirt_tag', 'shirt_id')
Nota: scraper_module es el nombre del archivo Python que contiene la clase scraper.
También puede consultar la documentación de Beautiful Soup si desea profundizar en cómo puede aprovecharla al máximo.
Beautiful Soup es una valiosa herramienta de raspado web
Beautiful Soup es un poderoso raspador de pantalla de Python que le brinda control sobre cómo llegan sus datos durante el raspado. Es una herramienta comercial valiosa, ya que puede brindarle acceso a los datos web de la competencia, como precios, tendencias del mercado y más.
Aunque hemos creado un raspador de etiquetas en este artículo, aún puede jugar con esta poderosa biblioteca de Python para crear herramientas de raspado más útiles.