Geekflare recibe el apoyo de nuestra audiencia. Podemos ganar comisiones de afiliación de los enlaces de compra en este sitio.
En Cripto y Desarrollo Última actualización: 14 de septiembre de 2023
Compartir en:
Escáner de seguridad de aplicaciones web Invicti - la única solución que ofrece verificación automática de vulnerabilidades con Proof-Based Scanning™.

Web scraping es la idea de extraer información de un sitio web y utilizarla para un caso de uso concreto.

Digamos que usted está tratando de extraer una tabla de una página web, convertirla en un archivo JSON y utilizar el archivo JSON para la construcción de algunas herramientas internas. Con la ayuda de web scraping, puede extraer los datos que desea dirigiéndose a los elementos específicos de una página web. Web scraping utilizando Python es una opción muy popular como Python ofrece múltiples bibliotecas como BeautifulSoup, o Scrapy para extraer datos de manera efectiva.

web-scraping

Tener la habilidad de extraer datos eficientemente también es muy importante como desarrollador o como científico de datos. Este artículo te ayudará a entender cómo scrapear un sitio web de manera efectiva y obtener el contenido necesario para manipularlo de acuerdo a tu necesidad. Para este tutorial, utilizaremos la herramienta BeautifulSoup paquete. Es un paquete de moda para el scraping de datos en Python.

¿Por qué utilizar Python para Web Scraping?

Python es la primera opción para muchos desarrolladores a la hora de crear raspadores web. Hay muchas razones por las que Python es la primera opción, pero para este artículo, vamos a discutir tres razones principales por las que Python se utiliza para el raspado de datos.

Biblioteca y apoyo comunitario: Hay varias librerías estupendas, como BeautifulSoup, Scrapy, Selenium, etc., que proporcionan grandes funciones para el scraping eficaz de páginas web. Se ha construido un excelente ecosistema para el web scraping, y también porque muchos desarrolladores de todo el mundo ya utilizan Python, puedes obtener ayuda rápidamente cuando estás atascado.

Automatización: Python es famoso por sus capacidades de automatización. Si quieres crear una herramienta compleja que dependa del scraping, necesitarás algo más. Por ejemplo, si quieres construir una herramienta que rastree el precio de los artículos en una tienda online, necesitarás añadir alguna capacidad de automatización para que pueda rastrear las tarifas diariamente y añadirlas a tu base de datos. Python te ofrece la posibilidad de automatizar estos procesos con facilidad.

Visualización de datos: El web scraping es muy utilizado por los científicos de datos. Los científicos de datos a menudo necesitan extraer datos de páginas web. Con bibliotecas como Pandas, Python hace que visualización de datos más simple a partir de datos brutos.

Bibliotecas para Web Scraping en Python

Hay varias bibliotecas disponibles en Python para simplificar el web scraping. Vamos a hablar aquí de las tres bibliotecas más populares.

#1. BeautifulSoup

Una de las bibliotecas más populares para el web scraping. BeautifulSoup lleva ayudando a los desarrolladores a raspar páginas web desde 2004. Ofrece métodos sencillos para navegar, buscar y modificar el árbol de análisis sintáctico. Beautifulsoup también codifica los datos entrantes y salientes. Está bien mantenido y cuenta con una gran comunidad.

#2. Chatarra

Otro marco popular para la extracción de datos. Chatarra tiene más de 43000 estrellas en GitHub. También se puede utilizar para extraer datos de las API. También tiene algunos interesantes soporte incorporado, como el envío de mensajes de correo electrónico.

#3. Selenio

Selenio no es principalmente una biblioteca de web scraping. En su lugar, es un paquete de automatización del navegador. Pero podemos extender fácilmente sus funcionalidades para el scraping de páginas web. Utiliza el protocolo WebDriver para controlar diferentes navegadores. Selenium ha estado en el mercado durante casi 20 años. Pero usando Selenium, puedes fácilmente automatizar y raspar datos de páginas web.

Desafíos del Web Scraping en Python

El scraping de datos de sitios web puede plantear muchas dificultades. Hay problemas como redes lentas, herramientas anti-scraping, bloqueo basado en IP, bloqueo de captcha, etc. Estas cuestiones pueden causar problemas masivos cuando se trata de raspar un sitio web.

