Guía para principiantes para aprender web scraping y visualización de datos con Python

Guías, Python, Scraping, Dic-19-20215 minutos de lectura

¿Cómo extraer información significativa de los sitios web de forma rápida y eficaz? Extraer los datos manualmente lleva mucho tiempo. Puede utilizar el web scraping, un método automatizado para obtener datos no tabulares o poco estructurados de sitios web. Después, puedes convertir esos datos en un formato estructurado y utilizable, como una hoja de cálculo.

Índice

¿Cómo extraer información significativa de los sitios web de forma rápida y eficaz? Extraer los datos manualmente lleva mucho tiempo. Puede utilizar el web scraping, un método automatizado para obtener datos no tabulares o poco estructurados de sitios web. Después, puedes convertir esos datos en un formato estructurado y utilizable, como una hoja de cálculo o un archivo .csv.

El web scraping permite archivar datos y realizar un seguimiento de los cambios de datos en línea. Las empresas lo utilizan ampliamente con distintos fines. Por ejemplo, las tiendas online lo utilizan para rastrear los precios de sus competidores y las páginas de acceso público. Después, utilizan esta información para ajustar sus precios. Otra práctica habitual del web scraping es el scraping de contactos, en el que las organizaciones recopilan datos personales como números de teléfono o direcciones de correo electrónico con fines de marketing. 

¿Por qué se utiliza el Web Scraping?

¿Por qué hay que extraer grandes cantidades de información de las páginas web? Para entenderlo, fíjese en las siguientes aplicaciones del web scraping.

  • Investigación y desarrollo - Puede recopilar grandes conjuntos de datos (temperatura, información general, etc.) de sitios web y analizarlos para realizar encuestas con fines de investigación y desarrollo.
  • Comparación de precios - Empresas y servicios como ParseHub utilizan el web scraping para recopilar datos de sitios web de compras en línea y comparar los precios de los productos.
  • Listados de empleo - Puede utilizar el web scraping para recopilar información sobre ofertas de empleo y entrevistas de diferentes sitios web y listarlas en un único lugar. 
  • Raspado de redes sociales: puede utilizar el raspado web para recopilar datos de sitios web de redes sociales como Instagram o Twitter y averiguar qué es tendencia.
  • Recopilación de direcciones de correo electrónico - Muchas empresas utilizan el correo electrónico como medio de marketing. Utilizan el web scraping para recopilar ID de correo electrónico y luego enviar correos electrónicos de forma masiva.

Web Scraping con Python

Puede extraer datos de sitios web siguiendo los pasos que se indican a continuación.

  • Obtenga la URL que desea raspar
  • Inspeccionar la página
  • Encuentre los datos que debe extraer
  • Escriba el código
  • Ejecutar el código y extraer los datos
  • Almacenar los datos en el formato deseado

Las librerías que podemos utilizar para web scraping en Python son:

Pandas - Pandas se utiliza para manipular y analizar los datos. Puede utilizar esta biblioteca para extraer los datos y almacenarlos en el formato requerido.

Beautiful Soup - Es un paquete de Python para analizar documentos HTML y XML. Crea árboles de análisis que son útiles en la fácil extracción de datos de sitios web.

Requests - Es una simple librería HTTP.

Utilizaremos este sitio para extraer el número de casos de COVID. Después, analizaremos los datos y crearemos algunas visualizaciones.

Bibliotecas de importación

Puede importar requests y BeautifulSoup en Python para el web scraping, como se muestra a continuación.

importar peticiones 
from bs4 import BeautifulSoup

URL para la extracción de datos

Especifique la URL del sitio web del que tiene que extraer los datos. Tienes que usar el método requests.get() para enviar una petición GET a la URL especificada. Además, tienes que crear un constructor BeautifulSoup que tomará los dos argumentos de cadena como se muestra en el código siguiente.

