El raspado web es uno de los mejores métodos de recopilación de datos para recopilar datos y crear conjuntos de datos personalizados sobre ellos.
Tener conjuntos de datos de alta calidad es esencial en esta era de toma de decisiones basada en datos. Si bien existen numerosos conjuntos de datos disponibles públicamente, a veces es posible que deba crear conjuntos de datos personalizados que satisfagan sus necesidades específicas. El raspado web le permite extraer datos de sitios web. Luego puede usar estos datos para crear su conjunto de datos personalizado.
Descripción general de los métodos de recopilación de datos
Existen diferentes métodos de recopilación de datos. Incluyen entrada manual de datos, API, conjuntos de datos públicos y web scraping. Cada método tiene sus ventajas y limitaciones.
La entrada manual de datos requiere mucho tiempo y es propensa a errores humanos, especialmente para la recopilación de datos a gran escala. Sin embargo, es útil para la recopilación de datos a pequeña escala y cuando los datos no están disponibles por otros medios.
Las API permiten a los desarrolladores acceder y recuperar datos de forma estructurada. Suelen proporcionar información actualizada periódicamente o en tiempo real. Sin embargo, el acceso a la API puede ser limitado, requerir autenticación o tener restricciones de uso.
Los conjuntos de datos públicos cubren una amplia gama de temas y dominios. Se recopilan previamente y, a menudo, vienen en un formato estructurado, lo que los hace fácilmente accesibles. Pueden ahorrar tiempo y esfuerzo cuando los datos requeridos se alinean con los conjuntos de datos disponibles. Sin embargo, es posible que no siempre cubran sus necesidades específicas o estén actualizados.
Web scraping proporciona una forma de recopilar datos de sitios web que no ofrecen API o tienen acceso limitado. Permite la personalización, la escalabilidad y la capacidad de recopilar datos de múltiples fuentes. Sin embargo, requiere habilidades de programación, conocimiento de la estructura HTML y cumplimiento de las pautas legales y éticas.
Elegir Web Scraping para la recopilación de datos
El raspado web le permite extraer información directamente de las páginas web, lo que le brinda acceso a una amplia gama de fuentes de datos. También le da control sobre qué datos extraer y cómo estructurarlos. Esto facilita la adaptación del proceso de raspado para cumplir con sus requisitos específicos y extraer la información precisa que necesita para su proyecto.
Identificación de la fuente de datos
El primer paso en el web scraping es identificar la fuente de datos. Este es el sitio web que contiene los datos que desea extraer. Al elegir la fuente de datos, asegúrese de alinearse con los términos de servicio de la fuente. Este artículo utilizará IMDb (Base de datos de películas de Internet) como fuente de datos.
Configuración de su entorno
Configurar un entorno virtual. Luego ejecute el siguiente comando para instalar las bibliotecas requeridas.
solicitudes de instalación pip beautifulsoup4 pandas
Usarás el peticiones biblioteca para realizar solicitudes HTTP. hermosa sopa4 para analizar contenido HTML y extraer datos de páginas web. Finalmente, utilizará pandas para manipular y analizar datos.
El código fuente completo está disponible en un repositorio GitHub.
Escribir el script de Web Scraping
Importe las bibliotecas instaladas en su script para poder usar las funciones que brindan.
importar peticiones
de bs4 importar HermosaSopa
importar tiempo
importar pandas como p.d.
importar re
El tiempo y re Los módulos son parte de la biblioteca estándar de Python. Por lo tanto, no requieren instalaciones separadas.
tiempo añadirá retrasos al proceso de raspado mientras re se ocupará de expresiones regulares.
Vas a use Beautiful Soup para raspar el sitio web de destino.
Cree una función que envíe una solicitud HTTP GET a su URL de destino. A continuación, debe recuperar el contenido de la respuesta y crear una HermosaSopa objeto del contenido HTML.
definitivamenteconseguir_sopa(url, parámetros=Ninguno, encabezados=Ninguno):
respuesta = solicitudes.get (url, params=params, headers=headers)
sopa = BeautifulSoup (respuesta.contenido, "html.parser")
devolver sopa
El siguiente paso es extraer información de la HermosaSopa objeto.
Para extraer la información, necesita comprender la estructura de su sitio web de destino. Esto implica inspeccionar el código HTML del sitio web. Esto lo ayudará a identificar los elementos y atributos que contienen los datos que desea extraer. Para inspeccionar su sitio web de destino, abra su enlace en un navegador web y navegue hasta la página web que contiene los datos que desea extraer.
Luego haga clic derecho en la página web y seleccione Inspeccionar del menú contextual. Esto abrirá las herramientas de desarrollo del navegador.
En el código HTML de la página web, busque elementos que contengan los datos que desea extraer. Preste atención a las etiquetas, clases y atributos HTML asociados con los datos que necesita. Los usará para crear selectores para extraer los datos usando BeautifulSoup. En la captura de pantalla de arriba puedes ver que el título de la película está dentro del lister-elemento-encabezado clase. Inspeccione cada función que desee extraer.
Cree una función que extraiga información de la HermosaSopa objeto. En este caso, la función busca el título, la clasificación, la descripción, el género, la fecha de estreno, los directores y las estrellas de la película utilizando las etiquetas HTML y los atributos de clase apropiados.
definitivamenteextract_movie_data(película):
titulo = pelicula.buscar("h3", clase_="lister-elemento-encabezado").encontrar("a").texto
calificación = movie.find("div", clase_="calificaciones-imdb-calificación").fuerte.texto
descripción = película.buscar("div", clase_="lister-elemento-contenido").encuentra todos("pag")[1].texto.tira()
género_elemento = película.buscar("durar", clase_="género")
género = género_elemento.texto.strip() si género_elemento demásNinguno
fecha_de_lanzamiento = película.buscar("durar", clase_="lister-item-year text-muted sin negrita").texto.tira()
director_estrellas = película.buscar("pag", clase_="texto silenciado").encuentra todos("a")
directores = [persona.texto para persona en director_estrellas[:-1]]
estrellas = [persona.texto para persona en director_estrellas[-1:]]
movie_data = {
"Título": título,
"Clasificación": calificación,
"Descripción": descripción,
"Género": género,
"Fecha de lanzamiento": fecha de lanzamiento,
"Directores": directores,
"Estrellas": estrellas
}
devolver movie_data
Finalmente, cree una función que haga el raspado real usando las dos funciones anteriores. Tomará el año y la cantidad máxima de películas que desea raspar.
definitivamentescrape_imdb_movies(año, límite):
url_base = " https://www.imdb.com/search/title"
encabezados = {"Aceptar-Idioma": "en-US, en; q=0.9"}
películas = []
empezar = 1
mientras len (películas) parámetros = {
"fecha de lanzamiento": año,
"clasificar": "num_votos, desc",
"comenzar": comenzar
}
sopa = get_soup (base_url, params=params, headers=headers)
movie_list = sopa.find_all("div", clase_="modo lister-item-avanzado")
si len (lista_películas) == 0:
romper
para película en movie_list:
movie_data = extract_movie_data (película)
películas.append (movie_data)
si len (películas) >= límite:
romper
empezar += 50# IMDb muestra 50 películas por página
tiempo de dormir(1) # Agregue un retraso para evitar abrumar al servidor
devolver películas
Entonces llame al def scrape_imdb_movies para hacer el raspado.
# Scrape 1000 películas estrenadas en 2023 (o tantas como estén disponibles)
películas = scrape_imdb_movies(2023, 1000)
Ahora ha extraído datos.
El siguiente paso es crear un conjunto de datos a partir de estos datos.
Creación de un conjunto de datos a partir de los datos raspados
Crear un DataFrame usando Pandas de los datos raspados.
df = pd. Marco de datos (películas)
Luego, realice el preprocesamiento y la limpieza de datos. En este caso, elimine las filas con valores faltantes. Luego extraiga el año de la fecha de lanzamiento y conviértalo en numérico. Eliminar columnas innecesarias. Convertir el Clasificación columna a numérico. Por último, elimine los caracteres no alfabéticos de la Título columna.
df = df.dropna()
df['Año de lanzamiento'] = df['Fecha de lanzamiento'].str.extraer(r'(\d{4})')
df['Año de lanzamiento'] = pd.to_numeric (df['Año de lanzamiento'],
errores='obligar').astype('Int64')
df = df.drop(['Fecha de lanzamiento'], eje=1)
df['Clasificación'] = pd.to_numeric (df['Clasificación'], errores='obligar')
df['Título'] = df['Título'].aplicar(lambda x: re.sub(r'\W+', ' ', X))
Almacene los datos en un archivo para usarlos más adelante en su proyecto.
df.a_csv("imdb_movies_dataset.csv", índice=FALSO)
Finalmente, imprima las primeras cinco filas de su conjunto de datos para tener una vista de cómo se ve.
df.cabeza()
La salida es como se muestra en la siguiente captura de pantalla:
Ahora tiene un conjunto de datos obtenido a través del web scraping.
Web Scraping usando otras bibliotecas de Python
Beautiful Soup no es la única biblioteca de Python que puede usar para el web scraping. Hay otras bibliotecas por ahí. Cada uno con sus propias ventajas y limitaciones. Investíguelos para averiguar cuál se adapta mejor a su caso de uso.