Web scraping es la idea de extraer información de un sitio web y usarla para un caso de uso particular.
Supongamos que intenta extraer una tabla de una página web, convertirla en un archivo JSON y utilizar el archivo JSON para crear algunas herramientas internas. Con la ayuda del raspado web, puede extraer los datos que desea al enfocarse en elementos específicos en una página web. El web scraping con Python es una opción muy popular, ya que Python proporciona múltiples bibliotecas como BeautifulSoup o Scrapy para extraer datos de manera efectiva.

Tener la habilidad de extraer datos de manera eficiente también es muy importante como desarrollador o como científico de datos. Este artículo lo ayudará a comprender cómo raspar un sitio web de manera efectiva y obtener el contenido necesario para manipularlo según sus necesidades. Para este tutorial, usaremos el BeautifulSoup paquete. Es un paquete moderno para raspar datos en Python.
Why use Python for Web Scraping?
Python es la primera opción para muchos desarrolladores cuando crean web scrapers. Hay muchas razones por las que Python es la primera opción, pero para este artículo, analicemos tres razones principales por las que Python se usa para el raspado de datos.
Biblioteca y apoyo comunitario: Hay varias bibliotecas excelentes, como BeautifulSoup, Scrapy, Selenium, etc., que brindan excelentes funciones para raspar páginas web de manera efectiva. Ha construido un ecosistema excelente para el web scraping, y también debido a que muchos desarrolladores en todo el mundo ya usan Python, puede obtener ayuda rápidamente cuando está atascado.
Automatización: Python es famoso por sus capacidades de automatización. Se requiere más que web scraping si está tratando de crear una herramienta compleja que se base en scraping. Por ejemplo, si desea crear una herramienta que rastree el precio de los artículos en una tienda en línea, deberá agregar alguna capacidad de automatización para que pueda rastrear las tarifas diariamente y agregarlas a su base de datos. Python le brinda la capacidad de automatizar dichos procesos con facilidad.
Visualización de datos: Los científicos de datos utilizan mucho el web scraping. Los científicos de datos a menudo necesitan extraer datos de páginas web. Con bibliotecas como Pandas, Python hace Visualización de datos más simple a partir de datos sin procesar.
Libraries for Web Scraping in Python
Hay varias bibliotecas disponibles en Python para simplificar el web scraping. Analicemos las tres bibliotecas más populares aquí.
#1. BeautifulSoup
Una de las bibliotecas más populares para web scraping. BeautifulSoup ha estado ayudando a los desarrolladores a raspar páginas web desde 2004. Proporciona métodos simples para navegar, buscar y modificar el árbol de análisis. Beautifulsoup también codifica los datos entrantes y salientes. Está bien mantenido y tiene una gran comunidad.
#2. Scrapy
Otro marco popular para la extracción de datos. Scrapy tiene más de 43000 estrellas en GitHub. También se puede utilizar para extraer datos de las API. También tiene algunos soportes integrados interesantes, como el envío de correos electrónicos.
#3. Selenio
Selenio no es principalmente una biblioteca de web scraping. En cambio, es un paquete de automatización del navegador. Pero podemos extender fácilmente sus funcionalidades para raspar páginas web. Utiliza el protocolo WebDriver para controlar diferentes navegadores. Selenium ha estado en el mercado durante casi 20 años. Pero con Selenium, puede automatizar y extraer fácilmente datos de páginas web.
Challenges with Python Web Scraping
Uno puede enfrentar muchos desafíos cuando intenta extraer datos de sitios web. Hay problemas como redes lentas, herramientas anti-raspado, bloqueo basado en IP, bloqueo de captcha, etc. Estos problemas pueden causar problemas masivos al intentar raspar un sitio web.
Pero puede evitar los desafíos de manera efectiva siguiendo algunas formas. 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 solicitudes enviadas en un intervalo de tiempo específico. Para evitar el bloqueo de IP, deberá codificar su raspador para que se enfríe después de enviar solicitudes.