url = 'https://www.worldometers.info/coronavirus/countries-where-coronavirus-has-spread/'
página = requests.get(url) 
soup = BeautifulSoup(página.texto, 'html.parser') 
  
datos = []

Raspe cada elemento

Puede raspar cada elemento de la tabla URL'sURL utilizando el método soup.find_all(). Devuelve un objeto que ofrece acceso basado en índices a las ocurrencias encontradas y puede imprimirse utilizando un bucle for o while.

data_iterator = iter(soup.find_all('td'))

Utilizar un bucle

Puedes utilizar un bucle while True que se repita hasta que haya datos disponibles en el iterador.

while True: 
   try: 
        country = next(data_iterator). text 
        confirmados = siguiente(data_iterator). text 
        muertes = siguiente(data_iterator). text 
        continente = siguiente(data_iterator).text

Para las columnas "confirmados" y "fallecidos", asegúrese de eliminar las comas y convertir a int. 

data.append(( 
            país, 
            (confirmados.replace(',', '')), 
            (fallecidos.replace(',', ' ')), 
            continente
        )) 
    
    excepto StopIteration: 
       break

Cuando el número de elementos que quedan por iterar sea cero, se producirá el error StopIteration.

Crear un marco de datos Pandas

Puede extraer los datos del sitio web después de ejecutar el código anterior. Tienes que crear un marco de datos Pandas para analizar los datos más a fondo. En el código siguiente, ordenamos los datos por el número de casos de COVID confirmados.

Importe la biblioteca pandas para crear un marco de datos.

data.sort(key = lambda fila: fila[1], reverse = True)
importar pandas como pd
df = pd.DataFrame(data,columns=['país','Número de casos','Fallecimientos','Continente'],dtype=float)
df.head()
df[' Número de casos'] = [x.replace(',', '') for x in df['Número  de casos']]
df[' Número de casos'] = pd.to_numeric(df['Número de casos'])
df

Obtendrá el siguiente resultado:

Para obtener información sobre Dataframe, utilice df.info().

df.info()

Crear columna Death_rate

Crearemos una nueva columna llamada Death_rate como se muestra a continuación.