Pero puede sortear eficazmente los retos siguiendo algunos caminos. Por ejemplo, en la mayoría de los casos, un Dirección IP es bloqueado por un sitio web cuando hay más de una cierta cantidad de peticiones enviadas en un intervalo de tiempo específico. Para evitar el bloqueo de IP, tendrás que codificar tu scraper para que se enfríe después de enviar peticiones.

retos en el web-scraping

Los promotores también suelen colocar trampas para rascadores. Estas trampas suelen ser invisibles a simple vista, pero pueden ser rastreadas por un scraper. Si estás rastreando un sitio web que incluye este tipo de trampas, tendrás que codificar tu raspador en consecuencia.

El captcha es otro grave problema de los scrapers. Hoy en día, la mayoría de los sitios web utilizan un captcha para proteger el acceso de los robots a sus páginas. En tal caso, es posible que tenga que utilizar un solucionador de captcha.

Raspado de un sitio web con Python

Como hemos comentado, vamos a utilizar BeautifulSoup para scrapear un sitio web. En este tutorial, vamos a raspar los datos históricos de Ethereum de Coingecko y guardar los datos de la tabla como un archivo JSON. Pasemos a construir el scraper.

El primer paso es instalar BeautifulSoup y Requests. Para este tutorial, voy a utilizar Pipenv. Pipenv es un gestor de entornos virtuales para Python. También puede utilizar Venv si lo desea, pero yo prefiero Pipenv. Discutir Pipenv está más allá del alcance de este tutorial. Pero si quieres aprender como Pipenv puede ser usado, sigue esta guía. O, si quieres entender los entornos virtuales de Python, sigue esta guía.

Inicie el shell Pipenv en el directorio de su proyecto ejecutando el comando pipenv shell. Lanzará un subshell en su entorno virtual. Ahora, para instalar BeautifulSoup, ejecute el siguiente comando:

pipenv install beautifulsoup4

Y, para instalar peticiones, ejecute el comando similar al anterior:

pipenv install requests

Una vez finalizada la instalación, importa los paquetes necesarios al archivo principal. Cree un archivo llamado main.py e importar los paquetes como se indica a continuación:

from bs4 import BeautifulSoup
import requests
import json

El siguiente paso es obtener el contenido de la página de datos históricos y analizarlo utilizando el analizador HTML disponible en BeautifulSoup.

r = requests.get('https://www.coingecko.com/en/coins/ethereum/historical_data#panel')

soup = BeautifulSoup(r.content, 'html.parser')

En el código anterior, se accede a la página utilizando el método get disponible en la biblioteca de peticiones. El contenido analizado se almacena en una variable llamada soup.

Ahora empieza la parte del scraping original. En primer lugar, tendrás que identificar correctamente la tabla en el DOM. Si abres esta página e inspeccionarla utilizando las herramientas de desarrollo disponibles en el navegador, verás que la tabla tiene estas clases table table-striped text-sm text-lg-normal.

coingecko
Tabla de datos históricos de Coingecko Ethereum

Para orientar correctamente esta tabla, puede utilizar la función find método.

table = soup.find('table', attrs={'class': 'table table-striped text-sm text-lg-normal'})

table_data = table.find_all('tr')

table_headings = []

for th in table_data[0].find_all('th'):
    table_headings.append(th.text)

En el código anterior, en primer lugar, la tabla se encuentra utilizando la función soup.find y utilizando el método find_all todos los tr dentro de la tabla. Estos tr se almacenan en una variable denominada table_data. La mesa tiene unos th para el título. Una nueva variable llamada table_headings se inicializa para mantener los títulos en una lista.

A continuación, se ejecuta un bucle for para la primera fila de la tabla. En esta fila, todos los elementos con th y su valor de texto se añade al campo table_headings lista. El texto se extrae utilizando la función text método. Si imprime el table_headings ahora, podrás ver la siguiente salida:

['Date', 'Market Cap', 'Volume', 'Open', 'Close']

El siguiente paso es raspar el resto de los elementos, generar un diccionario para cada fila y, a continuación, añadir las filas en una lista.

