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.

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.

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
.

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 i
ya 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.