dff = df.sort_values(by ='Número de casos',ascendente = Falso)
dff['Tasa de mortalidad '] = (dff['Fallecimientos'/dff['Número de casos'])*100
dff.head()

La salida es como.

Web Scraping con Proxies

Un servidor proxy le permite utilizar una dirección IP única para acceder a la información que desea extraer. De este modo, el sitio web no ve su dirección IP real, lo que le permite raspar datos de forma anónima. Debes utilizar proxies para el web scraping por las siguientes razones.

  • Puedes enviar múltiples peticiones simultáneas a un servidor web sin ser baneado utilizando un pool de proxies.
  • Con la ayuda de proxies, puede realizar solicitudes desde una ubicación, dispositivo, ISP o red móvil concretos. También puedes rastrear contenidos mostrados para una zona o dispositivo concretos.
  • Algunos sitios web tienen prohibiciones de IP, y puedes eludirlas con la ayuda de proxies. 

Tipos de proxies para Web Scraping

Puede utilizar los dos proxies siguientes para extraer datos de sitios web.

  • Proxies de centros de datos - Las direcciones IP de los centros de datos son las direcciones IP de los servidores. Los servidores están ubicados en centros de datos. El objetivo principal de los proxies de centros de datos es ocultar su dirección a los sitios web que rastrea. Estos proxies se utilizan principalmente para rastrear datos empresariales.
  • Proxies residenciales - Las direcciones IP residenciales son más caras que las IP de los centros de datos y son difíciles de conseguir. Estos proxies le permiten elegir una ubicación específica, es decir, ciudad, país, etc. y navegar por la web como un usuario real en esa zona geográfica.

Visualización de datos con Python

Ya sabes que la visualización de datos es la representación gráfica de datos o información. Puedes utilizar herramientas visuales como tablas, mapas y gráficos como una forma accesible de entender los datos representados. Veamos cómo podemos visualizar los datos extraídos de este sitio web utilizando herramientas de visualización de datos.

Bibliotecas de importación

Tienes que importar las siguientes librerías para visualizar los datos como se muestra a continuación.

import seaborn como sns
import matplotlib.pyplot como plt
from pylab import rcParams

Trazado de un gráfico de pares

Puede trazar un gráfico de pares para demostrar las relaciones entre pares en un conjunto de datos. Puede implementarlo fácilmente utilizando el código siguiente e identificar tendencias en los datos para un análisis posterior.

rcParams['figure.figsize'] = 15, 10
from matplotlib.pyplot import figura
figure(num=None, figsize=(20, 6), dpi=80, facecolor='w', edgecolor='k')
sns.pairplot(dff,hue='Continente')

Obtendrá la salida como.

Trazado de un diagrama de barras

Puede trazar un diagrama de barras que muestre datos categóricos como barras rectangulares y compare los valores de diferentes categorías en los datos. 

sns.barplot(x = 'país',y = 'Número de casos',data = dff.head(10))

La salida es como.

Trazado de un gráfico de dispersión

Puedes entender la relación entre valores numéricos utilizando un gráfico de dispersión. Utiliza puntos para representar la relación entre variables. 

sns.scatterplot(x = "Número de casos", y = "Defunciones",hue = "Continente",data = dff)

La salida es como.

Agrupar y ordenar los datos

En el código siguiente, agruparemos los datos por continente y los ordenaremos por el número de casos COVID.

dfg = dff.groupby(by = 'Continent',as_index = False).agg({'Number of cases':sum,'Deaths':sum})
dfgg = dfg[1:]
df1 = dfgg.sort_values(by = 'Number of cases',ascending = False)
df1['Death_rate'] = (df1['Deaths']/df1['Number of cases'])*100
df1.sort_values(by = 'Death_rate',ascending = False)

La salida es como.

Ahora, trazaremos un diagrama de barras entre "Continente" y "Tasa_de_muerte" como se muestra a continuación.

sns.barplot(x = 'Continente',y = 'Tasa de mortalidad',data = df1.sort_values(by = 'Tasa de mortalidad',ascending = False))

La salida es como.

Este diagrama de barras muestra que, entre todos los países, la tasa de mortalidad es la más alta en Sudamérica y la más baja en Australia. 

Importar tabla de texto

Instale texttable para crear una tabla ASCII simple. A continuación, importarlo como tt.

pip install texttable

importar texttable como tt

Crear un objeto tabla de texto

Tienes que crear un objeto tabla de texto como se muestra a continuación. Hay que añadir una fila vacía al principio de la tabla para los encabezados y alinear las columnas.

tabla = tt.TablaTexto() 

table.add_rows([(None, None, None, None)] + data) table.set_cols_align(('c', 'c', 'c', 'c'))  # ' l ' indica izquierda, 'c ' indica centro y 'r ' indica derecha 
table.header((' País ', ' Número de casos ', ' Defunciones ', ' Continente ')) 
  
print(tabla.dibujar())

Aquí, la salida representa algunas de las filas de la tabla como.

Conclusión

Con el web scraping, puede extraer grandes cantidades de datos de sitios web de forma rápida y eficaz. Puede convertir los datos no estructurados extraídos en un formato utilizable como un archivo .csv. Vimos que podemos raspar los datos de la web mediante el uso de dos módulos es decir, Pandas y BeautifulSoup. Los proxies permiten extraer los datos de la web de forma anónima. Puedes utilizar proxies de centro de datos o proxies residenciales para el web scraping. Los proxies residenciales son más fiables pero más caros que los proxies de centros de datos. Además, podemos realizar análisis de datos para obtener información útil en función de nuestras necesidades. En este artículo, analizamos los datos utilizando herramientas de visualización de datos como diagramas de barras, diagramas de pares y diagramas de dispersión.