for tr in table_data:
    th = tr.find_all('th')
    td = tr.find_all('td')

    data = {}

    for i in range(len(td)):
        data.update({table_headings[0]: th[0].text})
        data.update({table_headings[i+1]: td[i].text.replace('\n', '')})

    if data.__len__() > 0:
        table_details.append(data)

Esta es la parte esencial del código. Para cada tr en el table_data variable, en primer lugar, la th se buscan elementos. La dirección th elementos son la fecha que figura en la tabla. Estos th se almacenan en una variable th. Del mismo modo, todos los td se almacenan en td variable.

Un diccionario vacío data se inicializa. Después de la inicialización, hacemos un bucle a través del rango de td elementos. Para cada fila, en primer lugar, actualizamos el primer campo del diccionario con el primer elemento de th. El código table_headings[0]: th[0].text asigna un par clave-valor de fecha y el primer th elemento.

Tras inicializar el primer elemento, los demás elementos se asignan utilizando data.update({table_headings[i+1]: td[i].text.replace('\\n', '')}). Toma, td se extrae primero el texto de los elementos mediante la función text y, a continuación, todos los \\n se sustituye utilizando la función replace método. A continuación, el valor se asigna al método i+1ésimo elemento de table_headings lista porque el iya está asignado.

Entonces, si el data la longitud del diccionario es superior a cero, añadimos el diccionario al table_details lista. Puede imprimir la table_details para comprobar. Pero escribiremos los valores en un archivo JSON. Echemos un vistazo al código para esto,

with open('table.json', 'w') as f:
    json.dump(table_details, f, indent=2)
    print('Data saved to json file...')

Estamos utilizando el json.dump para escribir los valores en un archivo JSON llamado table.json. Una vez terminada la redacción, imprimimos Data saved to json file... en la consola.

Ahora, ejecute el archivo utilizando el siguiente comando,

python run main.py

Después de algún tiempo, podrás ver el texto Data saved to JSON file... en la consola. También verá un nuevo archivo llamado table.json en el directorio de archivos de trabajo. El archivo tendrá un aspecto similar al siguiente archivo JSON:

[
  {
    "Date": "2022-11-27",
    "Market Cap": "$145,222,050,633",
    "Volume": "$5,271,100,860",
    "Open": "$1,205.66",
    "Close": "N/A"
  },
  {
    "Date": "2022-11-26",
    "Market Cap": "$144,810,246,845",
    "Volume": "$5,823,202,533",
    "Open": "$1,198.98",
    "Close": "$1,205.66"
  },
  {
    "Date": "2022-11-25",
    "Market Cap": "$145,091,739,838",
    "Volume": "$6,955,523,718",
    "Open": "$1,204.21",
    "Close": "$1,198.98"
  },
// ...
// ... 
]

Has implementado con éxito un raspador web utilizando Python. Para ver el código completo, puedes visitar este enlace Repo de GitHub.

Conclusión

En este artículo se discutió cómo se puede implementar un simple scrape Python. Discutimos cómo BeautifulSoup podría ser utilizado para el raspado de datos rápidamente desde el sitio web. También discutimos otras bibliotecas disponibles y por qué Python es la primera opción para muchos desarrolladores para raspar sitios web.

También puede consultar marcos de raspado web.

  • Subha Chanda
    Autor
Gracias a nuestros patrocinadores
Más lecturas sobre criptografía
Potencia tu negocio
Algunas de las herramientas y servicios que le ayudarán a hacer crecer su negocio.
  • Invicti utiliza el Proof-Based Scanning™ para verificar automáticamente las vulnerabilidades identificadas y generar resultados procesables en tan solo unas horas.
    Pruebe Invicti
  • Web scraping, proxy residencial, gestor de proxy, desbloqueador web, rastreador de motores de búsqueda, y todo lo que necesita para recopilar datos web.
    Pruebe Brightdata
  • Monday.com es un sistema operativo de trabajo todo en uno que te ayuda a gestionar proyectos, tareas, trabajo, ventas, CRM, operaciones, flujos de trabajo y mucho más.
    Prueba el lunes
  • Intruder es un escáner de vulnerabilidades en línea que encuentra puntos débiles de ciberseguridad en su infraestructura, para evitar costosas violaciones de datos.
    Prueba Intruder