Los desarrolladores también tienden a colocar trampas de trampas para raspadores. Estas trampas suelen ser invisibles a simple vista, pero se pueden rastrear con un raspador. Si está raspando un sitio web que coloca una trampa trampa, deberá codificar su raspador en consecuencia.
Captcha es otro problema grave con los raspadores. La mayoría de los sitios web hoy en día usan un captcha para proteger el acceso de los bots a sus páginas. En tal caso, es posible que deba usar un solucionador de captcha.
Scraping a Website with Python
Como comentamos, usaremos BeautifulSoup para descartar un sitio web. En este tutorial, rasparemos el datos históricos de Ethereum de Coingecko y guarde los datos de la tabla como un archivo JSON. Pasemos a construir el raspador.
El primer paso es instalar BeautifulSoup y Requests. Para este tutorial, usaré Pipenv. Pipenv es un administrador de entornos virtuales para Python. También puedes usar venv si quieres, pero yo prefiero Pipenv. Discutir Pipenv está más allá del alcance de este tutorial. Pero si quieres aprender cómo se puede usar Pipenv, sigue esta guía. O, si desea comprender los entornos virtuales de Python, siga esta guía.
Inicie el shell de Pipenv en el directorio de su proyecto ejecutando el comando pipenv shell
. Lanzará una subcapa en su entorno virtual. Ahora, para instalar BeautifulSoup, ejecute el siguiente comando:
pipenv install beautifulsoup4
Y, para las solicitudes de instalación, ejecute el comando similar al anterior:
pipenv install requests
Una vez completada la instalación, importe los paquetes necesarios al archivo principal. Crea un archivo llamado main.py
e importar los paquetes como el siguiente:
from bs4 import BeautifulSoup
import requests
import json
El siguiente paso es obtener el contenido de la página de datos históricos y analizarlos 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 usando el get
disponible en la biblioteca de solicitudes. El contenido analizado se almacena en una variable llamada soup
.
La parte de raspado original comienza ahora. Primero, deberá identificar la tabla correctamente en el DOM. si abres esta página e inspeccione usando las herramientas de desarrollador disponibles en el navegador, verá que la tabla tiene estas clases table table-striped text-sm text-lg-normal
.

Para apuntar correctamente a esta tabla, puede usar el 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, primero, la tabla se encuentra usando el soup.find
método, luego usando el find_all
método, todo tr
se buscan elementos dentro de la tabla. Estas tr
Los elementos se almacenan en una variable llamada table_data
. La mesa tiene algunos th
Elementos 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
se buscan, y su valor de texto se agrega a la table_headings
lista. El texto se extrae con el text
método. Si imprimes el table_headings
variable ahora, podrá ver el siguiente resultado:
['Date', 'Market Cap', 'Volume', 'Open', 'Close']
El siguiente paso es raspar el resto de los elementos, generar un diccionario para cada fila y luego agregar las filas a 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 capítulo respecto a la table_data
variable, primero, la th
Se buscan elementos. los th
elementos son la fecha que se muestra en la tabla. Estas th
los elementos se almacenan dentro de una variable th
. Del mismo modo, todos los td
Los elementos se almacenan en el td
variable.
un diccionario vacio data
se inicializa. Después de la inicialización, recorremos el rango de td
elementos. Para cada fila, primero, 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 primero th
elemento.
Después de inicializar el primer elemento, los otros elementos se asignan usando data.update({table_headings[i+1]: td[i].text.replace('\\n', '')})
. Aquí, td
El texto de los elementos se extrae primero usando el text
método, y luego todo \\n
se reemplaza usando el replace
método. A continuación, se asigna el valor a la i+1
el elemento de table_headings
lista porque la i
El elemento ya está asignado.
Entonces, si el data
longitud del diccionario excede cero, agregamos el diccionario al table_details
lista. Puedes imprimir el table_details
lista 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 usando el json.dump
método aquí para escribir los valores en un archivo JSON llamado table.json
. Una vez completada la escritura, imprimimos Data saved to json file...
en la consola.
Ahora, ejecute el archivo usando el siguiente comando,
python run main.py
Después de un tiempo, podrá ver el texto Datos guardados en el archivo JSON... 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"
},
// ...
// ...
]
Ha implementado con éxito un web scraper utilizando Python. Para ver el código completo, puede visitar este Repositorio GitHub.
Conclusión
Este artículo discutió cómo podría implementar un simple raspado de Python. Discutimos cómo se podría usar BeautifulSoup para extraer datos rápidamente del 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 mirar estos marcos de web scraping.